標(biāo)題: LCD1602液晶滾動(dòng)字符串單片機(jī)程序詳細(xì)講解和實(shí)驗(yàn)現(xiàn)象視頻 [打印本頁]

作者: zc98    時(shí)間: 2019-4-13 09:20
標(biāo)題: LCD1602液晶滾動(dòng)字符串單片機(jī)程序詳細(xì)講解和實(shí)驗(yàn)現(xiàn)象視頻
這里通過三種方法實(shí)現(xiàn)了單片機(jī)控制字符串的滾動(dòng)

方法一:向液晶寫入字符串后,連續(xù)發(fā)送0x1c指令可以是整個(gè)屏幕向左滾動(dòng),0x18向右滾動(dòng)這個(gè)方法在我上傳的程序中沒有用到

方法二:通過軟件的方法讓液晶的整個(gè)屏幕滾動(dòng),效果和方法一相同,實(shí)現(xiàn)較復(fù)雜,不建議使用這種方法在lcd.c文件中封裝成了rolling_screen()函數(shù)

方法三:由于上兩種方法會(huì)將屏幕的上下兩行同時(shí)滾動(dòng),無法實(shí)現(xiàn)一行滾動(dòng)一行靜止不動(dòng),所以方法三通過:每次打印后對(duì)寫入首地址的移動(dòng)和對(duì)字符串指針的移動(dòng)來實(shí)現(xiàn)字符串的滾動(dòng)效果,這種方法在led.c文件中封裝成了rolling_str()函數(shù),這個(gè)函數(shù)僅作原理示范,不建議直接調(diào)用,
在我的程序中我把這個(gè)函數(shù)分解后放入了定時(shí)器,利用定時(shí)器完成每一次刷新,main()函數(shù)中使用的就是定時(shí)器刷新的方法

另注:time.c文件中定義了延時(shí)和定時(shí)器初始化函數(shù),是lcd.c的支持文件
關(guān)于程序更詳細(xì)的說明我放在了PPT中,版本支持位2013+
程序工程使用Keil4建立仿真使用Proteus7.8,連接方式見lcd.h文件關(guān)于底層端口的定義

視頻預(yù)覽:


PPT內(nèi)容預(yù)覽(內(nèi)含關(guān)于1602液晶滾動(dòng)顯示源程序的詳細(xì)講解):




仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include "lcd.h"
  2. #include "timer.h"


  3. void lcd_init( void )
  4. {
  5. //========廠家復(fù)位代碼=============
  6.         delay_ms(15);
  7.         write_cmd(0x38);
  8.         delay_ms(5);
  9.         write_cmd(0x38);
  10.         delay_ms(5);
  11.         write_cmd(0x38);
  12.         wait_busy();
  13.         write_cmd(0x38);
  14.         wait_busy();
  15.         write_cmd(0x08);
  16.         wait_busy();
  17.         write_cmd(0x01);
  18.         wait_busy();
  19.     write_cmd(0x06); //寫字符后地址加1, 光標(biāo)加1
  20.         wait_busy();
  21.     write_cmd(0x0c); //清屏
  22. //=======復(fù)位代碼結(jié)束===============

  23. }

  24. void show_str(char* str, char x, char y)         //指定位置打印字符串函數(shù)
  25. {
  26.         char *p = str;
  27.         wait_busy();
  28.         write_cmd(0x06);                                                 //地址遞增,不滾屏
  29.         wait_busy();
  30.         write_cmd(0x80+y*0x40+x);                                 //計(jì)算地址
  31.         while(*p)                                                                 //打印字符串
  32.         {
  33.                 wait_busy();
  34.                 write_data(*(p));
  35.                 p++;       
  36.         }
  37.        
  38. }
  39. void rolling_screen( char* str, row)
  40. {
  41.         char *p = str;                                                  //指針指向字符串
  42.         wait_busy();
  43.         write_cmd(0x07);                                          //地址遞增,滾屏
  44.         row=0x80+row*0x40+16;                                  //計(jì)算地址
  45.         wait_busy();
  46.         write_cmd(row);                                              //寫地址
  47.         while(1)
  48.         {
  49.                 wait_busy();
  50.                 write_data(*(p));                                  //寫一個(gè)字符
  51.                 delay_ms(300);                                          //稍加延時(shí)
  52.                 p++;                                                          //指針加1
  53.                 if(*p ==0)                                                  //全部寫完之后再從頭開始
  54.                 {
  55.                         p=str;
  56.                         write_cmd(row);
  57.                 }       
  58.         }

  59. }

  60. void rolling_str( char* str, row)
  61. {
  62.         char *p = str;
  63.         char  offset=16,n=0;
  64.         wait_busy();
  65.         write_cmd(0x06);                          //地址加一,不滾屏
  66.         row = 0x80+row*0x40;                  //計(jì)算在哪一行
  67.         wait_busy();
  68.         write_cmd(row+offset);                  //設(shè)初始地址
  69.         while(1)
  70.         {
  71. //==============1打印一行字符串==================
  72.                 while(*p)                                    //打印一行字符
  73.                         {
  74.                                 write_data(*p);
  75.                                 p++;
  76.                         }
  77.                 write_data(' ');          //掃尾,否則最后一個(gè)字符會(huì)拖成一個(gè)長(zhǎng)長(zhǎng)的小尾巴                          
  78.                 delay_ms(200);                          //稍加延時(shí)
  79. //=============2將字符串打印的位置移動(dòng)============
  80.                 if(offset>0)offset--;          //字符串整體左移
  81.                 else n++;                                  //當(dāng)移到頭了,把字符串的頭去掉
  82.                 write_cmd(row+offset);          //設(shè)置當(dāng)前地址          
  83.                 p=str+n;                                  //從第n個(gè)字符開始打印,就是去掉字符串的頭

  84.                 if(*p==0)                                  //字符串打印完了
  85.                 {
  86.                         write_data(' ');      //掃尾                               
  87.                         n=0;                                  //n歸零
  88.                         p=str;                                  //重新載入字符串
  89.                         offset=16;
  90.                         write_cmd(row+offset);//重置偏置
  91.                 }                                        
  92.                                          
  93.         }       
  94. }

  95. void write_cmd( unsigned char cmd)
  96. {
  97.         RS = 0;                    //寫命令
  98.         RW = 0;
  99.         DB = cmd;
  100.     LcdEN = 1;
  101.         delay_us(2);
  102.     LcdEN = 0;
  103. }
  104. void write_data(unsigned char dat)
  105. {
  106.     RS = 1;
  107.         RW = 0;
  108.     DB = dat;
  109.     LcdEN = 1;
  110.         delay_us(2);
  111.         LcdEN = 0;
  112. }

  113. void wait_busy( void )
  114. {
  115.         unsigned char sta=0x80;
  116.         DB = 0xff;                        //要先拉高
  117.         do
  118.         {
  119.                   RS = 0;
  120.                 RW = 1;
  121.             LcdEN = 1;
  122.                 delay_us(2);
  123.                 sta=DB;
  124.                 LcdEN = 0;
  125.                 _nop_();
  126.         }
  127.         while(sta&0x80);
  128. }


  129. void timer0() interrupt 1
  130. {
  131.         static bit ft0 = 1;                         //flag標(biāo)記進(jìn)來的是奇數(shù)次還是偶數(shù)次
  132.         static char *p;                                 //字符串指針,指向字符串的某個(gè)位置
  133.         static char offset=16,n=0;         //offse是在某一行的偏移地址,n與P配合
  134.         extern char *ss;                         //使用外部的字符串

  135.         TH0 = (65536-50000)/256;
  136.         TL0 = (65536-50000)%256;
  137. //=============1打印一行字符串========================
  138.         if(ft0)
  139.         {
  140.                 ft0 = 0;                                 //取反
  141.                 while(*p)                                   //打印一行字符
  142.                         {
  143.                                 write_data(*p);
  144.                                 p++;
  145.                         }
  146.                 write_data(' ');          //掃尾,否則最后一個(gè)字符會(huì)拖成一個(gè)長(zhǎng)長(zhǎng)的小尾巴                          
  147.         }
  148. //===========2對(duì)字符串進(jìn)行移位==========================
  149.         else                                                  //將字符串移動(dòng)到一個(gè)位置顯示
  150.         {
  151.                 ft0 = 1;
  152.                 if(offset>0)offset--;          //字符串整體左移
  153.                 else n++;                                  //當(dāng)移到頭了,把字符串的頭去掉

  154.                 write_cmd(0xc0+offset);          //設(shè)置當(dāng)前地址          
  155.                 p=ss+n;                                  //從第n個(gè)字符開始打印,就是去掉字符串的頭

  156.                 if(*p==0)                                  //字符串打印完了
  157.                 {
  158.                         write_data(' ');      //掃尾                               
  159.                         n=0;                                  //n歸零
  160.                         p=ss;                                  //重新載入字符串
  161.                         offset=16;
  162.                         write_cmd(0xc0+offset);//重置偏置
  163.                 }
  164.         }
  165. }
復(fù)制代碼


所有資料51hei提供下載:
ppt(程序詳細(xì)講解和實(shí)驗(yàn)現(xiàn)象視頻).rar (3.46 MB, 下載次數(shù): 22)
程序和仿真.rar (67.66 KB, 下載次數(shù): 18)






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1