找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机LCD1602从左到右、从右到左显示,proteus仿真程序

[复制链接]
ID:582255 发表于 2021-1-28 14:26 | 显示全部楼层 |阅读模式
*  描述:                LCD1602 滚动显示                                       *
* 显示方式:                                                                   *
* 1、从左到右逐字显示,闪动二次,清屏。                                        *
* 2、再从右到左逐字显示,闪动二次,清屏。                                      *
* 3、周期性地重复上述显示方式。                                                *                           
同时带仿真


        #include <reg51.h>        //51寄存器文件
        #include <intrins.h>
        
        typedef unsigned char BYTE;        //用BYTE代替unsigned char
        typedef bit BOOL;  // 用BOOL代替bit
        
        sbit LCD_RS = P2^6;  //寄存器选择(RS=0,命令寄存器;RS=1,数据寄存器)            
        sbit LCD_RW = P2^5;         //读写端(RW=1,读;RW=0,写)
        sbit LCD_EP = P2^7;         //使能端
        
        BYTE code dis1[] = {"   WELCOME  TO  "};
        BYTE code dis2[] = {"   MY  ZONE ST  "};
        BYTE code dis3[] = {"   OT  EMOCLEW  "};
        BYTE code dis4[] = {"   TS ENOZ  MY  "};

/****************延时函数************************/        
        void delay(int ms)
        {                    //延时子程序
        int i;
        while(ms--)
        {
          for(i = 0; i< 250; i++)
          {
           _nop_();          //空执行
           _nop_();
           _nop_();
           _nop_();
          }
        }
        }

/****************查忙函数************************/               
        BOOL lcd_bz()
        {                        
        BOOL result;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_EP = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        result = (BOOL)(P0 & 0x80);         //检测P0最高位是否为1
        LCD_EP = 0;
        return result;//返回查忙结果
        }

/****************写命令函数************************/        
        void lcd_wcmd(BYTE cmd)
        {                          // 写入指令数据到LCD
        while(lcd_bz());
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_EP = 0;
        _nop_();
        _nop_();
        P0 = cmd; //将8位指令通过P0口传给1602
        _nop_();
        _nop_(); //用于产生一个脉冲宽度
        _nop_();
        _nop_();
        LCD_EP = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD_EP = 0;  
        }
        
        void lcd_pos(BYTE pos)
        {                          //设定显示位置
        lcd_wcmd(pos | 0x80);
        }

/****************写数据函数************************/        
        void lcd_wdat(BYTE dat)
        {                   //写入字符显示数据到LCD
        while(lcd_bz());
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_EP = 0;
        P0 = dat;  //将8位数据通过P0口传给1602
        _nop_();
        _nop_();   //用于产生一个脉冲宽度
        _nop_();
        _nop_();
        LCD_EP = 1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD_EP = 0;
        }
        
        void lcd_init()
        {                   //LCD初始化设定
        lcd_wcmd(0x38);     //16*2显示,5*7点阵,8位数据
        delay(1);
        lcd_wcmd(0x0c);     //显示开,关光标
        delay(1);
        lcd_wcmd(0x06);     //移动光标
        delay(1);
        lcd_wcmd(0x01);     //清除LCD的显示内容
        delay(1);
        }

/****************主函数************************/        
        main()
        {
            BYTE i;
            lcd_init();// 初始化LCD
            delay(10);
        
            while(1)              
           {
              lcd_wcmd(0x06);//向右移动光标
              lcd_pos(0);//设置显示位置为第一行的第1个字符
              i = 0;
             while(dis1[ i ] != '\0')
             {   //显示字符"WLCOME  TO"
               lcd_wdat(dis1[ i ]);
               i++;
               delay(30);//控制两字之间显示速度
             }
              lcd_pos(0x40);//设置显示位置为第二行第1个字符
              i = 0;
             while(dis2[ i ] != '\0')
             {
               lcd_wdat(dis2[ i ]);//显示字符" HUANGHUAI  "
               i++;
               delay(30);//控制两字之间显示速度
             }
              delay(800);//控制停留时间
        
              lcd_wcmd(0x01);//清除LCD的显示内容
              delay(1);
              lcd_wcmd(0x04);//向左移动光标
            
              lcd_pos(15);//设置显示位置为第一行的第16个字符
              i = 0;
             while(dis3[ i ] != '\0')
             {                 //显示字符"WLCOME  TO"
               lcd_wdat(dis3[ i ]);
               i++;
               delay(30);          //控制两字之间显示速度
             }
              lcd_pos(0x4F);      //设置显示位置为第二行的第16个字符
              i = 0;
             while(dis4[ i ] != '\0')
             {
               lcd_wdat(dis4[ i ]);  //显示字符" HUANGHUAI  "
               i++;
               delay(30);       //控制两字之间显示速度
             }
              delay(800);       //控制停留时间
        
              lcd_wcmd(0x01);   //清除LCD的显示内容
              delay(200);       //控制两屏转换时间
                  
           }
        }
         
         


51hei截图20210128142235.png

lcd1602的应用.zip

85.55 KB, 下载次数: 23, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:582255 发表于 2021-1-29 11:43 | 显示全部楼层
为什么proteus仿真时下面有黄色提示,但是不影响仿真
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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