找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8385|回复: 8
收起左侧

LCD12864串行显示中文或数字程序

[复制链接]
ID:442599 发表于 2019-3-6 20:42 | 显示全部楼层 |阅读模式
  1. /*lcd12864只需三根线与单片机相连就可以实现串行通讯,lcd12864自带ASCII码库  以下是程序代码*/
  2. #include"reg52.h"

  3. #include"intrins.h"

  4. #define uint unsigned int

  5. #define uchar unsigned char

  6. #define x1 0x80

  7. #define x2 0x88

  8. #define y 0x80

  9. #define comm 0//0代表写指令

  10. #define dat 1//1代表写数据

  11. sbit LCD_cs =P2^7;

  12. sbit LCD_std =P2^6;

  13. sbit LCD_sclk =P2^5;

  14. void wr_lcd(uchar dat_comm,uchar content);

  15. void delay (uint us);

  16. void lcd_char(uchar x0,uchar y0,uchar k,uchar *chn);

  17. void init_lcd(void);

  18. void lcd_string(uchar x0,uchar y0,uchar k,uchar *chn);

  19. //------------------初始化 -----------------

  20. void init_lcd(void)

  21. {

  22. //rst=1;

  23.         wr_lcd(comm,0x30);//30---基本指令动作

  24.         wr_lcd(comm,0x01);//清屏,地址指针指向 00H

  25.         wr_lcd(comm,0x06);//光标的移动方向

  26.         wr_lcd(comm,0x0c);//开显示,关游标

  27. }

  28. void wr_lcd(uchar dat_comm,uchar content)

  29. {

  30.         uchar a,i,j;

  31.         delay (500);//此延时是必须的,以防在连续操作中 LCD 内部动作没有完成, 不响应后面的指令或数据

  32.         a=content;

  33.         LCD_cs=1;

  34.         _nop_();

  35.         LCD_sclk=0;

  36.         _nop_();

  37.         LCD_std=1;

  38.         _nop_();

  39.         for(i=0; i<5; i++)

  40.         {
  41.                 LCD_sclk=1;

  42.                 _nop_();

  43.                 _nop_();

  44.                 _nop_();

  45.                 LCD_sclk=0;

  46.         }

  47.         LCD_std=0;

  48.         _nop_();

  49.         LCD_sclk=1;

  50.         _nop_();

  51.         _nop_();

  52.         _nop_();

  53.         LCD_sclk=0;

  54.         _nop_();

  55.         if(dat_comm)   //如果 dat_comm为高则表示送的是显示数据
  56.                 LCD_std=1;   //data

  57.         else                                          //如果 dat_comm为低则表示送的是控制指令

  58.                 LCD_std=0;         //command

  59.         LCD_sclk=1;

  60.         _nop_();

  61.         _nop_();

  62.         _nop_();

  63.         LCD_sclk=0;

  64.         LCD_std=0;

  65.         _nop_();

  66.         LCD_sclk=1;

  67.         _nop_();

  68.         _nop_();

  69.         _nop_();

  70.         LCD_sclk=0;

  71.         for(j=0; j<2; j++)

  72.         {

  73.                 for(i=0; i<4; i++)

  74.                 {

  75.                         a=a<<1;

  76.                         LCD_std=CY;

  77.                         LCD_sclk=1;

  78.                         _nop_();

  79.                         _nop_();

  80.                         _nop_();

  81.                         LCD_sclk=0;

  82.                 }

  83.                 LCD_std=0;

  84.                 for(i=0; i<4; i++) {

  85.                         LCD_sclk=1;

  86.                         _nop_();

  87.                         _nop_();

  88.                         _nop_();

  89.                         LCD_sclk=0;

  90.                 }

  91.         }

  92. }

  93. void delay (uint us)//delaytime

  94. {

  95.         while(us--);

  96. }

  97. void delay1(uint ms)

  98. {

  99.         uint i,j;

  100.         for(i=0; i<ms; i++)

  101.                 for(j=0; j<15; j++)

  102.                         delay(1);

  103. }

  104. //-------在任意位置显示一串汉字或字符 ------

  105. //其中 一个汉字算两个个字节

  106. //X0为行, Y0为列, chn 为所要显示的汉字串 ,k 为字符个数
  107. void lcd_char(uchar x0,uchar y0,uchar k,uchar *chn)

  108. {

  109.         uchar adr,i;

  110.         switch(x0)

  111.         {

  112.                 case 1:
  113.                         adr =0x80+y0;
  114.                         break; //在第 1行 y 列显示
  115.                 case 2:
  116.                         adr =0x90+y0;
  117.                         break; //在第 2行 y 列显示
  118.                 case 3:
  119.                         adr =0x88+y0;
  120.                         break; //在第 3行 y 列显示
  121.                 case 4:
  122.                         adr =0x98+y0;
  123.                         break; //在第 4行 y 列显示
  124.                 default:
  125.                         ;

  126.         }

  127.         wr_lcd(comm,adr);

  128.         for(i=0; i<k; i++)

  129.                 wr_lcd(dat,chn[i]);

  130. }

  131. //------------------主程序 --------------------

  132. void main ()

  133. {

  134.         uchar chn[3]= {0x32,0x31,0x33};
  135. //        uchar chn[6]= {32,50,32,54,32,56};
  136. //        uchar b[]= {"欢迎使用本程序 "};
  137. //
  138. //        uchar b1[]= {"啦啦啦啦 "};
  139. //        char b2[]= {"欢迎你 "};

  140.         init_lcd();

  141.         while (1)

  142.         {

  143.         //        lcd_char(1,0,14,b);//显示汉字

  144.                 lcd_char(2,0,3,chn);//显示字符串

  145.         //        lcd_char(3,0,12,b1);

  146.         //        lcd_char(4,0,6,b2);

  147.                 delay1(8000);//此处延时是为了防止送显示过快,屏会闪动
  148.         }

  149. }
复制代码

LCD12864串行显示.zip

58.75 KB, 下载次数: 192, 下载积分: 黑币 -5

评分

参与人数 1黑币 +5 收起 理由
阿斯顿ll + 5

查看全部评分

回复

使用道具 举报

ID:1 发表于 2019-3-7 00:35 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:337280 发表于 2019-4-22 09:47 来自手机 | 显示全部楼层
好用,之前一直在用的串行显示,不能直接显示一个数组,这个很清楚。谢谢楼主
回复

使用道具 举报

ID:337280 发表于 2019-4-22 15:24 来自手机 | 显示全部楼层
有点问题,只能显示第一行,其他显不了
回复

使用道具 举报

ID:524818 发表于 2019-5-9 21:41 | 显示全部楼层
电原理图哪儿?有点不太明白
回复

使用道具 举报

ID:524818 发表于 2019-5-9 23:02 | 显示全部楼层
为啥我这里只显示213?
回复

使用道具 举报

ID:706719 发表于 2020-3-11 22:50 | 显示全部楼层
有没有Proteus仿真图呢
回复

使用道具 举报

ID:727600 发表于 2020-4-12 16:15 | 显示全部楼层
你好 ,148行 的 cy是 ‘0’还是‘1’
回复

使用道具 举报

ID:819974 发表于 2020-12-23 17:08 | 显示全部楼层
mjy-jay 发表于 2020-4-12 16:15
你好 ,148行 的 cy是 ‘0’还是‘1’

同问,我打算移植到32,这个地方怎么改
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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