找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6585|回复: 3
打印 上一主题 下一主题
收起左侧

单片机LCD1602字符液晶滚动演示程序(有注释)

[复制链接]
跳转到指定楼层
楼主
ID:762946 发表于 2020-5-27 22:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能说明:
按下K1按钮使预先设定好的字符在LCD屏上自动垂直滚动播放
按下K2按钮使预先设定好的字符在LCD屏上自动水平滚动播放按下K3按钮暂停/继续播放#include<reg51.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
void Initialize_LCD();
void DelayMS(uint ms);
void ShowString(uchar,uchar,uchar *);
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
uchar code Prompt[]="Press K1 - K3 ToStart Demo Prog";
//待滚动显示的信息段落,每行不超过80个字符,共6行
uchar const Line_Count=6;  
uchar code Msg[][80]=
{
       "ManyCAD users dismiss schematic capture as a necessary evil in the ",
       "processof creating PCB layout but we have always disputed this point ",
       "ofview. With PCB layout now offering automation of both component ",
       "canoften be the most time consuming element of the exercise.",
       "Andif you use circuit simulation to develop your ideas, ",
       "youare going to spend even more time working on the schematic."
};
//显示缓冲(2行)
uchar Disp_Buffer[32];
//垂直滚动显示
void V_Scroll_Display()
{
       uchari,j,k=0;
       uchar*p=Msg[0];
       uchar*q=Msg[Line_Count]+strlen(Msg[Line_Count]);
       //以下仅使用显示缓冲的前16字节空间
       while(p<q)
       {
              for(i=0;i<16&&p<q;i++)
              {     //消除显示缓冲中待显示行首尾可能出现的空格
                     if((i==0||i==15)&&*p=='') p++;
                     if(*p!='\0')
                     {
                            Disp_Buffer[ i]=*p++;
                     }
                     else
                     {
                            if(++k>Line_Count)break;
                            p=Msg[k];                                  //p指向下一串的首地址
                            Disp_Buffer[ i]=*p++;
                     }
              }
              //不足16个字符时空格补充
              for(j=i;j<16;j++)Disp_Buffer[j]=' ';
              //垂直滚动显示
              while(F0)DelayMS(5);
              ShowString(0,0,"                 ");
              DelayMS(150);
              while(F0)DelayMS(5);
              ShowString(0,1,Disp_Buffer);
              DelayMS(150);
              while(F0)DelayMS(5);
              ShowString(0,0,Disp_Buffer);
              ShowString(0,1,"                 ");
              DelayMS(150);
       }
       //最后清屏
       ShowString(0,0,"                 ");
       ShowString(0,1,"                 ");
}
//水平滚动显示
void H_Scroll_Display()
{
       uchari,j,k=0,L=0;
       uchar*p=Msg[0];
       uchar*q=Msg[Line_Count]+strlen(Msg[Line_Count]);
       //将32个字符的显示缓冲前16个字符设为空格
       for(i=0;i<16;i++)Disp_Buffer[ i]=' ';
       while(p<q)
       {
              //忽略缓冲中首尾可能出现的空格
              if((i==16||i==31)&&*p=='') p++;
              for(i=16;i<32&&p<q;i++)
              {     
                     if(*p!='\0')
                     {
                            Disp_Buffer[ i]=*p++;
                     }
                     else
                     {
                            if(++k>Line_Count)break;
                            p=Msg[k];                                  //p指向下一串的首地址
                            Disp_Buffer[ i]=*p++;
                     }
              }
              //不足32个字符时空格补充
              for(j=i;j<32;j++)Disp_Buffer[j]=' ';
              //水平滚动显示
              for(i=0;i<=16;i++)
              {
                     while(F0)DelayMS(5);
                     ShowString(0,L,Disp_Buffer+i);
                     while(F0)DelayMS(5);
                     DelayMS(20);
              }
              L=(L==0)?1:0;             //行号在0,1间交替
              DelayMS(300);
       }
       //如果显示结束时停留在第0行,则清除第1行的内容
       if(L==1)ShowString(0,1,"                ");   
}
//外部中断0,由K3控制暂停与继续显示
void EX_INT0() interrupt 0
{
       F0=!F0;         //暂停与继续显示控制标志位
}
//主程序
void main()
{
       uintCount=0;
       IE=0x81;       //允许外部中断0
       IT0=1;                  //下降沿触发
       F0=0;                   //暂停与继续显示控制标志位
       Initialize_LCD();
       ShowString(0,0,Prompt);
       ShowString(0,1,Prompt+16);
       while(1)
       {
              if(K1==0)
              {
                     V_Scroll_Display();
                     DelayMS(300);
              }
              else
              if(K2==0)
              {     
                     H_Scroll_Display();
                     DelayMS(300);     
              }
       }
}
//LCD1602.c
/*    名称:液晶控制与显示程序
       说明:本程序是通用的1602液晶控制程序。
*/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
//延时
void DelayMS(uint ms)
{
       uchari;
       while(ms--)for(i=0;i<120;i++);
}
//忙检查
uchar Busy_Check()
{
       ucharLCD_Status;
       RS=0;                          //寄存器选择
       RW=1;                         //读状态寄存器
       EN=1;                         //开始读
       DelayMS(1);
       LCD_Status=P0;
       EN=0;
       returnLCD_Status;
}
//写LCD命令
void Write_LCD_Command(uchar cmd)
{
       while((Busy_Check()&0x80)==0x80);       //忙等待
       RS=0;            //选择命令寄存器
       RW=0;           //写
       EN=0;   
       P0=cmd;EN=1;DelayMS(1);EN=0;
}
//发送数据
void Write_LCD_Data(uchar dat)
{
       while((Busy_Check()&0x80)==0x80);       //忙等待
       RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;
}
//LCD初始化
void Initialize_LCD()
{
       Write_LCD_Command(0x38);DelayMS(1);
       Write_LCD_Command(0x01);DelayMS(1);       //清屏
       Write_LCD_Command(0x06);DelayMS(1);       //字符进入模式:屏幕不动,字符后移
       Write_LCD_Command(0x0c);DelayMS(1);       //显示开,光标关
}
//显示字符串
void ShowString(uchar x,uchar y,uchar *str)
{
       uchari=0;
       if(y==0)Write_LCD_Command(0x80|x);   //设置显示起始位置
       if(y==1)Write_LCD_Command(0xc0|x);
       for(i=0;i<16;i++)                               //输出字符串
       {
              Write_LCD_Data(str[ i]);
       }
}




仿真图.jpg (173.36 KB, 下载次数: 89)

仿真原理图

仿真原理图

Keil C.7z

7.95 KB, 下载次数: 76, 下载积分: 黑币 -5

源程序

1602字符液晶滚动演示程序.zip

9.24 KB, 下载次数: 68, 下载积分: 黑币 -5

proteus仿真

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1072531 发表于 2023-4-18 18:21 | 只看该作者
我的为什么63个错误
回复

使用道具 举报

板凳
ID:1032857 发表于 2023-4-20 11:08 | 只看该作者
好资料,51黑有你更精彩,版主更牛!!!
回复

使用道具 举报

地板
ID:1073299 发表于 2023-4-22 15:13 来自手机 | 只看该作者
先收藏,以后测试看看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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