找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2434|回复: 13
收起左侧

单片机驱动lcd12864

  [复制链接]
ID:955258 发表于 2021-8-9 14:24 | 显示全部楼层 |阅读模式
lcd12864对于许多小白来说是很困难的,尤其是他的时序图,更让人头大,相信对刚接触单片机的人来说更是煎熬,因而在这里我要分享一下lcd12864的资料,这是我做的用C51单片机驱动12864的程序,12864是一个很重要的显示模块,有显示清晰,利于人机交互,操作简单等优点,它相比lcd1602能显示更多的文字,还能显示图片,操作指令简单,使用很方便,是不少工程师设计开发的首选,因而我整理了一下我之前的项目,把12864的资料特别地整理一下,方便更多的人学习和使用。

单片机源程序如下:
  1. #include "reg52.h"
  2. #include <intrins.h>
  3. #include "12864mokuai.h"
  4. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  5. uchar IRDIS[2];
  6. uchar IRCOM[4];
  7. void delay0(uchar x);  //x*0.14MS
  8. void beep();
  9. void  dataconv();
  10. void lcd_pos(uchar X,uchar Y);  //确定显示位置
  11. /*******************************************************************/
  12. /*                                                                 */
  13. /*  延时函数                                                       */
  14. /*                                                                 */
  15. /*******************************************************************/
  16. void delay(int ms)
  17. {
  18.     while(ms--)
  19.         {
  20.       uchar i;
  21.           for(i=0;i<250;i++)  
  22.            {
  23.             _nop_();                           
  24.                 _nop_();
  25.                 _nop_();
  26.                 _nop_();
  27.            }
  28.         }
  29. }               
  30. /*******************************************************************/
  31. /*                                                                 */
  32. /*检查LCD忙状态                                                    */
  33. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  34. /*                                                                 */
  35. /*******************************************************************/
  36. bit lcd_busy()
  37. {                          
  38.     bit result;
  39.     LCD_RS = 0;
  40.     LCD_RW = 1;
  41.     LCD_EN = 1;
  42.     delayNOP();
  43.     result = (bit)(P0&0x80);
  44.     LCD_EN = 0;
  45.     return(result);
  46. }
  47. /*******************************************************************/
  48. /*                                                                 */
  49. /*写指令数据到LCD                                                  */
  50. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  51. /*                                                                 */
  52. /*******************************************************************/
  53. void lcd_wcmd(uchar cmd)
  54. {                          
  55.    while(lcd_busy());
  56.     LCD_RS = 0;
  57.     LCD_RW = 0;
  58.     LCD_EN = 0;
  59.     _nop_();
  60.     _nop_();
  61.     P0 = cmd;
  62.     delayNOP();
  63.     LCD_EN = 1;
  64. //    delayNOP();
  65.     LCD_EN = 0;  
  66. }
  67. /*******************************************************************/
  68. /*                                                                 */
  69. /*写显示数据到LCD                                                  */
  70. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  71. /*                                                                 */
  72. /*******************************************************************/
  73. void lcd_wdat(uchar dat)
  74. {                          
  75.    while(lcd_busy());
  76.     LCD_RS = 1;
  77.     LCD_RW = 0;
  78.     LCD_EN = 0;
  79.     P0 = dat;
  80.     delayNOP();
  81.     LCD_EN = 1;
  82.     delayNOP();
  83.     LCD_EN = 0;
  84. }
  85. /*******************************************************************/
  86. /*                                                                 */
  87. /*  LCD初始化设定                                                  */
  88. /*                                                                 */
  89. /*******************************************************************/
  90. void lcd_init()
  91. {

  92.     LCD_PSB    = 1;         //并口方式
  93.     lcd_wcmd(0x34);      //扩充指令操作
  94.     delay(5);
  95.     lcd_wcmd(0x30);      //基本指令操作
  96.     delay(5);
  97.     lcd_wcmd(0x0C);      //显示开,关光标
  98.     delay(5);
  99.     lcd_wcmd(0x01);      //清除LCD的显示内容
  100.     delay(5);
  101. }


  102. void delay0(uchar x)    //x*0.14MS
  103. {
  104.   uchar i;
  105.   while(x--)
  106. {
  107.   for (i = 0; i<13; i++) {}
  108. }
  109. }
  110. /*********************************************************/
  111. /*                                                       */
  112. /* 设定显示位置                                          */
  113. /*                                                       */
  114. /*********************************************************/
  115. void lcd_pos(uchar X,uchar Y)
  116. {                          
  117.    uchar  pos;
  118.    if (X==0)
  119.      {X=0x80;}
  120.    else if (X==1)
  121.      {X=0x90;}
  122.    else if (X==2)
  123.      {X=0x88;}
  124.    else if (X==3)
  125.      {X=0x98;}
  126.    pos = X+Y ;  
  127.    lcd_wcmd(pos);     //显示地址
  128. }


复制代码




  1. #ifndef __lcd12864mokuai_H
  2. #define __lcd12864mokuai_H

  3. #include "reg52.h"
  4. #ifndef uchar
  5. #define uchar unsigned char
  6. #endif

  7. #ifndef uint
  8. #define uint unsigned int
  9. #endif
  10. #define LCD_data  P0             //数据口



  11. //开发板引脚配置
  12. sbit LCD_RS  =  P2^6;             //(数据命令)寄存器选择输入
  13. sbit LCD_RW  =  P2^5;             //液晶读/写控制
  14. sbit LCD_EN  =  P2^7;             //液晶使能控制
  15. sbit LCD_PSB =  P2^2;             //串/并方式控制
  16. sbit LCD_RST =  P2^1;        


  17. void delay0(uchar x);  //x*0.14MS
  18. void beep();
  19. void  dataconv();
  20. void lcd_pos(uchar X,uchar Y);  //确定显示位置
  21. void lcd_init();
  22. void lcd_wdat(uchar dat);
  23. void LCD_ShowNum(uchar X,uchar Y,uint Number,uchar Length);
  24. #endif

复制代码


  1. #include "reg52.h"
  2. #include "12864mokuai.h"
  3. unsigned char code dis1[] = {"中国加油!"};
  4. unsigned char code dis2[] = {"中国必胜!"};
  5. unsigned char i;

  6. void main()
  7. {
  8.         lcd_init();
  9.         lcd_pos(0,0);
  10.                         i = 0;
  11.         while(1)
  12.         {
  13.                
  14.         
  15.                 while(dis1[i] != '\0')
  16.                 {                         //显示字符
  17.                         lcd_wdat(dis1[i]);
  18.                         i++;
  19.                 }
  20.                 lcd_pos(1,0);
  21.                         i = 0;
  22.                 while(dis2[i] != '\0')
  23.                 {                         //显示字符
  24.                         lcd_wdat(dis2[i]);
  25.                         i++;
  26.                 }
  27.         }
  28. }
复制代码

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2021-8-9 15:16 | 显示全部楼层
楼主你好 缺少"12864mokuai.h" 无法编译啊
回复

使用道具 举报

ID:955258 发表于 2021-8-9 16:02 | 显示全部楼层
51hei团团 发表于 2021-8-9 15:16
楼主你好 缺少"12864mokuai.h" 无法编译啊

里面有的,我是按模块化编程的
回复

使用道具 举报

ID:955258 发表于 2021-8-9 16:05 | 显示全部楼层
51hei团团 发表于 2021-8-9 15:16
楼主你好 缺少"12864mokuai.h" 无法编译啊

12864mokuai.h在程序里面呢,我用的是模块编程

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:97554 发表于 2021-8-9 21:42 | 显示全部楼层
12864有几种,有字库的7920,和没字库的7565什么的,驱动是不一样的,有字库的7920可以用一般的LCD1602的字符液晶驱动程序,把字符改成汉字还有地址改一下就可以。而没有字库的几种驱动程序又不尽相同,所以,楼主给的程序对于初学的很可能会踩雷。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:97554 发表于 2021-8-9 21:46 | 显示全部楼层
楼主的程序应该是带字库得到12864的驱动,其实可以简化很多。这样的程序高手用不上,新手又使用不了,楼主也没有细说,初学的需要注意下。
回复

使用道具 举报

ID:321836 发表于 2021-8-10 11:13 | 显示全部楼层
杨雪飞 发表于 2021-8-9 21:46
楼主的程序应该是带字库得到12864的驱动,其实可以简化很多。这样的程序高手用不上,新手又使用不了,楼主 ...

现在非字库的LCD12864市面上用得不多了吧,我在某1个宝买到的基本都是带字库的,这个程序带字库12864可以顺利显示,而且思路清晰,很适合初学者!!!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:955258 发表于 2021-8-10 21:43 | 显示全部楼层
杨雪飞 发表于 2021-8-9 21:42
12864有几种,有字库的7920,和没字库的7565什么的,驱动是不一样的,有字库的7920可以用一般的LCD1602的字 ...

你说的没错,这个是带字库的,带字库的是比较常见的,用的人也比较多,无论是功能还是使用方面,带字库的都比不带字库的好很多
回复

使用道具 举报

ID:955258 发表于 2021-8-10 21:47 | 显示全部楼层
已飞的鹰 发表于 2021-8-10 11:13
现在非字库的LCD12864市面上用得不多了吧,我在某1个宝买到的基本都是带字库的,这个程序带字库12864可以 ...

没错,一般工程项目还是首选带字库的
回复

使用道具 举报

ID:815949 发表于 2021-9-4 12:11 | 显示全部楼层
不带字库的可以自己编字形码,尤其是显示特殊字体的时候就有优势,缺点是会占用单片机的空间,有字库的就没有这个问题,两种屏的驱动不一样,不通用,初学者要注意
回复

使用道具 举报

ID:857072 发表于 2021-9-4 13:16 来自手机 | 显示全部楼层
玩点个性化的字体还得没字库的。
回复

使用道具 举报

ID:97554 发表于 2021-9-4 18:03 | 显示全部楼层
已飞的鹰 发表于 2021-8-10 11:13
现在非字库的LCD12864市面上用得不多了吧,我在某1个宝买到的基本都是带字库的,这个程序带字库12864可以 ...

相对来说,不带字库的用的多,因为显示更灵活。
回复

使用道具 举报

ID:97554 发表于 2021-9-4 18:04 | 显示全部楼层
0901 发表于 2021-8-10 21:43
你说的没错,这个是带字库的,带字库的是比较常见的,用的人也比较多,无论是功能还是使用方面,带字库的 ...

我倒是觉得不带字库的好用,画点画线任意坐标显示,价格便宜,从我自己拆过的电子设备来看,70
%以上用的还是不带字库的。
回复

使用道具 举报

ID:97554 发表于 2021-9-4 18:16 | 显示全部楼层
已飞的鹰 发表于 2021-8-10 11:13
现在非字库的LCD12864市面上用得不多了吧,我在某1个宝买到的基本都是带字库的,这个程序带字库12864可以 ...

说实话带字库的做简单显示尚可,复杂的显示根本无法实现。所以,市面大部分设备都是不带字库的,比如ST7565之类的cog屏。另外你觉得楼主这贴思路清晰适合初学者,那我可以告诉你,对于7920的带字库屏的驱动只需要将最简单的LCD1602字符屏的程序把字母和数字改成汉字即可显示,四步;1、引脚定义、函数定义。2、写命令函数、3、写数据函数 4、主函数。就完事了,无需什么POS(0,0)什么的,只需要写指令函数把地址写上就行。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表