欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

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

搜索
查看: 4571|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)12864滾動(dòng)顯示源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:872344 發(fā)表于 2021-1-2 21:05 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用了一個(gè)星期的時(shí)間寫的12864自下而上滾動(dòng)顯示
  1. #include "csb.h"
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. uchar code SJ[]={"蒹葭蒼蒼,白露為霜需謹(jǐn)慎再創(chuàng)造出來(lái)的歷程都快來(lái)吃多了,段時(shí)間看好大好大很好的克拉克拉    "};
  5. /*12864端口定義*/
  6. #define LCD_data  P0             //數(shù)據(jù)口
  7. sbit RS  =  P3^5;            //寄存器選擇輸入
  8. sbit RW  =  P3^6;            //液晶讀/寫控制
  9. sbit EN  =  P3^4;            //液晶使能控制
  10. sbit PSB =  P3^1;       //串/并方式控制
  11. sbit DU =P2^6;
  12. sbit WE = P2^7;
  13.    

  14. void delay5us()//5us延時(shí)
  15. {;;}

  16. /*void delay20()   //20us
  17. {
  18.      unsigned char a;
  19.     for(a=109;a>0;a--);
  20. }*/



  21. void delay(uint z) //毫秒延時(shí)程序
  22. {
  23. unsigned char a,b;
  24. uint c;
  25.    for(c=z+7;c>0;c--)
  26.       for(b=197;b>0;b--)
  27.          for(a=2;a>0;a--);


  28. }

  29. void check_busy()//判忙
  30. {         

  31.      uchar busy;
  32.      P0=0xff;
  33.          RS=0;
  34.          RW=1;
  35.          do
  36.          {
  37.           EN=1;
  38.           busy=P0;
  39.           EN=0;
  40.            }while(busy&0x80);
  41.            EN=0;
  42. }


  43. void lcdw_dat(uchar dat)//寫入數(shù)據(jù)
  44. {
  45.   check_busy();
  46.   RS=1;
  47.   RW=0;
  48.   EN=0;
  49.   delay5us();
  50.   P0=dat;
  51.   delay5us();
  52.   EN=1;
  53.   delay5us();
  54.   EN=0;
  55. }


  56. void lcdw_cmd(uchar cmd)//寫入指令
  57. {
  58.   check_busy();
  59.   RS=0;
  60.   RW=0;
  61.   EN=0;
  62.   delay5us();
  63.   P0=cmd;
  64.   delay5us();
  65.   EN=1;
  66.   delay5us();
  67.   EN=0;
  68. }


  69. void lcdinit()
  70. {
  71.         
  72.     DU=0;
  73.     WE=0;        
  74.     PSB = 1;         //并口方式
  75.     lcdw_cmd(0x34);      //擴(kuò)充指令操作
  76.     delay(5);
  77.     lcdw_cmd(0x30);      //基本指令操作
  78.     delay(5);
  79.     lcdw_cmd(0x0C);      //顯示開(kāi),關(guān)光標(biāo)
  80.     delay(5);
  81.     lcdw_cmd(0x01);      //清除LCD的顯示內(nèi)容
  82.     delay(5);
  83. }

  84. /**************************************************************************************
  85. //函數(shù)功能:任意位置顯示漢字
  86. //形式參數(shù):uchar hang,uchar lie,uchar dat
  87. //行參說(shuō)明:hang(0~3) lie(0~7)
  88. //************************************************************************************/
  89. /*void lcd_display(uchar hang,lie,uchar *str)//行(0~3),列(0~7)一行最多顯示8個(gè) 漢字
  90. {//字符可以顯示8行,16列

  91.    if(hang==0) hang=0x80;
  92.    else if(hang==1) hang=0x90;
  93.    else if(hang==2) hang=0x88;
  94.    else if(hang==3) hang=0x98;
  95.    lcdw_cmd(hang+lie);

  96.    while(*str!='\0')
  97.    {
  98.    lcdw_dat(*str++);
  99.            }

  100. }*/



  101. //圖片(128*64)顯示程序
  102. /*void lcd_imp(uchar code  *imp)//code定義ROM區(qū)的指針,不可更改
  103. {
  104. uchar i,j,k;
  105. j=0x80;
  106. lcdw_cmd(0x34);
  107.   
  108. for(i=0;i<32;i++)//上半屏
  109.   {
  110.    lcdw_cmd(j++);//列地址
  111.    //lcdw_cmd(0x80);//行地址
  112.           for(k=0;k<16;k++)
  113.          {
  114.            lcdw_dat(*imp++);
  115.          }
  116.   }
  117. for(i=0;i<32;i++)
  118.   {
  119.   lcdw_cmd(j++);//列地址
  120.    lcdw_cmd(0x88);//行地址
  121.    for(k=0;k<16;k++)
  122.      {
  123.          lcdw_dat(*imp++);
  124.          }
  125. }

  126.   lcdw_cmd(0x36);        //打開(kāi)繪圖顯示
  127.   lcdw_cmd(0x30);        //回到基本指令集

  128. }*/
  129. /**************************************************************************************
  130. //函數(shù)功能:任意位置顯示字符,可以變化,不可以顯示漢字
  131. //形式參數(shù):uchar hang,uchar lie,uchar dat
  132. //行參說(shuō)明:hang(0~3) lie(0~7) 注意:1個(gè)漢字位顯示兩個(gè)字符
  133. //************************************************************************************/
  134. /*void lcd_write(uchar hang,lie,uchar dat)//12864顯示變量
  135. {
  136.    if(hang==0) hang=0x80;
  137.    else if(hang==1) hang=0x90;
  138.    else if(hang==2) hang=0x88;
  139.    else if(hang==3) hang=0x98;
  140.    lcdw_cmd(hang+lie);
  141.    lcdw_dat(0x30|dat/10);//取十位
  142.    lcdw_dat(0x30|dat%10);//取個(gè)位
  143. }*/
  144. /**************************************************************************************
  145. //函數(shù)功能:任意位置顯示字符,可以變化,不可以顯示漢字
  146. //形式參數(shù):uchar hang,uchar lie,uchar dat
  147. //行參說(shuō)明:hang(0~3) lie(0~7) 注意:1個(gè)漢字位顯示兩個(gè)字符
  148. //************************************************************************************/
  149. /*void lcd_display_dat(uchar hang,lie,uchar dat)//12864顯示變量
  150. {
  151.    if(hang==0) hang=0x80;
  152.    else if(hang==1) hang=0x90;
  153.    else if(hang==2) hang=0x88;
  154.    else if(hang==3) hang=0x98;
  155.    lcdw_cmd(hang+lie);
  156.    lcdw_dat(dat);
  157.    
  158. }*/
  159. /**************************************/
  160. //反白函數(shù),或用于非全屏繪圖時(shí),其它地方寫入0
  161. //X,Y需要反白的起始地址,如第一行,X=0x80,Y=0x80,第二行X=0x90,Y=0x90
  162. //X1需要反白多少列,如反白第一行,則X1=16
  163. //Y1為需要反白那行中的幾個(gè)字(每行最多8個(gè)字),清除一整行,則Y1=8
  164. //dat=0xff,反白   dat=0x0,清除
  165. /******************************************************************************/
  166. /*void lcd_white(uchar X,Y,X1,Y1,dat )//
  167. {
  168. uchar i,j;
  169.   
  170. for(i=0;i<X1;i++)
  171. {
  172.         for(j=0;j<Y1;j++)
  173.         {
  174.           lcdw_cmd(0x34);//打開(kāi)擴(kuò)展功能 ,關(guān)繪圖
  175.           lcdw_cmd(Y+i);
  176.           lcdw_cmd(X+j);
  177.          
  178.           lcdw_dat(dat);//D15~D8
  179.           lcdw_dat(dat);//D7~D0
  180.         }
  181. }
  182.          lcdw_cmd(0x36);//打開(kāi)擴(kuò)展功能
  183.             lcdw_cmd(0x30); //回到基本指令集
  184.    
  185. }

  186. */
  187. void main()
  188. {
  189.    unsigned char i,addr;
  190.    unsigned char flag,hang,over;
  191.    unsigned char *ptdat;


  192. lcdinit();
  193.    
  194.   
  195. //addr用于存儲(chǔ)寫入地址
  196. //flag存儲(chǔ)卷動(dòng)地址,名字沒(méi)取好!
  197. //hang存儲(chǔ)下一行要寫入數(shù)據(jù)的行號(hào)(1~4)
  198. //over記錄寫入的空字符數(shù)
  199. //ptdat存儲(chǔ)字符串的指針
  200. delay(1);
  201. ptdat = &SJ[0];
  202. over = 0;    //寫入空字符數(shù)
  203. //這里先把前面DDRAM中的前3行的字符數(shù)據(jù)寫入
  204. //如果字符不足<=4行,那么不卷動(dòng),之后字符>4行才卷動(dòng)
  205. //一直到末行顯示完畢則停止卷動(dòng)
  206. lcdw_cmd(0x80); //寫屏幕第一行字符
  207. for(i = 0; i < 16; i++)
  208. {
  209.                 if(*ptdat != '\0')
  210.                         {
  211.                                 lcdw_dat(*ptdat++);
  212.                         }
  213.                         else
  214.                         {
  215.                          lcdw_dat(0x20);
  216.                          over++;
  217.                         }
  218. }
  219. lcdw_cmd(0x90); //寫屏幕第二行字符
  220. for(i = 0; i < 16; i++){
  221.   if(*ptdat != '\0'){
  222.    lcdw_dat(*ptdat++);
  223.   }else{
  224.    lcdw_dat(0x20);
  225.    over++;
  226.   }
  227. }
  228. lcdw_cmd(0x88);//寫屏幕第三行字符
  229. for(i = 0; i < 16; i++){
  230.   if(*ptdat != '\0'){
  231.    lcdw_dat(*ptdat++);
  232.   }else{
  233.    lcdw_dat(0x20);
  234.    over++;
  235.   }
  236. }
  237. lcdw_cmd(0x98);//寫屏幕第四行字符
  238. for(i = 0; i < 16; i++){
  239.   if(*ptdat != '\0'){
  240.    lcdw_dat(*ptdat++);
  241.   }else{
  242.   lcdw_dat(0x20);
  243.    over++;
  244.   }
  245. }
  246. ptdat = ptdat - 32;
  247. lcdw_cmd(0xa0); //寫DDRAM第3行數(shù)據(jù)
  248. for(i = 0; i < 16; i++){
  249.   if(*ptdat != '\0'){
  250.    lcdw_dat(*ptdat++);
  251.   }else{
  252.    lcdw_dat(0x20);
  253.    over++;
  254.   }
  255. }
  256. ptdat = ptdat + 16;
  257. for(i = 0; i < 16; i++){
  258.   if(*ptdat != '\0'){
  259.    lcdw_dat(*ptdat++);
  260.   }else{
  261.    lcdw_dat(0x20);
  262.    over++;
  263.   }
  264. }
  265. //前面的代碼是往DDRAM中寫如下內(nèi)容:
  266. //第一行字符   第三行字符
  267. //第二行字符   第四行字符
  268. //第三行字符   第五行字符
  269. //如果寫第5行時(shí)全為空,說(shuō)明字符剛好4行,不卷動(dòng)。
  270. //此時(shí)第5行寫入16個(gè)0x20空字符,over用于記錄空字符個(gè)數(shù)。
  271. //如果不足4行,則前面也將會(huì)寫入空字符,此時(shí)寫完了3行DDRAM后
  272. //over的值必大于16,而只要over>15,就不卷動(dòng)

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

  279.   while(1){

  280.    switch(hang){   //設(shè)置寫入DDRAM的地址
  281.    
  282.     case 1: addr = 0x80; break;  //往地址變量中寫第一行首地址
  283.     case 2: addr = 0x90; break;  //往地址變量中寫第二行首地址
  284.     case 3: addr = 0xa0; break;  //往地址變量中寫第三行首地址
  285.     case 4: addr = 0xb0; break;  //往地址變量中寫第四行首地址
  286.    }

  287.    switch(hang){   //指出下一次要寫的行地址
  288.    
  289.     case 1: hang = 2; break;//第1行寫完了,下一行要寫第2行
  290.     case 2: hang = 3; break;//第2行寫完了,下一行要寫第3行
  291.     case 3: hang = 4; break;//第3行寫完了,下一行要寫第4行
  292.     case 4: hang = 1; break;//第4行寫完了,下一行要寫第1行  
  293.    }

  294. //后續(xù)代碼為往每一行寫數(shù)據(jù),卷動(dòng)一次寫一個(gè)字。
  295.    ptdat = ptdat - 32;
  296.    for(i = 0; i < 8; i++)
  297.          {  //寫一行中的前8個(gè)字符
  298.     lcdw_cmd(0x34);     //打開(kāi)擴(kuò)展指令
  299.     lcdw_cmd(0x03);     //允許輸入卷動(dòng)地址
  300.     lcdw_cmd(0x40 + flag++);  //設(shè)置卷動(dòng)地址
  301.     lcdw_cmd(0x30);     //回到基本指令
  302.     lcdw_cmd(addr + i);
  303.     delay(100);

  304.     if(*ptdat != '\0')
  305.                         {
  306.                                 lcdw_dat(*ptdat++);   //寫入高字節(jié)
  307.                         }
  308.                 else
  309.                         {
  310.                                 lcdw_dat(0x20);    //字符串結(jié)束則寫入空字符
  311.                         }         
  312.             
  313.     if(*ptdat != '\0')
  314.                         {
  315.                                 lcdw_dat(*ptdat++);   //寫入低字節(jié)
  316.                         }
  317.                         else
  318.                         {
  319.                                 lcdw_dat(0x20);    //字符串結(jié)束則寫入空字符
  320.       }

  321.    }

  322.    ptdat = ptdat + 16;
  323.    for(i = 8; i < 16; i++)
  324.          {  //寫一行中的后8個(gè)字符
  325.                         lcdw_cmd(0x34);     //打開(kāi)擴(kuò)展指令
  326.                         lcdw_cmd(0x03);     //允許輸入卷動(dòng)地址
  327.                         if(flag == 64)
  328.                         {        
  329.                                 flag = 0;
  330.                         }
  331.                         lcdw_cmd(0x40 + flag);   //設(shè)置卷動(dòng)地址
  332.                         flag++;
  333.                         lcdw_cmd(0x30);     //回到基本指令
  334.                         lcdw_cmd(addr + i);
  335.                         delay(100);
  336.          
  337.                         if(*ptdat != '\0')
  338.                         {
  339.                                 lcdw_dat(*ptdat++);   //寫入高字節(jié)
  340.                         }
  341.                         else
  342.                         {
  343.                                  over++;       //寫完最后一行字符,需要再卷動(dòng)16次才能顯示出來(lái)。
  344.                                  lcdw_dat(0x20);      //字符串結(jié)束則寫入空字符  
  345.                         }         
  346.             
  347.                         if(*ptdat != '\0')
  348.                         {
  349.                                 lcdw_dat(*ptdat++);   //寫入低字節(jié)
  350.                         }
  351.                         else
  352.                         {
  353.                                 lcdw_dat(0x20);       //字符串結(jié)束則寫入空字符
  354.                         }
  355.                 }
  356.                  if(over < 8){;}
  357.                  else {break;}
  358.   }
  359. }
  360. }

復(fù)制代碼

源碼下載,大家多多指教,如果有錯(cuò)誤,歡迎批評(píng)指正: 12864滾動(dòng)顯示.rar.rar (38.83 KB, 下載次數(shù): 71)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:120677 發(fā)表于 2021-1-3 11:10 | 只看該作者
學(xué)學(xué)練練  漲點(diǎn)水平
回復(fù)

使用道具 舉報(bào)

板凳
ID:589491 發(fā)表于 2021-1-3 16:50 | 只看該作者
第106行注釋錯(cuò)了,應(yīng)該是4行8列
回復(fù)

使用道具 舉報(bào)

地板
ID:1110416 發(fā)表于 2024-1-31 09:19 | 只看該作者
很好,內(nèi)部不錯(cuò)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表