大哥大姐帮指导一下12864,驱动为st7920的lcd光标显示移位问题

[复制链接]
6187|3
 楼主| ccjchen 发表于 2007-4-28 14:05 | 显示全部楼层 |阅读模式
我的程序中应该怎么实现光标左移,右移,并且在所到移位处删除对应字符的功能呢?
 楼主| ccjchen 发表于 2007-4-29 14:59 | 显示全部楼层

各位大虾给提示一下啊!刚入行不久,我第一次用lcd

我真的不知道该怎么写啊,下面是我在网上下的程序,哪位给写一下光标的移位程序,不胜感激!<br />//12864(ST7920)串口C51程序<br /><br />//12864F(7920)的串行模式C51范例<br />#include&nbsp;&ltreg51.h&gt<br />#include&nbsp;&ltintrins.h&gt<br />sbit&nbsp;E_CLK&nbsp;=P3^0;//clock&nbsp;input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同步时钟输入端<br />sbit&nbsp;RW_SID=P3^1;//data&nbsp;input/output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;串行数据输入、输出端<br />//sbit&nbsp;RS_CS&nbsp;=P3^5;//chip&nbsp;select&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;片选端<br />//sbit&nbsp;PSB&nbsp;&nbsp;&nbsp;=P3^6;//serial&nbsp;mode&nbsp;select&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;串口模式<br />sbit&nbsp;RST&nbsp;&nbsp;&nbsp;=P1^2;<br />void&nbsp;delay(unsigned&nbsp;int&nbsp;n)<br />{<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;for(i=0;&nbsp;i&ltn;&nbsp;i++)&nbsp;{;}<br />}<br />&nbsp;//串行发送一字节数据<br />void&nbsp;SendByte(unsigned&nbsp;char&nbsp;dat)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E_CLK=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dat&0x80)RW_SID=1;else&nbsp;RW_SID=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E_CLK=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat=dat&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />//串行接收一字节数据<br />unsigned&nbsp;char&nbsp;ReceieveByte(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,d1,d2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E_CLK=0;delay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E_CLK=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RW_SID)d1++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d1=d1&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E_CLK=0;delay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E_CLK=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RW_SID)d2++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d2=d2&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(d1&0xF0+d2&0x0F);<br />}<br />//读取标志位BF<br />bit&nbsp;ReadBF(bit&nbsp;bf)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;dat;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendByte(0xFA);//11111,01,0&nbsp;RW=1,RS=0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat=ReceieveByte();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dat&gt0x7F)bf=1;else&nbsp;bf=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />//写控制命令<br />void&nbsp;SendCMD(unsigned&nbsp;char&nbsp;dat)<br />{<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(ReadBF){;}<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RS_CS=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendByte(0xF8);//11111,00,0&nbsp;RW=0,RS=0&nbsp;同步标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendByte(dat&0xF0);//高四位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendByte((dat&0x0F)&lt&lt4);//低四位<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RS_CS=0;<br />}<br />//写显示数据或单字节字符<br />void&nbsp;SendDat(unsigned&nbsp;char&nbsp;dat)<br />{<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(ReadBF){;}<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RS_CS=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendByte(0xFA);//11111,01,0&nbsp;RW=0,RS=1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendByte(dat&0xF0);//高四位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendByte((dat&0x0F)&lt&lt4);//低四位<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RS_CS=0;<br />}<br />/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;写汉字到LCD&nbsp;指定的位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x_add显示RAM的地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat1/dat2显示汉字编码<br />*/<br />void&nbsp;display(unsigned&nbsp;char&nbsp;x_add,unsigned&nbsp;char&nbsp;dat1,unsigned&nbsp;char&nbsp;dat2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendCMD(x_add);//1xxx,xxxx&nbsp;设定DDRAM&nbsp;7位地址xxx,xxxx到地址计数器AC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDat(dat1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDat(dat2);<br />}<br />//初始化&nbsp;LCM<br />void&nbsp;initlcm(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RST=0;<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RS_CS=0;<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PSB=0;//serial&nbsp;mode<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RST=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendCMD(0x30);//功能设置,一次送8位数据,基本指令集<br />&nbsp;&nbsp;&nbsp;&nbsp;SendCMD(0x0C);//0000,1100&nbsp;&nbsp;整体显示,游标off,游标位置off<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendCMD(0x01);//0000,0001&nbsp;清DDRAM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendCMD(0x02);//0000,0010&nbsp;DDRAM地址归位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendCMD(0x80);//1000,0000&nbsp;设定DDRAM&nbsp;7位地址000,0000到地址计数器AC<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendCMD(0x04);//点设定,显示字符/光标从左到右移位,DDRAM地址加&nbsp;一<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendCMD(0x0F);//显示设定,开显示,显示光标,当前显示位反白闪动<br />}<br /><br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initlcm();<br />  for(;;)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}
hqgboy 发表于 2007-4-29 16:25 | 显示全部楼层

常常

我的程序中应该怎么实现光标左移,右移,并且在所到移位处删除对应字符的功能呢?<br />----------------------------------<br /><br />左移,右移就是修改坐标,重新显示。<br />删除同样,修改坐标,刷为空白就可以。<br />
 楼主| ccjchen 发表于 2007-4-29 18:31 | 显示全部楼层

修改坐标固然可以,但是:

我的st7920光标移动是以整个汉字所占的单元,可是怎么才能使光标只占据一个英文字符的单元呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

446

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部