找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1257|回复: 3
收起左侧

单片机+LCD12864怎么让四行汉字滚动起来?

[复制链接]
ID:986562 发表于 2021-12-20 20:41 来自手机 | 显示全部楼层 |阅读模式
这是我写的显示的代码,按键切换显示内容,如果我想实现按键变成内容滚动,应该怎么写!
单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. /*12864端口定义*/
  6. #define LCD_data  P0             //数据口
  7. sbit LCD_RS  =  P2^6;            //寄存器选择输入
  8. sbit LCD_RW  =  P2^5;            //液晶读/写控制
  9. sbit LCD_EN  =  P2^7;            //液晶使能控制
  10. sbit LCD_PSB =  P3^2;             //串/并方式控制
  11. sbit wela    =  P2^6;
  12. sbit dula    =  P2^7;
  13. sbit key     =P2^3;
  14. uchar code dis1[] = {"打电话说哈实际上"};
  15. uchar code dis2[] = {"今天星期五"};
  16. uchar code dis3[] = {"哈哈哈哈哈"};
  17. uchar code dis4[] = {"吃米线"};                  
  18. uchar code dis5[] = {"单片机哈        "};
  19. uchar code dis6[] = {"单片机哈哈"};
  20. uchar code dis7[] = {"单片机哈哈哈"};
  21. uchar code dis8[] = {"单片机哈哈哈哈"};
  22. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  23. uchar IRDIS[2];
  24. uchar IRCOM[4];
  25. void dataconv();
  26. void delay0(uchar x);  //x*0.14MS
  27. void lcd_pos(uchar X,uchar Y);  //确定显示位置
  28. /*******************************************************************/
  29. /*                                                                 */
  30. /*  延时函数                                                       */
  31. /*                                                                 */
  32. /*******************************************************************/
  33.      void delay(uint time)
  34. {  
  35.         uint x,y;
  36.   for(x=time;x;x--)
  37.         for(y=110;y;y--);
  38. }         
  39. /*******************************************************************/
  40. /*                                                                 */
  41. /*检查LCD忙状态                                                    */
  42. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  43. /*                                                                 */
  44. /*******************************************************************/
  45. bit lcd_busy()
  46. {                          
  47.     bit result;
  48.     LCD_RS = 0;
  49.     LCD_RW = 1;
  50.     LCD_EN = 1;
  51.     delayNOP();
  52.     result = (bit)(P0&0x80);
  53.     LCD_EN = 0;
  54.     return(result);
  55. }
  56. void lcd_wcmd(uchar cmd)
  57. {                          
  58.    lcd_busy();
  59.     LCD_RS = 0;
  60.     LCD_RW = 0;
  61.     LCD_EN = 1;
  62.           delay(2);
  63.     P0 = cmd;
  64.     delay(2);
  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 =1;
  79.         delay(2);
  80.     P0 = dat;
  81.     delay(2);
  82.     LCD_EN = 0;
  83. }
  84. void lcd_init()
  85. {

  86.     LCD_PSB = 1;         //并口方式
  87.     lcd_wcmd(0x34);      //扩充指令操作
  88.     delay(5);
  89.     lcd_wcmd(0x30);      //基本指令操作
  90.     delay(5);
  91.     lcd_wcmd(0x0C);      //显示开,关光标
  92.     delay(5);
  93.     lcd_wcmd(0x01);      //清除LCD的显示内容
  94.     delay(5);
  95. }


  96. /*********************************************************/
  97. /*                                                                                                                 */
  98. /* 延时x*0.14ms子程序                                                                         */
  99. /*                                                       */
  100. /*********************************************************/

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

  124. void print(uchar line,uchar *dis5)
  125. {
  126.         uchar code p[4]={0x80,0x90,0x88,0x98};
  127.         uchar i;
  128.         lcd_wcmd(p[line]);
  129.                                         for(i=0;dis5[i] != '\0';i++)                                                         
  130.                                          lcd_wdat(dis5[i]);        //显示字符
  131. }

  132. main()
  133. {

  134.         uchar i;
  135.   delay(10);                 //延时

  136.         wela=0;
  137.   dula=0;
  138.                 lcd_init();                //初始化LCD            
  139.                 while(1)
  140.     {
  141.                 if(key==0)
  142.                 {
  143.                                 print(0,dis5);
  144.                                 print(1,dis6);
  145.                                 print(2,dis7);
  146.                                 print(3,dis8);
  147.                 }
  148.         else
  149.         {
  150.                         print(0,dis1);
  151.                         print(1,dis2);
  152.                         print(2,dis3);
  153.                         print(3,dis4);               

  154.         }
  155.           }
  156. }
复制代码
回复

使用道具 举报

ID:624769 发表于 2021-12-21 00:23 | 显示全部楼层
代码就不给你了, 自己写是最好的。

如果,内存足够多, 就在内存中构建出一个假想的屏幕(buffer),屏幕宽度或者高度满足你需要显示的内容,把点阵在虚拟的屏幕上(buffer中)解析出来, 然后,所谓的屏幕滚动,就是就是把虚拟屏幕的内容,映射到真实屏幕上的时候,按一定时间的间隔, 改变虚拟屏幕(buffer)的起始坐标。
回复

使用道具 举报

ID:541008 发表于 2021-12-21 08:58 | 显示全部楼层
用循环的方式来,按照你设定的时间,比如,第一次第一个字符显示在第一行第一列,那么写下一次,全部字符往你想要方向移动就好了
回复

使用道具 举报

ID:824490 发表于 2021-12-21 10:12 | 显示全部楼层
有个万能的方法,比较粗暴,但很有效:
比如采用7920的12864屏,
如果是按字符方式,上下滚动,则页坐标+2或-2,左右滚动,则列坐标+1或-1
如要是按图形方式,上下滚动,则Y坐标+或-你想要的步进,最小是1,左右滚动,则X坐标+或-你想要的步进,最小也是1。
按一定的时间更改坐标,并刷新显示,你的屏幕就动起来了。很简单的。
不过,7920的扩展指令支持“卷屏”,可以直接选择地址,省去刷显这个动作,也是很好的方法以。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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