




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、首先说一下关于驱动函数的书写,这些是液晶显示的基础, 一般包括四个函数: 1、写命令函数; 2、写数据函数; 3、读状态函数; 4、读数据函数。这四个函数并不是必须全部写的,具体要看你实现的功能,如果只是单纯的显示汉字和字符,写命令、写数据、读状态这三个函数就够了,如过你还需要进行一些绘图的操作,那读数据函数也必须书写。另外关于读状态函数,其实也就是用于判忙操作,我看郭天祥的书里面是这样说的:原则上每次对控制器进行读写操作之前,都必须进行读写检测,由于单片机的操作速度慢于液晶控制器的反应速度,因此可不进行读写检测,或者只进行简短的延时即可。因此,读状态函数也可以不写,只用简短的延时函数替换即可。1、写操作的编写:由图可见操作很简单:1RS=1(写数据操作);或者RS=0(写命令操作);2RW=0;/指明为写操作3E=1;4DB=data;/data为你要写入的命令或数据值5E=0;以下是我的驱动函数,仅供参考:1. /*液晶端口定义*/2. #definelcd_data P0 /数据口3. sbitRS = P24; /选择寄存器(并行) 0:指令寄存器 1:数据寄存器;4. sbitRW = P25; /读写控制脚(并行) 0:写入 1:读出5. sbitE = P26; /读写数据启始脚(并行)6. sbitPSB = P21; /串并方式选择引脚,0为串行模式,1为8/4位数据口模式7. sbitRST = P23; /复位引脚8.9. /*10. /延时函数11. /*12. void delay(unsigned int k)13. 14. unsigned int i;15. unsigned char j;16. for(i=0;ik;i+)17. 18. for(j=0;j0;x-)28. for(y=121;y0;y-);29. 30. /*31. /写命令函数32. /*33. void LcdWcom(unsigned char WCom)34. 35. delay(1);36. RS=0;/指明操作对象为指令寄存器37. RW=0; /指明为写操作38. E=1;39. lcd_data=WCom; /将命令写入总线40. E=0;41. 42. /*43. /写数据函数44. /*45. void LcdWdata(unsigned char WData)46. 47. delay(1);48. RS=1; /指明操作对象为数据寄存器49. RW=0; /指明为写操作50. E=1;51. lcd_data=WData; /将数据写入总线52. E=0;53. 二、初始化操作初始化操作如下:1芯片上电;2延时40ms以上;3复位操作:RST出现一个上升沿(RST=1;RST=0;RST=1;);4功能设定;5延时100us以上;6再次进行功能设定;7延时37us;8显示开关控制;9延时100us以上;10清除显示;11延时10ms以上;12进入点设置;13初始化结束;这里我遇到了一个小问题,我的液晶按照这个顺序进行初始化结果不正确,无法显示,最后我把调整了一下就可以了,调整后的顺序为:清除显示进入点设置显示开关控制,不知道是什么原因,知道的告诉我一声54. /*55. /显示初始化函数56. /*57. void Display_Init(void)58. 59. delay_ms(45); /延时45ms60. PSB=1; /8位并行口61. /复位操作62. RST=1;delay(1);63. RST=0;delay(1);64. RST=1;delay(1);65. /功能设定66. LcdWcom(0x30); /设置为8位并行口,基本指令集67. delay(10);68. LcdWcom(0x30); /再次设置为8位并行口,基本指令集69. delay(5);70. / /显示开关控制71. / LcdWcom(0x0c); /游标显示关,正常显示,整体显示开72. / delay(10);73. /清除显示74. LcdWcom(0x01);75. delay_ms(12); /延时12ms76. /进入点设置77. LcdWcom(0x06); /设置为游标右移,DDRAM位地址加1,画面不移动78. delay(5);79. LcdWcom(0x0C); /开显示80. 三、显示基本的字符和汉字1、要想显示汉字或字符,首先要确定显示的位置,看看芯片说明书上关于屏幕地址的分配:由于此液晶为128*64,即是横向128个点,竖向64个点,由于该液晶控制器支持的字符为8*16,汉字为16*16,因此只能显示四行,如果是汉字,为每行显示8个,如果是字符,每行显示16个。由上图设置DDRAM地址的指令可知,最高位为1,余下7位为地址值,因此就对应了为什么起始地址为80H的原因(即对应的写地址指令为1000 0000);因此如果你要设定显示的地址为第一行的第一个位置,只需要调用写指令函数,写入0x80即可。存在的问题:参考网上的程序及在试验过程中发现,实际能显示出来的地址分布式这样的0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87 /第一行汉字位置 0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97 /第二行汉字位置 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f /第三行汉字位置 0x98 0x99 0x9a 0x9b 0x9c 0x9d 0x9e 0x9f /第四行汉字位置百思不得其解,尤其让人受不了的是居然是第一行和第三行地址接续,而不是第二行,有明白的高手给讲解一下设定DDRAM地址参考程序:81. /*82. /设置光标函数83. /参数说明:x为行号,y为列号84. /*85. void Set_Cursor(unsigned char x, unsigned char y)86. 87. unsigned char i;88. switch(x)/确定行号89. 90. case 0x00: i=0x80; break;/第一行91. case 0x01: i=0x90; break;/第二行92. case 0x02: i=0x88; break;/第三行93. case 0x03: i=0x98; break;/第四行94. default : break;95. 96. i = y+i;/确定列号97. LcdWcom(i);/写地址98. 复制代码2、显示字符由数据手册可查看可以显示的字符及其显示码:因此,当你设置好所要显示的光标位置后,即可调用写数据函数,写入对应相应字符的显示码,比如要显示!就应该写入0x21。99. /*100. /显示字符函数101. /*102. void Display_Char(unsigned char Alphabet)103. 104. delay(1);105. LcdWdata(Alphabet); /写入需要显示字符的显示码106. 显示!实例:107. /*显示单个字符*/108. Set_Cursor(0,0); /光标地址设定109. Display_Char(0x21); /显示字符!扩展程序:在指定位置显示字符串110. /*111. /指定位置显示字符串函数112. /参数说明:x为行号,y为列号113. /*114. void Display_String(unsigned char x,unsigned char y,unsigned char *Alphabet)115. 116. unsigned char i=0;117. Set_Cursor(x,y); /设置显示的起始地址118. while(Alphabeti!=0)119. 120. LcdWdata(Alphabeti); /写入需要显示字符的显示码121. i+;122. 123. 显示字符串实例:124. /*显示字符串*/125. Display_String(1,0,WWW.CEPARK.COM); /显示字符串3、显示汉字因为一个汉字占用两个字节的大小,因此要想显示一个汉字,需要进行两个数据写入操作。所支持的8192个16*16的汉字详见数据手册附录中的ST7920GB中文字型码表。126. /*127. /指定位置显示汉字函数128. /参数说明:x为行号,y为列号129. /*130. void Display_HZ(unsigned char x,unsigned char y,unsigned char *HZ)131. 132. Set_Cursor(x,y); /设置显示的起始地址133. LcdWdata(HZ0); /写入需要显示汉字的高八位数据134. LcdWdata(HZ1); /写入需要显示字符的低八位数据135. 显示汉字实例:136. /*显示汉字*/137. Display_HZ(0,1,电); /显示电138. Display_HZ(0,2,子); /显示子139. Display_HZ(0,3,园); /显示园扩展程序:140. /*141. /指定位置显示一行汉字函数,可自动换行142. /参数说明:x为行号,y为列号143. /*144. void Display_HZ_Line(unsigned char x,unsigned char y,unsigned char *HZ)145. 146. unsigned char i=0;147. Set_Cursor(x,y); /设置显示的起始地址148. while(HZi!=0)149. 150. LcdWdata(HZi+); /写入需要显示汉字的高八位数据151. LcdWdata(HZi+); /写入需要显示字符的低八位数据152. if(y+i)%16=0) /如果满一行153. 154. x+;155. if(x=4) /如果满一屏156. x=0;157. Set_Cursor(x,0); /重新设置显示的起始地址158. 159. 160. 显示一行汉字实例:161. /*显示一行汉字*/162. Display_HZ_Line(2,0,欢迎转载,转载请注明出处,谢谢!);/显示一行汉字再来一个整体的现实效果163. /*164. /说明:程序主函数165. /*166. void main(void)167. 168. /*液晶初始化*/169. Display_Init();170. /*显示单个字符*/171. Set_Cursor(0,0); /光标地址设定172. Display_Char(0x21); /显示字符!173. /*显示字符串*/174. Display_String(1,0,WWW.CEPARK.COM); /显示字符串175. /*显示汉字*/176. Display_HZ(0,1,电); /显示电177. Display_HZ(0,2,子); /显示子178. Display_HZ(0,3,园); /显示园179. /*显示一行汉字*/180. Display_HZ_Line(2,0,欢迎转载,转载请注明出处,谢谢!);/显示一行汉字181. while(1);182. 四、关于CGRAM的使用:可以参考这个网站的程序: http:/bbs.友好站点,请勿转贴.com/ShowTopic.aspx?id=81220 ST7920自行产生RAM提供使用者图像定义(造字)功能,可以提供四组16*16点的自定义图像空间,使用者可以将内部自行没有提供的图像自行定义到CGRAM中,便可以通过DDRAM显示在液晶屏上。注意:网上介绍说ST7920芯片同屏幕不能显示4个以上自定义汉字(用CGRAM)。显示CGRAM字型:将16位元资料写入DDRAM中,一共有0000H,0002H,0004H,0006H四种编码。操作步骤:1设置为扩充指令集;2设置SR=O,允许设定CGRAM地址;3设置为基本指令集;4循环执行以下操作写入16个字节数据(设定CGRAM的存储地址;写入自定义数据);5设置DDRAM地址6写入显示CGRAM显示码CGRAM参考程序:183. /*184. /设置CGRAM字库185. /ST7920 CGRAM(用户自定义图标)空间分布186. /空间1地址:40H4FH共16个地址,一个地址对应两个字节数据;对应调用码:0000H187. /空间2地址:50H5FH共16个地址,一个地址对应两个字节数据;对应调用码:0002H188. /空间3地址:60H6FH共16个地址,一个地址对应两个字节数据;对应调用码:0004H189. /空间4地址:70H7FH共16个地址,一个地址对应两个字节数据;对应调用码:0006H190. /参数说明:num为空间编号,CGRAM_ZIKU为地址指针191. /*192. void SET_CGRAM(unsigned char num,unsigned char *CGRAM_ZIKU)193. 194. unsigned char i,add;195. LcdWcom(0x34); /再次设置为8位并行口,扩展指令集196. LcdWcom(0x02); /SR=0,允许设置CGRAM地址197. LcdWcom(0x30); /恢复设置为8位并行口,基本指令集198. add=(num4)|0x40; /计算CGRAM的首地址199. for(i=0;i设置为扩充指令集,关闭绘图模式;2写两字节的GDRAM地址,先写垂直地址,后写水平地址地址;3写入两字节的数据,先写高八位数据,后写低八位数据;4打开绘图模式;5设置回基本指令集;227. /*228. /填充GDRAM数据:229. /参数:dat为填充的数据230. /*231. void GUI_Fill_GDRAM(unsigned char dat)232. 233. unsigned char i; 234. unsigned char j;235. unsigned char k;236. unsigned char bGDRAMAddrX = 0x80;/GDRAM水平地址237. unsigned char bGDRAMAddrY = 0x80;/GDRAM垂直地址238. for(i=0;i2;i+) 239. 240. for(j=0;j32;j+) 241. 242. for(k=0;k确定打点的位置;2读出该点所在的数据值;3修改该点相应的位的值,对于单色液晶来说,只有两种操作,已是点亮该点,二是熄灭该点;4将修改后的数据值写入对应的地址;由于打点首先需要进行读操作,因此需要编写读数据的驱动函数:读操作的编写:时序图:操作如下:1释放总线:DB=0;2RS=1(读数据操作);或者RS=0(读状态操作);3RW=1;/指明为读操作4E=1;5data=DB;/data为存储读回数据的变量6E=0;读操作参考程序:257. /*258. /读数据函数259. /*260. unsigned char LcdRdata(void)261. 262. unsigned char LcdData;263. lcd_data=0xff; /释放数据线264. RW=1; /指明为读操作265. RS=1; /指明操作对象为数据寄存器266. E=1;267. delay(1);268. LcdData = lcd_data; /读取数据线上的数据269. E=0;270. return (LcdData); 271. 打点参考程序:272. /*273. /打点函数274. /参数:color=1,该点填充1;color=0,该点填充白色0;275. /*276. void GUI_Point(unsigned char x,unsigned char y,unsigned char color)277. 278. unsigned char x_Dyte,x_byte; /定义列地址的字节位,及在字节中的哪1位279. unsigned char y_Dyte,y_byte; /定义为上下两个屏(取值为0,1),行地址(取值为031)280. unsigned char GDRAM_hbit,GDRAM_lbit;281.282. LcdWcom(0x36); /扩展指令命令283. /*X,Y坐标互换,即普通的X,Y坐标*/284. x_Dyte=x/16; /计算在16个字节中的哪一个285. x_byte=x&0x0f; /计算在该字节中的哪一位286. y_Dyte=y/32; /0为上半屏,1为下半屏287. y_byte=y&0x1f; /计算在031当中的哪一行288. 289. LcdWcom(0x80+y_byte); /设定行地址(y坐标),即是垂直地址290. LcdWcom(0x80+x_Dyte+8*y_Dyte); /设定列地址(x坐标),并通过8*y_Dyte选定上下屏,即是水平地址291. 292. LcdRdata(); /预读取数据293. GDRAM_hbit=LcdRdata(); /读取当前显示高8位数据294. GDRAM_lbit=LcdRdata(); /读取当前显示低8位数据295. delay(1);296. 297. LcdWcom(0x80+y_byte); /设定行地址(y坐标)298. LcdWcom(0x80+x_Dyte+8*y_Dyte); /设定列地址(x坐标),并通过8*y_Dyte选定上下屏299. delay(1);300.301. if(x_byte8) /判断其在高8位,还是在低8位302. 303. if(color=1)304. 305. LcdWdata(GDRAM_hbit|(0x01(7-x_byte); /置位GDRAM区高8位数据中相应的点306. 307. else308. LcdWdata(GDRAM_hbit&(0x01(7-x_byte); /清除GDRAM区高8位数据中相应的点309. LcdWdata(GDRAM_lbit); /显示GDRAM区低8位数据310. 311. else312. 313. LcdWdata(GDRAM_hbit);314. if(color=1)315. LcdWdata(GDRAM_lbit|(0x01(15-x_byte); /置位GDRAM区高8位数据中相应的点316. else317. LcdWdata(GDRAM_lbit&(0x01x1) / 对x0、x1大小进行排列,以便画图333. 334. bak = x1;335. x1 = x0;336. x0 = bak;337. 338. 339. do340. 341. GUI_Point(x0, y, color);/ 从左到右逐点显示,描出垂直线342. x0+;343. while(x1=x0);344. 345. /*346. /画竖直线函数347. /参数:color=1,填充黑色1;color=0,填充0;348. /x为起始和终点的水平坐标值,y0,y1为垂直坐标值349. /*350. void GUI_RLine(unsigned char x, unsigned char y0, unsigned char y1, unsigned char color)351. 352. unsigned charbak;353. if(y0y1) / 对y0、y1大小进行排列,以便画图354. 355. bak = y1;356. y1 = y0;357. y0 = bak;358. 359. 360. do361. 362. GUI_Point(x, y0, color);/ 从上到下逐点显示,描出垂直线363. y0+;364. while(y1=y0);365. 应用例子:366. GUI_Fill_GDRAM(0x00);367. GUI_HLine(10,120,10,1); /画水平线操作368. GUI_RLine(10,10,60,1); /画垂直线操作任意两点画线:369. /*370. /任意两点画直线函数371. /参数:color=1,该线填充1;color=0,该线填充0;372. /x0:直线起点的x坐标值,y0:直线起点的y坐标值373. /x1:直线终点的x坐标值,y1:直线终点的y坐标值374. /*375. void GUI_Line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char color)376. 377. char dx; / 直线x轴差值变量378. char dy; / 直线y轴差值变量379. char dx_sym; / x轴增长方向,为-1时减值方向,为1时增值方向380. char dy_sym; / y轴增长方向,为-1时减值方向,为1时增值方向381. char dx_x2; / dx*2值变量,用于加快运算速度382. char dy_x2; / dy*2值变量,用于加快运算速度383. char di; / 决策变量384. 385. 386. if(x0=x1) /判断是否为垂直线387. 388. GUI_RLine(x0,y0,y1,color); /画垂直线389. return;390. 391. if(y0=y1) /判断是否为水平线392. 393. GUI_HLine(x0,x1,y0,color); /画水平线394. return;395. 396.397. dx = x1-x0; / 求取两点之间的差值398. dy = y1-y0;399. 400. /* 判断增长方向,或是否为水平线、垂直线、点 */401. if(dx0) / 判断x轴方向402. 403. dx_sym = 1; / dx0,设置dx_sym=1404. 405. else406. 407. if(dx0)408. 409. dx_sym = -1; / dx0) / 判断y轴方向420. 421. dy_sym = 1; / dy0,设置dy_sym=1422. 423. else424. 425. if(dy0)426. 427. dy_sym = -1; / dy=dy) / 对于dx=dy,则使用x轴为基准447. 448. di = dy_x2 - dx;449. while(x0!=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46023.2-2025汽车用智能变色玻璃第2部分:聚合物分散液晶调光玻璃
- GB 46033-2025粮食仓库安全操作规程
- 2025年安全生产安全生产法律法规考试题及答案
- 2025年安全生产填空题及答案大全
- 2025年宠物寄生虫防治师中级模拟题及答案
- 2025年创业实战案例分析及模拟题集
- 2025年企业安全管理员实操题集
- 2025年应急物资储备中心笔试模拟题库及解析
- 2025年金融IT工程师专业能力认证考试试题及答案解析
- 2025年建筑工程施工图设计师资格认证试题及答案解析
- GB/T 27548-2011移动式升降工作平台安全规则、检查、维护和操作
- 饲料卫生标准解读x自动保存的
- GB/T 22166-2008非校准起重圆环链和吊链使用和维护
- GB/T 12236-2008石油、化工及相关工业用的钢制旋启式止回阀
- 《应用文写作与文献检索》课程教学大纲
- 鲫鱼解剖试验课件
- 社交网络分析
- 元器件封装库设计规范
- 儿科护理学小儿腹泻
- 《我们身边的电-形成认识》课件1
- 大管棚施工记录表
评论
0/150
提交评论