久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1934|回復: 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. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级免费视频 | 国产精品久久av | 国产福利在线视频 | 国产成人免费视频 | 综合国产在线 | 综合伊人| 亚洲av毛片成人精品 | 在线电影日韩 | av中文字幕在线观看 | 国产成人aⅴ | 超碰男人天堂 | 亚洲国产免费 | 青娱乐自拍 | 日本不卡视频在线播放 | a在线观看免费 | 亚洲三区在线 | 国产亚洲成av人片在线观看桃 | aaa在线| 亚洲精品天堂 | 九九精品网 | 精品日韩一区 | 亚洲成人精品 | 日韩成人在线观看 | 成年人的视频免费观看 | 欧美精品一区三区 | 久久久精品一区二区 | 亚洲成人999 | 欧美日韩亚洲一区二区 | 精品国产乱码久久久久久图片 | 激情欧美一区二区三区中文字幕 | 国产日韩精品一区二区 | 日韩靠逼| 一区二区三区国产好的精 | 99re国产精品 | 一区二区欧美在线 | 国产福利在线 | 亚洲三级av| 久久久噜噜噜www成人网 | 亚洲第一成人av | 国产精品久久久久久吹潮 | 国产一区二区成人 |