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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1492|回復(fù): 0
收起左側(cè)

單片機(jī)12864滾動(dòng)顯示程序,有什么方法能實(shí)現(xiàn)不到四行也能滾屏顯示嗎?

[復(fù)制鏈接]
ID:872344 發(fā)表于 2021-1-10 11:12 | 顯示全部樓層 |閱讀模式
按網(wǎng)上的源碼能實(shí)現(xiàn)整屏滾動(dòng),有什么方法能實(shí)現(xiàn)不到四行也能滾屏顯示嗎?求大佬指導(dǎo)一下
  1. #define uchar unsigned char
  2. #define uint  unsigned int
  3. uchar code SJ[]={"蒹葭蒼蒼,白露為霜需謹(jǐn)慎再創(chuàng)造出來(lái)的歷程都快來(lái)吃多了,段時(shí)間看好大好大很好的克拉克拉    "};
  4. /*12864端口定義*/
  5. #define LCD_data  P0             //數(shù)據(jù)口
  6. sbit RS  =  P3^5;            //寄存器選擇輸入
  7. sbit RW  =  P3^6;            //液晶讀/寫(xiě)控制
  8. sbit EN  =  P3^4;            //液晶使能控制
  9. sbit PSB =  P3^1;       //串/并方式控制
  10. sbit DU =P2^6;
  11. sbit WE = P2^7;
  12.    

  13. void delay5us()//5us延時(shí)
  14. {;;}
  15. void delay(uint z) //毫秒延時(shí)程序
  16. {
  17. unsigned char a,b;
  18. uint c;
  19.    for(c=z+7;c>0;c--)
  20.       for(b=197;b>0;b--)
  21.          for(a=2;a>0;a--);
  22. }

  23. void check_busy()//判忙
  24. {        
  25.      uchar busy;
  26.      P0=0xff;
  27.          RS=0;
  28.          RW=1;
  29.          do
  30.          {
  31.           EN=1;
  32.           busy=P0;
  33.           EN=0;
  34.            }while(busy&0x80);
  35.            EN=0;
  36. }


  37. void lcdw_dat(uchar dat)//寫(xiě)入數(shù)據(jù)
  38. {
  39.   check_busy();
  40.   RS=1;
  41.   RW=0;
  42.   EN=0;
  43.   delay5us();
  44.   P0=dat;
  45.   delay5us();
  46.   EN=1;
  47.   delay5us();
  48.   EN=0;
  49. }
  50. void lcdw_cmd(uchar cmd)//寫(xiě)入指令
  51. {
  52.   check_busy();
  53.   RS=0;
  54.   RW=0;
  55.   EN=0;
  56.   delay5us();
  57.   P0=cmd;
  58.   delay5us();
  59.   EN=1;
  60.   delay5us();
  61.   EN=0;
  62. }
  63. void lcdinit()
  64. {
  65.     DU=0;
  66.     WE=0;        
  67.     PSB = 1;         //并口方式
  68.     lcdw_cmd(0x34);      //擴(kuò)充指令操作
  69.     delay(5);
  70.     lcdw_cmd(0x30);      //基本指令操作
  71.     delay(5);
  72.     lcdw_cmd(0x0C);      //顯示開(kāi),關(guān)光標(biāo)
  73.     delay(5);
  74.     lcdw_cmd(0x01);      //清除LCD的顯示內(nèi)容
  75.     delay(5);
  76. }
  77. void main()
  78. {
  79.    unsigned char i,addr;
  80.    unsigned char flag,hang,over;
  81.    unsigned char *ptdat;
  82. lcdinit();
  83. //addr用于存儲(chǔ)寫(xiě)入地址
  84. //flag存儲(chǔ)卷動(dòng)地址,名字沒(méi)取好!
  85. //hang存儲(chǔ)下一行要寫(xiě)入數(shù)據(jù)的行號(hào)(1~4)
  86. //over記錄寫(xiě)入的空字符數(shù)
  87. //ptdat存儲(chǔ)字符串的指針
  88. delay(1);
  89. ptdat = &SJ[0];
  90. over = 0;    //寫(xiě)入空字符數(shù)
  91. //這里先把前面DDRAM中的前3行的字符數(shù)據(jù)寫(xiě)入
  92. //如果字符不足<=4行,那么不卷動(dòng),之后字符>4行才卷動(dòng)
  93. //一直到末行顯示完畢則停止卷動(dòng)
  94. lcdw_cmd(0x80); //寫(xiě)屏幕第一行字符
  95. for(i = 0; i < 16; i++)
  96. {
  97.                 if(*ptdat != '\0')
  98.                         {
  99.                                 lcdw_dat(*ptdat++);
  100.                         }
  101.                         else
  102.                         {
  103.                          lcdw_dat(0x20);
  104.                          over++;
  105.                         }
  106. }
  107. lcdw_cmd(0x90); //寫(xiě)屏幕第二行字符
  108. for(i = 0; i < 16; i++){
  109.   if(*ptdat != '\0'){
  110.    lcdw_dat(*ptdat++);
  111.   }else{
  112.    lcdw_dat(0x20);
  113.    over++;
  114.   }
  115. }
  116. lcdw_cmd(0x88);//寫(xiě)屏幕第三行字符
  117. for(i = 0; i < 16; i++){
  118.   if(*ptdat != '\0'){
  119.    lcdw_dat(*ptdat++);
  120.   }else{
  121.    lcdw_dat(0x20);
  122.    over++;
  123.   }
  124. }
  125. lcdw_cmd(0x98);//寫(xiě)屏幕第四行字符
  126. for(i = 0; i < 16; i++){
  127.   if(*ptdat != '\0'){
  128.    lcdw_dat(*ptdat++);
  129.   }else{
  130.   lcdw_dat(0x20);
  131.    over++;
  132.   }
  133. }
  134. ptdat = ptdat - 32;
  135. lcdw_cmd(0xa0); //寫(xiě)DDRAM第3行數(shù)據(jù)
  136. for(i = 0; i < 16; i++){
  137.   if(*ptdat != '\0'){
  138.    lcdw_dat(*ptdat++);
  139.   }else{
  140.    lcdw_dat(0x20);
  141.    over++;
  142.   }
  143. }
  144. ptdat = ptdat + 16;
  145. for(i = 0; i < 16; i++){
  146.   if(*ptdat != '\0'){
  147.    lcdw_dat(*ptdat++);
  148.   }else{
  149.    lcdw_dat(0x20);
  150.    over++;
  151.   }
  152. }
  153. //前面的代碼是往DDRAM中寫(xiě)如下內(nèi)容:
  154. //第一行字符   第三行字符
  155. //第二行字符   第四行字符
  156. //第三行字符   第五行字符
  157. //如果寫(xiě)第5行時(shí)全為空,說(shuō)明字符剛好4行,不卷動(dòng)。
  158. //此時(shí)第5行寫(xiě)入16個(gè)0x20空字符,over用于記錄空字符個(gè)數(shù)。
  159. //如果不足4行,則前面也將會(huì)寫(xiě)入空字符,此時(shí)寫(xiě)完了3行DDRAM后
  160. //over的值必大于16,而只要over>15,就不卷動(dòng)

  161. lcdw_cmd(0x0c);   //開(kāi)顯示
  162. if(over > 15){;}   //顯示字符不足4行,不卷動(dòng)
  163. else      //顯示字符大于4行,開(kāi)啟卷動(dòng)
  164. {
  165.   hang = 4;  //接下來(lái)要寫(xiě)DDRAM第4行數(shù)據(jù)
  166.   flag = 0x01; //初始卷動(dòng)地址為1

  167.   while(1){

  168.    switch(hang){   //設(shè)置寫(xiě)入DDRAM的地址
  169.    
  170.     case 1: addr = 0x80; break;  //往地址變量中寫(xiě)第一行首地址
  171.     case 2: addr = 0x90; break;  //往地址變量中寫(xiě)第二行首地址
  172.     case 3: addr = 0xa0; break;  //往地址變量中寫(xiě)第三行首地址
  173.     case 4: addr = 0xb0; break;  //往地址變量中寫(xiě)第四行首地址
  174.    }

  175.    switch(hang){   //指出下一次要寫(xiě)的行地址
  176.    
  177.     case 1: hang = 2; break;//第1行寫(xiě)完了,下一行要寫(xiě)第2行
  178.     case 2: hang = 3; break;//第2行寫(xiě)完了,下一行要寫(xiě)第3行
  179.     case 3: hang = 4; break;//第3行寫(xiě)完了,下一行要寫(xiě)第4行
  180.     case 4: hang = 1; break;//第4行寫(xiě)完了,下一行要寫(xiě)第1行  
  181.    }

  182. //后續(xù)代碼為往每一行寫(xiě)數(shù)據(jù),卷動(dòng)一次寫(xiě)一個(gè)字。
  183.    ptdat = ptdat - 32;
  184.    for(i = 0; i < 8; i++)
  185.          {  //寫(xiě)一行中的前8個(gè)字符
  186.     lcdw_cmd(0x34);     //打開(kāi)擴(kuò)展指令
  187.     lcdw_cmd(0x03);     //允許輸入卷動(dòng)地址
  188.     lcdw_cmd(0x40 + flag++);  //設(shè)置卷動(dòng)地址
  189.     lcdw_cmd(0x30);     //回到基本指令
  190.     lcdw_cmd(addr + i);
  191.     delay(100);

  192.     if(*ptdat != '\0')
  193.                         {
  194.                                 lcdw_dat(*ptdat++);   //寫(xiě)入高字節(jié)
  195.                         }
  196.                 else
  197.                         {
  198.                                 lcdw_dat(0x20);    //字符串結(jié)束則寫(xiě)入空字符
  199.                         }         
  200.             
  201.     if(*ptdat != '\0')
  202.                         {
  203.                                 lcdw_dat(*ptdat++);   //寫(xiě)入低字節(jié)
  204.                         }
  205.                         else
  206.                         {
  207.                                 lcdw_dat(0x20);    //字符串結(jié)束則寫(xiě)入空字符
  208.       }

  209.    }

  210.    ptdat = ptdat + 16;
  211.    for(i = 8; i < 16; i++)
  212.          {  //寫(xiě)一行中的后8個(gè)字符
  213.                         lcdw_cmd(0x34);     //打開(kāi)擴(kuò)展指令
  214.                         lcdw_cmd(0x03);     //允許輸入卷動(dòng)地址
  215.                         if(flag == 64)
  216.                         {        
  217.                                 flag = 0;
  218.                         }
  219.                         lcdw_cmd(0x40 + flag);   //設(shè)置卷動(dòng)地址
  220.                         flag++;
  221.                         lcdw_cmd(0x30);     //回到基本指令
  222.                         lcdw_cmd(addr + i);
  223.                         delay(100);
  224.          
  225.                         if(*ptdat != '\0')
  226.                         {
  227.                                 lcdw_dat(*ptdat++);   //寫(xiě)入高字節(jié)
  228.                         }
  229.                         else
  230.                         {
  231.                                  over++;       //寫(xiě)完最后一行字符,需要再卷動(dòng)16次才能顯示出來(lái)。
  232.                                  lcdw_dat(0x20);      //字符串結(jié)束則寫(xiě)入空字符  
  233.                         }         
  234.             
  235.                         if(*ptdat != '\0')
  236.                         {
  237.                                 lcdw_dat(*ptdat++);   //寫(xiě)入低字節(jié)
  238.                         }
  239.                         else
  240.                         {
  241.                                 lcdw_dat(0x20);       //字符串結(jié)束則寫(xiě)入空字符
  242.                         }
  243.                 }
  244.                  if(over < 8){;}
  245.                  else {break;}
  246.   }
  247. }
  248. }

復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黄色三级网站 | 伊人久久精品视频 | 欧美日韩在线看 | 中文字幕免费视频 | 98在线视频 | 岛国精品在线播放 | 欧美做受| av免费观看网址 | 最新国产精品视频 | 日本国产在线观看 | 午夜精品久久 | 国产成人精品免费 | 黄色一级大片 | 神马午夜影院 | 欧美三级 欧美一级 | 日韩免费看 | 理论片中文字幕 | 在线视频黄 | 久久亚洲精品视频 | 亚洲欧美综合另类 | 亚州av在线| 婷婷综合视频 | 欧美一级做性受免费大片免费 | 亚洲 欧美 综合 | 中文字幕国产在线 | 操欧美女人 | 国产理论片 | 九九热在线精品 | 色婷婷av一区二区三区之e本道 | 精品视频免费在线观看 | 日韩精品一二区 | 国产精品一区二区三区免费 | 日韩特级毛片 | 午夜久久精品 | 麻豆av片| 久久久久久久综合 | 欧美在线视频播放 | 大尺度做爰床戏呻吟舒畅 | 国产一级片免费观看 | a级片久久| 日韩中文字幕视频 |