玩转12864液晶.docx

上传人:牧羊曲112 文档编号:3119648 上传时间:2023-03-10 格式:DOCX 页数:13 大小:41.44KB
返回 下载 相关 举报
玩转12864液晶.docx_第1页
第1页 / 共13页
玩转12864液晶.docx_第2页
第2页 / 共13页
玩转12864液晶.docx_第3页
第3页 / 共13页
玩转12864液晶.docx_第4页
第4页 / 共13页
玩转12864液晶.docx_第5页
第5页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《玩转12864液晶.docx》由会员分享,可在线阅读,更多相关《玩转12864液晶.docx(13页珍藏版)》请在三一办公上搜索。

1、玩转12864液晶资料教程 玩转12864液晶-显示字符 在我们常用的人机交互显示界面中,除了数码管,LED,以及我们之前已经提到的LCD1602之外,还有一种液晶屏用的比较多。相信接触过单片机的朋友都知道了,那就是12864液晶。顾名思义,12864表示其横向可以显示128个点,纵向可以显示64个点。我们常用的12864液晶模块中有带字库的,也有不带字库的,其控制芯片也有很多种,如KS0108 T6963,ST7920等等。在这里我们以ST7920为主控芯片的12864液晶屏来学习如何去驱动它。(液晶屏采用金鹏的OCMJ4X8C) 关于这个液晶屏的更多信息,请参考它的DATASHEET,附件

2、中有下载。 我们先来了解一下它的并行连接情况。 下面是电路连接图 1 从上面的图可以看出,液晶模块和单片机的连接除了P0口的8位并行数据线之外,还有RS,RW,E等几根线。其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。 通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。 看看并行模式下的写时序图: 2 根据这个时序图,我们就可以写出写数据或者写命令到LCD12864液晶的子程序。 读时序图如下: 根据这个时序图我们就可以从LCD12864液晶模块内部RAM中读出相应的数据,我

3、们的忙检测函数就是根据这个时序图写出来的。以及后面章节中讲的画点函数等都要用到读时序。 有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。 这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。 下面让我们根据这些编写出它的驱动程序吧。 我的硬件测试条件为:STC89C516(11.0592MHz) + OCMJ4X8C 实际显示效果图片如下: 3 程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。大致有如下几个函数:写数据,写指令,忙检测,初始化,指定地址显示字

4、符串等等。 1. #include reg52.h 2. #include intrins.h 3. sbit io_LCD12864_RS = P10 ; 4. sbit io_LCD12864_RW = P11 ; 5. sbit io_LCD12864_EN = P12 ; 6. 7. #define io_LCD12864_DATAPORT P0 8. 9. #define SET_DATA io_LCD12864_RS = 1 ; 10. #define SET_INC io_LCD12864_RS = 0 ; 11. #define SET_READ io_LCD12864_RW

5、= 1 ; 12. #define SET_WRITE io_LCD12864_RW = 0 ; 13. #define SET_EN io_LCD12864_EN = 1 ; 14. #define CLR_EN io_LCD12864_EN = 0 ; 15. 16. 17. void v_Lcd12864CheckBusy_f( void ) /忙检测函数 18. 19. unsigned int nTimeOut = 0 ; 20. SET_INC 21. SET_READ 22. CLR_EN 23. SET_EN 24. while( ( io_LCD12864_DATAPORT

6、& 0x80 ) & ( +nTimeOut != 0 ) ) ; 25. CLR_EN 26. SET_INC 27. SET_READ 28. 29. 30. void v_Lcd12864SendCmd_f( unsigned char byCmd ) /发送命令 31. 32. v_Lcd12864CheckBusy_f ; 33. SET_INC 34. SET_WRITE 35. CLR_EN 36. io_LCD12864_DATAPORT = byCmd ; 37. _nop_; 38. _nop_; 39. SET_EN 40. _nop_; 41. _nop_; 42. C

7、LR_EN 43. SET_READ 4 44. SET_INC 45. 46. void v_Lcd12864SendData_f( unsigned char byData ) /发送数据 47. 48. v_Lcd12864CheckBusy_f ; 49. SET_DATA 50. SET_WRITE 51. CLR_EN 52. io_LCD12864_DATAPORT = byData ; 53. _nop_; 54. _nop_; 55. SET_EN 56. _nop_; 57. _nop_; 58. CLR_EN 59. SET_READ 60. SET_INC 61. 62

8、. 63. void v_DelayMs_f( unsigned int nDelay ) /延时 64. 65. unsigned int i ; 66. for( ; nDelay 0 ; nDelay- ) 67. 68. for( i = 125 ; i 0 ; i- ) ; 69. 70. 71. 72. void v_Lcd12864Init_f( void ) /初始化 73. 74. v_Lcd12864SendCmd_f( 0x30 ) ; /基本指令集 75. v_DelayMs_f( 50 ) ; 76. v_Lcd12864SendCmd_f( 0x01 ) ; /清屏

9、 77. v_DelayMs_f( 50 ) ; 78. v_Lcd12864SendCmd_f( 0x06 ) ; /光标右移 79. v_DelayMs_f( 50 ) ; 80. v_Lcd12864SendCmd_f( 0x0c ) ; /开显示 81. 82. void v_Lcd12864SetAddress_f( unsigned char x, y ) /地址转换 83. 84. unsigned char byAddress ; 85. switch( y ) 86. 87. case 0 : byAddress = 0x80 + x ; 88. break; 89. cas

10、e 1 : byAddress = 0x90 + x ; 90. break ; 91. case 2 : byAddress = 0x88 + x ; 92. break ; 93. case 3 : byAddress = 0x98 + x ; 94. break ; 95. default : 96. break ; 97. 98. v_Lcd12864SendCmd_f( byAddress ) ; 99. 100. void v_Lcd12864PutString_f( unsigned char x, unsigned char y, unsigned char *pData )

11、101. 102. v_Lcd12864SetAddress_f( x, y ) ; 5 103. while( *pData != 0 ) 104. 105. v_Lcd12864SendData_f( *pData+ ) ; 106. 107. 108. 109. void main( void ) 110. 111. v_Lcd12864Init_f ; 112. 113. v_Lcd12864PutString_f( 0,0, 电子工程师之家) ; 114. v_Lcd12864PutString_f( 2,1, 欢迎光临) ; 115. v_Lcd12864PutString_f(

12、0,2, *LCD12864ST7920*) ; 116. v_Lcd12864PutString_f( 0,3, ) ; 117. while( 1 ) ; 118. 复制代码 怎么样,你弄出来了吗,很简单吧 下一章节内容将学习如何在LCD12864液晶屏上画图。尽请期待_ 玩转12864液晶显示图片,画点,画任意直线 通过上一篇的实验,相信大家都掌握了显示字符的基本用法。 下面我们来看一下12864液晶更高级的用法。 首先是它的绘图功能。 让我们先来显示一整副的图片吧,也就是128x64大小。 在使用绘图功能时,先要打开扩充指令集,然后再打开绘图功能。接着就是送数据显示了。这里我们首先要弄

13、明白ST7920的显示坐标关系。其显示坐标如下。 6 从图中可以看出,X方向共有8个字(16个字节)Y方向共有031 行 分为上下两个屏。 弄懂了之后我们就可以依照此坐标来显示一整屏的图片了。 随便用一个图片的提取转换软件,讲一副126X64大小的图片转换成字节数据,总共字节大小为128*64/8 = 1024个字节。 下面我们来看看这个显示整屏图像的函数 void v_Lcd12864DrawPicture_f( unsigned char code *pPicture ) unsigned char i, j, k ; for( i = 0 ; i 2 ; i+ )/分上下两屏写 for(

14、 j = 0 ; j 32 ; j+ ) v_Lcd12864SendCmd_f( 0x80 + j ) ;/写Y坐标 if( i = 0 ) /写X坐标 v_Lcd12864SendCmd_f( 0x80 ) ; else 7 v_Lcd12864SendCmd_f( 0x88 ) ; for( k = 0 ; k 4 ; Tier_bit = X & 0x0f ; if( Y 32 ) Row = Y ; else Row = Y - 32 ; Tier += 8 ; v_Lcd12864SendCmd_f( Row + 0x80 ) ; v_Lcd12864SendCmd_f( Tier

15、 + 0x80 ) ; u8_Lcd12864ReadByte_f ; ReadOldH = u8_Lcd12864ReadByte_f ; ReadOldL = u8_Lcd12864ReadByte_f ; v_Lcd12864SendCmd_f( Row + 0x80 ) ; v_Lcd12864SendCmd_f( Tier + 0x80 ) ; if( Tier_bit 8 ) switch( Color) case 0 : ReadOldH &=( ( 0x01 ( 7 - Tier_bit ) ; break ; case 1 : ReadOldH |= ( 0x01 ( 7 -

16、 Tier_bit ) ; break ; case 2 : ReadOldH = ( 0x01 ( 7 - Tier_bit ) ; break ; default : break ; v_Lcd12864SendData_f( ReadOldH ) ; 9 v_Lcd12864SendData_f( ReadOldL ) ; else switch(Color) case 0 : ReadOldL &= ( 0x01 ( 15 - Tier_bit ) ; break ; case 1 : ReadOldL |= ( 0x01 ( 15 - Tier_bit ) ; break ; cas

17、e 2 : ReadOldL = ( 0x01 X1 ) Temp = X1 ; X1 = X0 ; X0 = Temp ; for( ; X0 Y1 ) Temp = Y1 ; Y1 = Y0 ; Y0 = Temp ; for(; Y0 0 ) incx = 1; else if( delta_x = 0 ) v_Lcd12864DrawLineY_f( StartX, StartY, EndY, Color ) ; return ; else incx = -1 ; if( delta_y 0 ) incy = 1 ; else if(delta_y = 0 ) v_Lcd12864Dr

18、awLineX_f( StartX, EndX, StartY, Color ) ; return ; else incy = -1 ; delta_x = ABS( delta_x ); delta_y = ABS( delta_y ); if( delta_x delta_y ) distance = delta_x ; else distance = delta_y ; v_Lcd12864DrawPoint_f( StartX, StartY, Color ) ; /* Draw Line*/ for( t = 0 ; t distance ) x -= distance ; Star

19、tX += incx ; if( y distance ) y -= distance ; StartY += incy ; 老规矩,我们用这个函数随便画任意斜率的几条直线看看。 v_Lcd12864DrawLine_f( 0, 0, 127, 63, 1 ) ; v_Lcd12864DrawLine_f( 0, 63, 127, 0 , 1 ) ; v_Lcd12864DrawLine_f( 12, 0, 127, 63, 1 ) ; v_Lcd12864DrawLine_f( 52, 63, 127, 0 , 1 ) ; v_Lcd12864DrawLine_f( 32, 63, 98, 0, 1 ) ; v_Lcd12864DrawLine_f( 67, 0, 127, 63 , 1 ) ; 下面是具体的效果图: 13

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号