找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2502|回復: 1
收起左側

51單片機驅動LCD1602移動顯示C語言源程序

[復制鏈接]
ID:318620 發(fā)表于 2018-7-30 17:32 | 顯示全部樓層 |閱讀模式
單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit LCD_RS = P2^0;            
  6. sbit LCD_RW = P2^1;
  7. sbit LCD_EN = P2^2;

  8. uchar code dis1[] = {"    CHINESE     "};
  9. uchar code dis2[] = {"    NEW YEAR    "};


  10. /*******************************************************************/
  11. /*                                                                                                                                  */
  12. /* 延時子程序                                                                                                                  */
  13. /*                                                                                                                                  */
  14. /*******************************************************************/

  15. void delay(int ms)
  16. {                           
  17.    int i;
  18.    while(ms--)
  19.    {
  20.      for(i = 0; i< 250; i++)
  21.      {
  22.       _nop_();
  23.       _nop_();
  24.       _nop_();
  25.       _nop_();
  26.      }
  27.    }
  28. }

  29. /*******************************************************************/
  30. /*                                                                                                                                  */
  31. /*檢查LCD忙狀態(tài)                                                                                                             */
  32. /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。                                      */
  33. /*                                                                                                                                  */
  34. /*******************************************************************/

  35. bit lcd_busy()
  36. {                          
  37.     bit result;
  38.     LCD_RS = 0;
  39.     LCD_RW = 1;
  40.     LCD_EN = 1;
  41.     _nop_();
  42.     _nop_();
  43.     _nop_();
  44.     _nop_();
  45.      result = (bit)(P0&0x80);
  46.     LCD_EN = 0;
  47.     return result;
  48. }

  49. /*******************************************************************/
  50. /*                                                                                                                                  */
  51. /*寫指令數(shù)據(jù)到LCD                                                                                                          */
  52. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                                                                   */
  53. /*                                                                                                                                   */
  54. /*******************************************************************/

  55. void lcd_wcmd(uchar cmd)
  56. {                          
  57.    while(lcd_busy());
  58.     LCD_RS = 0;
  59.     LCD_RW = 0;
  60.     LCD_EN = 0;
  61.     _nop_();
  62.     _nop_();
  63.     P0 = cmd;
  64.     _nop_();
  65.     _nop_();
  66.     _nop_();
  67.     _nop_();
  68.     LCD_EN = 1;
  69.     _nop_();
  70.     _nop_();
  71.     _nop_();
  72.     _nop_();
  73.     LCD_EN = 0;  
  74. }

  75. /*******************************************************************/
  76. /*                                                                                                                                  */
  77. /*寫顯示數(shù)據(jù)到LCD                                                                                                          */
  78. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                                                                     */
  79. /*                                                                                                                                  */
  80. /*******************************************************************/

  81. void lcd_wdat(uchar dat)
  82. {                          
  83.    while(lcd_busy());
  84.     LCD_RS = 1;
  85.     LCD_RW = 0;
  86.     LCD_EN = 0;
  87.     P0 = dat;
  88.     _nop_();
  89.     _nop_();
  90.     _nop_();
  91.     _nop_();
  92.     LCD_EN = 1;
  93.     _nop_();
  94.     _nop_();
  95.     _nop_();
  96.     _nop_();
  97.     LCD_EN = 0;
  98. }

  99. /*******************************************************************/
  100. /*                                                                                                                                  */
  101. /*  設定顯示位置                                                                                                              */
  102. /*                                                                                                                                  */
  103. /*******************************************************************/

  104. void lcd_pos(uchar pos)
  105. {                          
  106.    lcd_wcmd(pos|0x80);      //數(shù)據(jù)指針=80+地址變量
  107. }

  108. /*******************************************************************/
  109. /*                                                                                                                                  */
  110. /*  LCD初始化設定                                                                                                           */
  111. /*                                                                                                                                  */
  112. /*******************************************************************/

  113. void lcd_init()
  114. {
  115.     delay(15);                     //等待LCD電源穩(wěn)定        
  116.     lcd_wcmd(0x38);          //16*2顯示,5*7點陣,8位數(shù)據(jù)
  117.     delay(5);
  118.     lcd_wcmd(0x38);         
  119.     delay(5);
  120.     lcd_wcmd(0x38);         
  121.     delay(5);

  122.     lcd_wcmd(0x0c);          //顯示開,關光標
  123.     delay(5);
  124.     lcd_wcmd(0x06);          //移動光標
  125.     delay(5);
  126.     lcd_wcmd(0x01);          //清除LCD的顯示內容
  127.     delay(5);
  128. }

  129. /*******************************************************************/
  130. /*                                                                                                                                  */
  131. /*  清屏子程序                                                                                                                 */
  132. /*                                                                                                                                  */
  133. /*******************************************************************/

  134. void lcd_clr()
  135. {
  136.     lcd_wcmd(0x01);          //清除LCD的顯示內容
  137.     delay(5);
  138. }

  139. /*******************************************************************/
  140. /*                                                                                                                                  */
  141. /*  閃動子程序                                                                                                                 */
  142. /*                                                                                                                                  */
  143. /*******************************************************************/

  144. void flash()
  145. {
  146.     delay(600);                     //控制停留時間
  147.     lcd_wcmd(0x08);            //關閉顯示
  148.     delay(200);                    //延時
  149.     lcd_wcmd(0x0c);            //開顯示
  150.     delay(200);
  151.     lcd_wcmd(0x08);            //關閉顯示
  152.     delay(200);                     //延時
  153.     lcd_wcmd(0x0c);            //開顯示
  154.     delay(200);
  155. }

  156. /*******************************************************************/
  157. /*                                                                                                                                  */
  158. /*  主程序                                                                                                                       */
  159. /*                                                                                                                                  */
  160. /*******************************************************************/

  161. main()
  162. {
  163.     uchar i,j;
  164.     delay(10);
  165.     lcd_init();                          //初始化LCD

  166.     while(1)              
  167.    {
  168.       lcd_clr();

  169.       lcd_pos(0x10);               //設置顯示位置為第一行第17列
  170.       i = 0;

  171.      while(dis1[i] != '\0')
  172.      {                                      //顯示字符"    CHINESE     "
  173.        lcd_wdat(dis1[i]);
  174.        i++;
  175.      }

  176.       lcd_pos(0x50);              //設置顯示位置為第二行第17列
  177.       i = 0;

  178.      while(dis2[i] != '\0')
  179.      {
  180.        lcd_wdat(dis2[i]);         //顯示字符"    NEW YEAR    "
  181.        i++;
  182.      }

  183.      /*for(j=0;j<16;j++)          //左移動16格
  184.      {
  185.        lcd_wcmd(0x18);           //字符同時左移一格
  186.        delay(100);                   //控制移動時間
  187.      }  

  188.       flash(); */                           //閃動二次

  189.           for(j=0;j<29;j++)               //向左移動29格
  190.      {
  191.        lcd_wcmd(0x18) ;            //字符同時左移一格
  192.        delay(100) ;                    //控制移動時間
  193.      }  

  194.       for(j=0;j<13;j++)         //向右移動13格
  195.      {
  196.        lcd_wcmd(0x1C) ;          //字符同時左移一格
  197.        delay(100) ;                   //控制移動時間
  198.      }  
  199.       flash() ;                            //閃動二次


  200.    }




  201. }
復制代碼

所有資料51hei提供下載:
LCD1602 移動顯示C.rar (14.67 KB, 下載次數(shù): 13)



回復

使用道具 舉報

ID:6985 發(fā)表于 2018-7-30 17:48 | 顯示全部樓層
支持下,謝謝
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表