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

#defineLCM_WrReg(a)(*((volatileu16*)0x38000000))=a#defineLCM_WrData(a)(*((volatileu16... #define LCM_WrReg(a) (*((volatile u16 *)0x38000000)) = a
#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程序的部分代码!)
还有前面两行的宏替换也没看懂。。。
求高手!!!
展开
 我来答
宋风合
2012-07-06
知道答主
回答量:11
采纳率:0%
帮助的人:20.9万
展开全部

这个应该是用操作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)的操作。
xiaosi_show
2012-07-03 · 超过12用户采纳过TA的回答
知道答主
回答量:53
采纳率:0%
帮助的人:33万
展开全部
表示不断的给0x38000000 这个地址写值,写的值应该是控制LCD对应的某一位,可能是设置高电平,再拉低,这个具体的要去自己去看芯片手册。
追问

可我找的资料都比较尴尬,我选用的是STR912的芯片,LCD型号是YM280T-003ET

电路图如图所示。

为什么要分别对0x38000000和0x38000002写值啊!

看它貌似第一个是寄存器地址,第二个是寄存器的值。

 

 

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chenpaul914
2012-07-04 · TA获得超过556个赞
知道小有建树答主
回答量:265
采纳率:0%
帮助的人:248万
展开全部
重复使用没关系, macro只会在compile之前被替换成需要的字符
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式