一个1602循环显示程序
          
            时间:11-27 10:28 阅读:807次
*温馨提示:点击图片可以放大观看高清大图
                
         
        
		  
               简介:这里给大家分享一个一个1602循环显示程序。
               
                        
          
            #include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P2^0;             
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
uchar code dis1[] = {"   WLCOME  TO   "};
uchar code dis2[] = {" WWW.RICHMCU.COM "};
uchar code dis3[] = {"   OT  EMOCLW   "};
uchar code dis4[] = {" MOC.UCMHCIR.WWW "};
/*******************************************************************/
/*                                                                                                                                  */
/* 延时子程序                                                                                                                  */
/*                                                                                                                                  */
/*******************************************************************/
void delay(int ms)
{                           
   int i;
   while(ms--)
   {
     for(i = 0; i< 250; i++)
     {
      _nop_();
      _nop_();
      _nop_();
      _nop_();
     }
   }
}
/*******************************************************************/
/*                                                                                                                                  */
/*检查LCD忙状态                                                                                                             */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*/
/*                                                                                                                                  */
/*******************************************************************/
bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
     result = (bit)(P0&0x80);
    LCD_EN = 0;
    return result; 
}
/*******************************************************************/
/*                                                                                                                                  */
/*写指令数据到LCD                                                                                                          */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                                                                   */
/*                                                                                                                                  */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    P0 = cmd;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                                                                                  */
/*写显示数据到LCD                                                                                                          */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                                                                     */
/*                                                                                                                                  */
/*******************************************************************/
void lcd_wdat(uchar dat) 
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    LCD_EN = 0; 
}
/*******************************************************************/
/*                                                                                                                                  */
/*  设定显示位置                                                                                                              */
/*                                                                                                                                  */
/*******************************************************************/
void lcd_pos(uchar pos)
{                          
   lcd_wcmd(pos|0x80);      //数据指针=80+地址变量
}
/*******************************************************************/
/*                                                                                                                                  */
/*  LCD初始化设定                                                                                                           */
/*                                                                                                                                  */
/*******************************************************************/
void lcd_init()
{                        
    lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);
    lcd_wcmd(0x0c);          //显示开,关光标
    delay(5);
    lcd_wcmd(0x06);          //移动光标
    delay(5);
    lcd_wcmd(0x01);          //清除LCD的显示内容
    delay(5);
}
/*******************************************************************/
/*                                                                                                                                  */
/*  闪动子程序                                                                                                                 */
/*                                                                                                                                  */
/*******************************************************************/
void flash()
{
      delay(600);                    //控制停留时间
      lcd_wcmd(0x08);            //关闭显示
      delay(200);                    //延时
      lcd_wcmd(0x0c);            //开显示
      delay(200);                    //延时
      lcd_wcmd(0x08);            //关闭显示
      delay(200);                    //延时
      lcd_wcmd(0x0c);            //开显示
      delay(200);
}
/*******************************************************************/
/*                                                                                                                                  */
/*  主程序                                                                                                                       */
/*                                                                                                                                  */
/*******************************************************************/
main()
{
    uchar i;
    delay(10);
    lcd_init();                        // 初始化LCD
    while(1)              
   { 
      lcd_wcmd(0x06);           //向右移动光标
      lcd_pos(0);                    //设置显示位置为第一行的第1个字符
      i = 0;
     while(dis1[i] != '\0')
     {                                     //显示字符"   Welcome  TO   "
       lcd_wdat(dis1[i]);
       i++;
       delay(30);                     //控制两字之间显示速度
     }
      lcd_pos(0x40);               //设置显示位置为第二行第1个字符
      i = 0;
     while(dis2[i] != '\0')
     {
       lcd_wdat(dis2[i]);          //显示字符" WWW.RICHMCU.COM "
       i++;
       delay(30);                     //控制两字之间显示速度
     }
      flash();                           //闪动二次
      lcd_wcmd(0x01);           //清除LCD的显示内容
      delay(200);                    //控制转换时间
      lcd_wcmd(0x04);           //向左移动光标
      lcd_pos(15);                  //设置显示位置为第一行的第16个字符
      i = 0;
     while(dis3[i] != '\0')
     {                                     //显示字符"   Welcome  TO   "
       lcd_wdat(dis3[i]);
       i++;
       delay(30);                     //控制两字之间显示速度
     }
      lcd_pos(0x4F);              //设置显示位置为第二行的第16个字符
      i = 0;
     while(dis4[i] != '\0')
     {
       lcd_wdat(dis4[i]);        //显示字符" WWW.RICHMCU.COM "
       i++;
       delay(30);                   //控制两字之间显示速度
     }
      flash();                         //闪动二次
      lcd_wcmd(0x01);         //清除LCD的显示内容
      delay(200);                 //控制转换时间
   }
}