关于嵌入式C程序代码,#define LCM_WrReg(a) (*((volatile u16 *)0x38000000)) = a LCM_WrReg(0x0009);

2025年03月19日 09:19
有3个网友回答
网友(1):

这个应该是用操作SDRAM的方式来操作LCM,实际是将LCM的引脚映射到内存地址上

,你这个LCM跟CPU应该是用并行方式连接的。我看过你的这个液晶的手册HX8347。这个过程描述的是2个字节的comand过程,

LCM_WrReg(0x0001)表面上看是在内存的0x38000000地址写入0x0001,实际上你的板子上内存没有这个地址,你选中0x38000000地址的时候,是会把LCM总线的引脚设置为写CMD的状态,同时数据总线上是0x0001,结果就是把0x0001当做CMD写入了LCM(选中0x0001寄存器)。同理,LCM_WrData(0x0100)就是把0x0100当做PA1写入了LCM(写入寄存器的值0x0100)。

LCM_WrReg(a)与LCM_WrData(a)区别在于,前者的BIT1是0,后者BIT1是1,这就表示地址总线的bit1,接到了DNC_SCL这个引脚上,这个引脚就是控制CMD和parameter的,手册上有写当

DNC_SCL是LOW代表CMD,DNC_SCL是HIGH代表parameter。

总起来说,你看到写两个内存地址,其实是在控制LCM的引脚,0x38000000地址上并没有有效的物理内存;你看到两个内存地址不同,是要控制DNC_SCL的引脚电平不同,因为我们要先写CMD,而后写parameter,两者的区分就是通过DNC_SCL。

网友(2):

表示不断的给0x38000000 这个地址写值,写的值应该是控制LCD对应的某一位,可能是设置高电平,再拉低,这个具体的要去自己去看芯片手册。

网友(3):

重复使用没关系, macro只会在compile之前被替换成需要的字符