标题: 用51单片机控制LCD12864显示屏源程序 [打印本页]

作者: 桐阁竹韵    时间: 2018-8-1 17:35
标题: 用51单片机控制LCD12864显示屏源程序
12864液晶在出厂时其对比度已经调好,所以用户在使用的时候第三管脚可不用接任何东西,本实验板上为了兼容多家12864液晶所以加了液晶对比度调节电位器,若用户使用我们配套的12864液晶可不用管它,液晶的第三管脚悬空就可以。有些液晶功耗比较大,用户在使用的时候可将液晶的第19、20引脚的背光不接,这样字体会很清楚。



单片机源程序如下:
  1. /**********************BST-V51实验开发板例程************************
  2. *  平台:BST-V51 + Keil U3 + STC89C52
  3. *  名称:
  4. *  晶振:11.0592MHZ
  5. *  说明:免费开源,不提供源代码分析.
  6. ******************************************************************/
  7. /*******************************************************************/
  8. /*                                                                 */
  9. /* 单片机开发系统演示程序 - 128*64LCD显示显示  */
  10. /*                                                                 */
  11. //;*  LCD型号:TS12864A-3(带汉字库)或兼容型号    控制器ST7920      */
  12. //;*  MCU:AT89S52 ,晶体频率:11.0592MHz                              */
  13. /*                                                                 */
  14. /*******************************************************************/

  15. #include <reg51.h>
  16. #include <intrins.h>
  17.        
  18. #define uchar unsigned char
  19. #define uint  unsigned int
  20. /*12864端口定义*/
  21. #define LCD_data  P0             //数据口
  22. sbit LCD_RS  =  P2^6;            //寄存器选择输入
  23. sbit LCD_RW  =  P2^5;            //液晶读/写控制
  24. sbit LCD_EN  =  P2^7;            //液晶使能控制
  25. sbit LCD_PSB =  P1^2;            //串/并方式控制
  26. sbit wela    =  P2^6;
  27. sbit dula    =  P2^7;

  28. uchar code dis1[] = {"看什么看!"};
  29. uchar code dis2[] = {"显示屏而已!"};
  30. uchar code dis3[] = {"少见多怪!"};
  31. uchar code dis4[] = {"那凉哪呆着!"};                  

  32. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  33. uchar IRDIS[2];
  34. uchar IRCOM[4];
  35. void delay0(uchar x);  //x*0.14MS
  36. void beep();
  37. void  dataconv();
  38. void lcd_pos(uchar X,uchar Y);  //确定显示位置
  39. /*******************************************************************/
  40. /*                                                                 */
  41. /*  延时函数                                                       */
  42. /*                                                                 */
  43. /*******************************************************************/
  44. void delay(int ms)
  45. {
  46.     while(ms--)
  47.         {
  48.       uchar i;
  49.           for(i=0;i<250;i++)  
  50.            {
  51.             _nop_();                          
  52.                 _nop_();
  53.                 _nop_();
  54.                 _nop_();
  55.            }
  56.         }
  57. }               
  58. /*******************************************************************/
  59. /*                                                                 */
  60. /*检查LCD忙状态                                                    */
  61. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  62. /*                                                                 */
  63. /*******************************************************************/
  64. bit lcd_busy()
  65. {                          
  66.     bit result;
  67.     LCD_RS = 0;
  68.     LCD_RW = 1;
  69.     LCD_EN = 1;
  70.     delayNOP();
  71.     result = (bit)(P0&0x80);
  72.     LCD_EN = 0;
  73.     return(result);
  74. }
  75. /*******************************************************************/
  76. /*                                                                 */
  77. /*写指令数据到LCD                                                  */
  78. /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  79. /*                                                                 */
  80. /*******************************************************************/
  81. void lcd_wcmd(uchar cmd)
  82. {                          
  83.    while(lcd_busy());
  84.     LCD_RS = 0;
  85.     LCD_RW = 0;
  86.     LCD_EN = 0;
  87.     _nop_();
  88.     _nop_();
  89.     P0 = cmd;
  90.     delayNOP();
  91.     LCD_EN = 1;
  92.     delayNOP();
  93.     LCD_EN = 0;  
  94. }
  95. /*******************************************************************/
  96. /*                                                                 */
  97. /*写显示数据到LCD                                                  */
  98. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  99. /*                                                                 */
  100. /*******************************************************************/
  101. void lcd_wdat(uchar dat)
  102. {                          
  103.    while(lcd_busy());
  104.     LCD_RS = 1;
  105.     LCD_RW = 0;
  106.     LCD_EN = 0;
  107.     P0 = dat;
  108.     delayNOP();
  109.     LCD_EN = 1;
  110.     delayNOP();
  111.     LCD_EN = 0;
  112. }
  113. /*******************************************************************/
  114. /*                                                                 */
  115. /*  LCD初始化设定                                                  */
  116. /*                                                                 */
  117. /*******************************************************************/
  118. void lcd_init()
  119. {

  120.     LCD_PSB = 1;         //并口方式
  121.    
  122.     lcd_wcmd(0x34);      //扩充指令操作
  123.     delay(5);
  124.     lcd_wcmd(0x30);      //基本指令操作
  125.     delay(5);
  126.     lcd_wcmd(0x0C);      //显示开,关光标
  127.     delay(5);
  128.     lcd_wcmd(0x01);      //清除LCD的显示内容
  129.     delay(5);
  130. }
  131. /*********************************************************/
  132. /*                                                                                                                 */
  133. /* 主程序                                                                                    */
  134. /*                                                       */
  135. /*********************************************************/
  136.   main()
  137. {
  138.     uchar i;
  139.     delay(10);                 //延时
  140.     wela=0;
  141.         dula=0;
  142.     lcd_init();                //初始化LCD            
  143.   
  144.     lcd_pos(0,0);             //设置显示位置为第一行的第1个字符
  145.      i = 0;
  146.     while(dis1[i] != '\0')
  147.      {                         //显示字符
  148.        lcd_wdat(dis1[i]);
  149.        i++;
  150.      }
  151.     lcd_pos(1,0);             //设置显示位置为第二行的第1个字符
  152.      i = 0;
  153.     while(dis2[i] != '\0')
  154.      {
  155.        lcd_wdat(dis2[i]);      //显示字符
  156.        i++;
  157.      }
  158.          lcd_pos(2,0);             //设置显示位置为第三行的第1个字符
  159.      i = 0;
  160.     while(dis3[i] != '\0')
  161.      {
  162.        lcd_wdat(dis3[i]);      //显示字符
  163.        i++;
  164.      }
  165.          lcd_pos(3,0);             //设置显示位置为第四行的第1个字符
  166.      i = 0;
  167.     while(dis4[i] != '\0')
  168.      {
  169.        lcd_wdat(dis4[i]);      //显示字符
  170.        i++;
  171.      }
  172.      while(1);
  173. }



  174. /*********************************************************/
  175. /*                                                                                                                 */
  176. /* 延时x*0.14ms子程序                                                                         */
  177. /*                                                       */
  178. /*********************************************************/

  179. void delay0(uchar x)    //x*0.14MS
  180. {
  181.   uchar i;
  182. ……………………

  183. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
12864显示字符.rar (19.33 KB, 下载次数: 1635)



作者: 10650815    时间: 2018-8-4 15:43
头文件是自己编写的吗
作者: zhangcj0818    时间: 2018-9-10 17:12
谢谢楼主了
作者: liangwei2017    时间: 2018-10-2 09:09
好好学习,日后有用之处
作者: gavin1985bb    时间: 2018-10-27 17:55
好东西,收藏了,自己做小玩具的时候一定用得到。
作者: samdcn    时间: 2018-11-14 14:56
学习前辈~~~
作者: ZKBG    时间: 2018-11-30 15:40
厉害。
作者: zxcv789654123    时间: 2018-12-21 10:26
这文件好像在哪见过
作者: 无色的风格    时间: 2018-12-21 14:04
学习学习
作者: 蓝琪    时间: 2018-12-23 10:13
sbit wela    =  P2^6;
sbit dula    =  P2^7;这两个是定义啥
作者: Wholala    时间: 2019-1-27 00:10
收藏
作者: 一扥的家    时间: 2019-3-14 16:39
感谢楼主大大,好人一生平安!!!
作者: 温酒斩华腾    时间: 2019-4-3 08:47
十分感谢

作者: z65856365    时间: 2019-5-13 23:04
感谢楼主分享
作者: 单片机之王啊    时间: 2019-7-30 10:20
非常好用,感谢分享
作者: asd1026    时间: 2019-9-18 10:30
感谢楼主分享
作者: xixia001    时间: 2019-10-3 21:31
下载对话框总是一闪而过,怎么回事
作者: 黄呵呵    时间: 2019-10-6 23:54
蓝琪 发表于 2018-12-23 10:13
sbit wela    =  P2^6;
sbit dula    =  P2^7;这两个是定义啥

楼主的开发板上P2^6,P2^7.有与数码管链接,所以需要定义这两个引脚,然后在初始化中关闭数码管。
作者: lvzimu5210    时间: 2019-10-8 22:00
有下载的吗,求一份1273176424@qq.com
作者: Gods    时间: 2019-10-21 00:01
感谢楼主分享,小白我拿去研究一下
作者: zxy2266    时间: 2019-10-22 17:15
学习一下,注释比较详细,适合初学者
作者: 1046298390    时间: 2019-11-19 19:29
感谢分享
作者: 岚風    时间: 2019-11-19 23:28
感谢分享
作者: 不安全    时间: 2019-11-26 11:26
原理图啥样呀
作者: 俊哥在了    时间: 2019-12-3 01:27
求仿真电路图
作者: waas1987    时间: 2020-2-12 22:31
好好学习,日后有用之处
作者: sick    时间: 2020-3-10 20:46
蓝琪 发表于 2018-12-23 10:13
sbit wela    =  P2^6;
sbit dula    =  P2^7;这两个是定义啥

数码管位选 段选
作者: yy3900636    时间: 2020-4-3 19:37
回帖是一种美德~~~~感谢分享
作者: qiangzi777    时间: 2020-4-14 08:42
感谢分享
作者: zxcb123321    时间: 2020-4-29 15:12

头文件是自己编写的吗
作者: diyfl    时间: 2020-4-30 09:58
我要二维码的,正在到处找!
作者: 阿迪H    时间: 2020-5-2 09:56
压缩包里有原理图吗?
作者: 对潇潇暮雨    时间: 2020-5-9 00:13
感谢楼主,。。。。
作者: fatelili    时间: 2020-5-11 16:22
感谢楼主,头文件要自己编写吗?
作者: lys666    时间: 2020-5-19 21:24
这跟刘清翔51单片机的教程源码一样
作者: tjpxp    时间: 2020-6-26 13:38
用来测试新买的屏,非常好用!谢谢分享!
作者: qqqqqaq    时间: 2020-12-8 13:54
用谱中的没运行成功
作者: 要好好学习    时间: 2021-1-12 20:35
请问有仿真图吗?
作者: 独帅    时间: 2021-1-25 15:25
运行不成功,屏上什么也没有

作者: 独帅    时间: 2021-1-25 15:42
额!我人傻了,我自己没搞清楚开发板上接口的位置顺序,导致显示不出来,还以为是程序的问题。楼主的程序是对的,感谢楼主大大,这对我非常有用,救我于水火之中!
作者: 2413299692    时间: 2021-4-21 20:51
蓝琪 发表于 2018-12-23 10:13
sbit wela    =  P2^6;
sbit dula    =  P2^7;这两个是定义啥

dula 段选  wela  位选

作者: h168168    时间: 2021-10-3 14:05
收藏了,自己做小玩具的时候一定用得到
作者: w18278023119    时间: 2021-12-4 19:31
独帅 发表于 2021-1-25 15:42
额!我人傻了,我自己没搞清楚开发板上接口的位置顺序,导致显示不出来,还以为是程序的问题。楼主的程序是 ...

请问最后怎么显示出来呢!我就是显示不出来!!
作者: 2928345798    时间: 2022-11-26 17:02
很好,有用




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1