找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2017|回复: 1
收起左侧

51单片机驱动LCD1602移动显示C语言源程序

[复制链接]
ID:318620 发表于 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忙状态                                                                                                             */
  32. /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。                                      */
  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. /*写指令数据到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. /*写显示数据到LCD                                                                                                          */
  78. /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                                                                     */
  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);      //数据指针=80+地址变量
  107. }

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

  113. void lcd_init()
  114. {
  115.     delay(15);                     //等待LCD电源稳定        
  116.     lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据
  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, 下载次数: 13)
回复

使用道具 举报

ID:6985 发表于 2018-7-30 17:48 | 显示全部楼层
支持下,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表