关于嵌入式C程序代码,#define LCM_WrReg(a) (*((volatile u16 *)0x38000000)) = a LCM_WrReg(0x0009);
#define LCM_WrData(a) (*((volatile u16 *)0x38000002)) = a
void LCM_DispIni5(void)
{
//Start Initial Sequence
LCM_WrReg(0x0001);LCM_WrData(0x0100);
LCM_WrReg(0x0002);LCM_WrData(0x0700);
LCM_WrReg(0x0003);LCM_WrData(0x0030);
LCM_WrReg(0x0008);LCM_WrData(0x0302);
LCM_WrReg(0x0009);LCM_WrData(0x0000);
LCM_WrReg(0x000a);LCM_WrData(0x0000);
}
前面的两个是宏替换,但是后面重复使用
LCM_WrReg(*);LCM_WrData(*);
会不会覆盖原有数据啊!
看不懂啊,在线等!!!!求大神!!
(LCD程序的部分代码!)
还有前面两行的宏替换也没看懂。。。
求高手!!! 展开
这个应该是用操作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。
看完你的解释以后一下就了解了!
但是还有点不知道就是,在控制显示的时候,对0x0020,0x0021写入x,y坐标。
LCM_WrReg(0x0020);LCM_WrData(x);
LCM_WrReg(0x0021);LCM_WrData(y);
要显示的数据写入0x0022寄存器。
是用for循环控制,重复对不同坐标写入不同值,都在这三个寄存器里!
这样不会冲突么!?
难道LCD显示的时候每次写入都会保存?
不然重复对一个寄存器写那还是冲突了啊。
望解答!谢!
写液晶的显示数据(像素),一般是向液晶的GRAM里写数据,GRAM的内存地址是随着你像素值的写入自动增加的,一开始写X\Y坐标是确定一个起始点,而后你每写一个像素后,GRAM内部的X++(自动);写到水平的末端(X==320),X返回你设定的初始值(自动),Y++(自动),也就是控制换行了;从左到右,从上往下。有一些液晶里可以控制GRAM自动变化的方式,可以是先从上到下,再从左到右(即Y++,->Y==240,->Y返回初始值,->X++)。有一些液晶还可以设置水平的末端和垂直的末端,也就是设定一个显示矩形的左上角和右下角的两个对角线的点,这样你在液晶的中间的位置显示一个比较的小图片的时候,就比较好操作了,这样你就可以一个一个写像素了,液晶内部自己换行换列,你不用每次都自己换行(Y)了,因为小图片可能不需要写到X的最末端。
液晶驱动IC的设计,主要还是为了满足用户的需要了,这种设计可以减少大量的写起始点(X、Y)的操作。