11607|10

55

帖子

3668

TA的资源

纯净的硅(初级)

楼主
 

玩转12864液晶(1)--显示字符 [复制链接]

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


关于这个液晶屏的更多信息,请参考它的DATASHEET,附件中有下载。
我们先来了解一下它的并行连接情况。
下面是电路连接图


从上面的图可以看出,液晶模块和单片机的连接除了P0口的8位并行数据线之外,还有RS,RW,E等几根线。其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。
通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。
看看并行模式下的写时序图:


根据这个时序图,我们就可以写出写数据或者写命令到LCD12864液晶的子程序。
读时序图如下:

根据这个时序图我们就可以从LCD12864液晶模块内部RAM中读出相应的数据,我们的忙检测函数就是根据这个时序图写出来的。以及后面章节中讲的画点函数等都要用到读时序。
有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。
这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。
下面让我们根据这些编写出它的驱动程序吧。
我的硬件测试条件为:STC89C516(11.0592MHz) + OCMJ4X8C
实际显示效果图片如下:

程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。大致有如下几个函数:写数据,写指令,忙检测,初始化,指定地址显示字符串等等。
此帖出自单片机论坛

最新回复

O(∩_∩)O~  详情 回复 发表于 2011-8-25 21:58
点赞 关注
 

回复
举报

55

帖子

3668

TA的资源

纯净的硅(初级)

沙发
 
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. sbit io_LCD12864_RS = P1^0 ;
  4. sbit io_LCD12864_RW = P1^1 ;
  5. sbit io_LCD12864_EN = P1^2 ;

  6. #define io_LCD12864_DATAPORT P0

  7. #define SET_DATA io_LCD12864_RS = 1 ;
  8. #define SET_INC io_LCD12864_RS = 0 ;
  9. #define SET_READ io_LCD12864_RW = 1 ;
  10. #define SET_WRITE io_LCD12864_RW = 0 ;
  11. #define SET_EN io_LCD12864_EN = 1 ;
  12. #define CLR_EN io_LCD12864_EN = 0 ;


  13. void v_Lcd12864CheckBusy_f( void ) //忙检测函数
  14. {
  15. unsigned int nTimeOut = 0 ;
  16. SET_INC
  17. SET_READ
  18. CLR_EN
  19. SET_EN
  20. while( ( io_LCD12864_DATAPORT & 0x80 ) && ( ++nTimeOut != 0 ) ) ;
  21. CLR_EN
  22. SET_INC
  23. SET_READ
  24. }

  25. void v_Lcd12864SendCmd_f( unsigned char byCmd ) //发送命令
  26. {
  27. v_Lcd12864CheckBusy_f() ;
  28. SET_INC
  29. SET_WRITE
  30. CLR_EN
  31. io_LCD12864_DATAPORT = byCmd ;
  32. _nop_();
  33. _nop_();
  34. SET_EN
  35. _nop_();
  36. _nop_();
  37. CLR_EN
  38. SET_READ
  39. SET_INC
  40. }
  41. void v_Lcd12864SendData_f( unsigned char byData ) //发送数据
  42. {
  43. v_Lcd12864CheckBusy_f() ;
  44. SET_DATA
  45. SET_WRITE
  46. CLR_EN
  47. io_LCD12864_DATAPORT = byData ;
  48. _nop_();
  49. _nop_();
  50. SET_EN
  51. _nop_();
  52. _nop_();
  53. CLR_EN
  54. SET_READ
  55. SET_INC
  56. }

  57. void v_DelayMs_f( unsigned int nDelay ) //延时
  58. {
  59. unsigned int i ;
  60. for( ; nDelay > 0 ; nDelay-- )
  61. {
  62. for( i = 125 ; i > 0 ; i-- ) ;
  63. }
  64. }

  65. void v_Lcd12864Init_f( void ) //初始化
  66. {
  67. v_Lcd12864SendCmd_f( 0x30 ) ; //基本指令集
  68. v_DelayMs_f( 50 ) ;
  69. v_Lcd12864SendCmd_f( 0x01 ) ; //清屏
  70. v_DelayMs_f( 50 ) ;
  71. v_Lcd12864SendCmd_f( 0x06 ) ; //光标右移
  72. v_DelayMs_f( 50 ) ;
  73. v_Lcd12864SendCmd_f( 0x0c ) ; //开显示
  74. }
  75. void v_Lcd12864SetAddress_f( unsigned char x, y ) //地址转换
  76. {
  77. unsigned char byAddress ;
  78. switch( y )
  79. {
  80. case 0 : byAddress = 0x80 + x ;
  81. break;
  82. case 1 : byAddress = 0x90 + x ;
  83. break ;
  84. case 2 : byAddress = 0x88 + x ;
  85. break ;
  86. case 3 : byAddress = 0x98 + x ;
  87. break ;
  88. default :
  89. break ;
  90. }
  91. v_Lcd12864SendCmd_f( byAddress ) ;
  92. }
  93. void v_Lcd12864PutString_f( unsigned char x, unsigned char y, unsigned char *pData )
  94. {
  95. v_Lcd12864SetAddress_f( x, y ) ;
  96. while( *pData != '\0' )
  97. {
  98. v_Lcd12864SendData_f( *pData++ ) ;
  99. }

  100. }
  101. void main( void )
  102. {
  103. v_Lcd12864Init_f() ;

  104. v_Lcd12864PutString_f( 0,0, "电子工程师之家") ;
  105. v_Lcd12864PutString_f( 2,1, "欢迎光临") ;
  106. v_Lcd12864PutString_f( 0,2, "*LCD12864ST7920*") ;
  107. v_Lcd12864PutString_f( 0,3, "★○◇◆※☆■△") ;
  108. while( 1 ) ;
  109. }
复制代码


怎么样,你弄出来了吗,很简单吧~~
此帖出自单片机论坛
 
 

回复

274

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
不错~~~
收藏了~~谢谢楼主。
此帖出自单片机论坛
 
个人签名学无先后,达者为师
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

4
 

玩转12864液晶(1)--显示字符

谢谢分享
此帖出自单片机论坛
 
 
 

回复

79

帖子

0

TA的资源

纯净的硅(初级)

5
 
对刚学12864的不错,玩16*16点阵好像更麻烦
此帖出自单片机论坛
 
 
 

回复

209

帖子

0

TA的资源

一粒金砂(高级)

6
 
才写过
此帖出自单片机论坛
 
 
 

回复

211

帖子

0

TA的资源

一粒金砂(高级)

7
 
好帖子 收了
此帖出自单片机论坛
 
 
 

回复

31

帖子

0

TA的资源

一粒金砂(中级)

8
 
学习了
此帖出自单片机论坛
 
个人签名信自己
 
 

回复

100

帖子

0

TA的资源

一粒金砂(中级)

9
 
先收藏起来再看
此帖出自单片机论坛
 
 
 

回复

412

帖子

665

TA的资源

纯净的硅(中级)

10
 

回复 沙发 火龙果 的帖子

看不懂求解释啊
此帖出自单片机论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

11
 
O(∩_∩)O~
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表