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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4812|回復: 0
打印 上一主題 下一主題
收起左側

LCD1602液晶滾動字符串單片機程序詳細講解和實驗現象視頻

[復制鏈接]
跳轉到指定樓層
樓主
這里通過三種方法實現了單片機控制字符串的滾動

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

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

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

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

視頻預覽:


PPT內容預覽(內含關于1602液晶滾動顯示源程序的詳細講解):




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


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


  3. void lcd_init( void )
  4. {
  5. //========廠家復位代碼=============
  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, 光標加1
  20.         wait_busy();
  21.     write_cmd(0x0c); //清屏
  22. //=======復位代碼結束===============

  23. }

  24. void show_str(char* str, char x, char y)         //指定位置打印字符串函數
  25. {
  26.         char *p = str;
  27.         wait_busy();
  28.         write_cmd(0x06);                                                 //地址遞增,不滾屏
  29.         wait_busy();
  30.         write_cmd(0x80+y*0x40+x);                                 //計算地址
  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;                                  //計算地址
  45.         wait_busy();
  46.         write_cmd(row);                                              //寫地址
  47.         while(1)
  48.         {
  49.                 wait_busy();
  50.                 write_data(*(p));                                  //寫一個字符
  51.                 delay_ms(300);                                          //稍加延時
  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;                  //計算在哪一行
  67.         wait_busy();
  68.         write_cmd(row+offset);                  //設初始地址
  69.         while(1)
  70.         {
  71. //==============1打印一行字符串==================
  72.                 while(*p)                                    //打印一行字符
  73.                         {
  74.                                 write_data(*p);
  75.                                 p++;
  76.                         }
  77.                 write_data(' ');          //掃尾,否則最后一個字符會拖成一個長長的小尾巴                          
  78.                 delay_ms(200);                          //稍加延時
  79. //=============2將字符串打印的位置移動============
  80.                 if(offset>0)offset--;          //字符串整體左移
  81.                 else n++;                                  //當移到頭了,把字符串的頭去掉
  82.                 write_cmd(row+offset);          //設置當前地址          
  83.                 p=str+n;                                  //從第n個字符開始打印,就是去掉字符串的頭

  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標記進來的是奇數次還是偶數次
  132.         static char *p;                                 //字符串指針,指向字符串的某個位置
  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(' ');          //掃尾,否則最后一個字符會拖成一個長長的小尾巴                          
  147.         }
  148. //===========2對字符串進行移位==========================
  149.         else                                                  //將字符串移動到一個位置顯示
  150.         {
  151.                 ft0 = 1;
  152.                 if(offset>0)offset--;          //字符串整體左移
  153.                 else n++;                                  //當移到頭了,把字符串的頭去掉

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

  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. }
復制代碼


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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜欧美a级理论片915影院 | 日韩网站在线 | 久久久久久久久99精品 | 免费观看黄 | 日韩一区二区精品 | 婷婷久久精品一区二区 | 欧美三区在线观看 | 久久久久久久av | 亚洲天堂免费在线 | 九九热在线视频 | 国产在线1 | 亚洲日本欧美日韩高观看 | 色综合一区二区 | 亚洲成人自拍 | 国产视频三级 | a级毛片毛片免费观看久潮喷 | 九九亚洲 | 成人日韩 | 免费一区二区 | 老司机久久 | 美女拍拍拍网站 | 99在线视频观看 | 日韩在线一区二区三区 | 91伊人 | 精品一区二区三区在线视频 | 日本在线观看视频 | 亚洲日本欧美日韩高观看 | 国产美女永久免费无遮挡 | 久久视频免费观看 | 成人精品一区二区三区 | 一区二区三区四区日韩 | 狠狠干美女 | 天天综合网7799精品 | 精品一二三区 | 在线免费观看黄色网址 | 热久久久 | 亚洲精品一区二区三区蜜桃久 | 亚洲国产精品久久久久婷婷老年 | 亚洲成人av在线播放 | 午夜精品久久久 | 亚洲一区二区三区在线观看免费 |