基于51单片机的LCD1602流水显示
LCD1602
16:每行显示16个字符;
02:显示两行;
第一行显示位置:0x80~0x80+15;(0x80=0x00避免与初始化重复难以识别)
第二行显示位置:0x40~0x55;
引脚
LCD1602共有16个引脚
1、VSS 电源地
2、VCC 接电源正极
3、VL(VEE):对比度调整端
4、RS:寄存器选择;RS为1时,数据寄存器;RS为0时,指令寄存器
5、RW:读写信号线;1读;0写
6、E(EN)端为使能端;1时读取信息,0时执行命令
7~14:D0–D7为8位双向数据端
15~16:空脚或背灯电源(15:背光负极;16:背光正极)
RW=1;读 RW=0;写
RS=1;数据 RS=0;指令
E=1;数据有效
E=0;下降沿执行命令
D7~D0:数据输入/输出
LCD1602显示(HD4480)
为5* 7*32液晶显示屏(液晶显示屏不能发光)HD4480内置192个常用字符存于CGROM中;DGRAM可以自定义字符。
如果用十六进制显示字符则先观察下表想要显示字符的列,对应到行(例如:字符A为0100 0001,将二进制转换为十六进制即可)
全代码
#include <REGX51.H>
#define uchar unsigned char
int L=0;
int A=1;
int U=2;
int C=3;
int D=4;
int Y=5;
int F=6;
int G=7;
int H=8;
sbit RS=P2^7;
sbit RW=P2^6;
sbit E =P2^5;
void asd();//初始化
void check_busy();//忙检测
void write_cmd(uchar cmd);//写指令
void write_data(uchar dat);//写数据
void delay();
void main();//主函数
//初始化
void asd(){
write_cmd(0x38);//显示设置
write_cmd(0x08);//显示关闭
write_cmd(0x01);//显示清屏
write_cmd(0x06);//显示光标
write_cmd(0x0c);
}
//忙检测(检测D7是否为1)
void check_busy(){
uchar temp;
while(temp&0x80){//按位与全1为1 ,检测D7是否为1
RS=0;//指令
RW=1;//读
E=0;
delay();
temp=P0;
E=1;
delay();
E=0;
}
}
//写指令
void write_cmd(uchar cmd){
check_busy();
RS=0;//指令
RW=0;//写
E=0;
P0=cmd;
delay();
E=1;
delay();
E=0;
}
//写数据
void write_data(uchar dat){
check_busy();
RS=1;//写
RW=0;//数据
E=0;
P0=dat;
delay();
E=1;
delay();
E=0;
}
void delay() //@12.000MHz
{
unsigned char i, j;
i = 137;
j = 44;
do
{
while (--j);
} while (--i);
}
void main()//主函数
{asd();//初始化
while(1){//死循环
write_cmd(0X80+L);write_data('A');//把字母A写在lcd1602的第一行第一个
if(L==15){L=0x40;}//如果字母A位于第一行最后一个,则L=0x40(也就是第二行第一个的位置)
if(L==0x40+15){L=0;}//如果字母A位于第二行最后一个,则L=0(也就是第一行第一个的位置)
L++;//(L每自增一次,字母A向后移)一位
write_cmd(0X80+A);write_data('B');
if(A==15){A=0x40;}
if(A==0x40+15){A=0;}
A++;
write_cmd(0X80+U);write_data('C');
if(U==15){U=0x40;}
if(U==0x40+15){U=0;}
U++;
write_cmd(0X80+C);write_data('D');
if(C==15){C=0x40;}
if(C==0x40+15){C=0;}
C++;
write_cmd(0X80+D);write_data('E');
if(D==15){D=0x40;}
if(D==0x40+15){D=0;}
D++;
write_cmd(0X80+Y);write_data('F');
if(Y==15){Y=0x40;}
if(Y==0x40+15){Y=0;}
Y++;
write_cmd(0X80+F);write_data('G');
if(F==15){F=0x40;}
if(F==0x40+15){F=0;}
F++;
write_cmd(0X80+G);write_data('H');
if(G==15){G=0x40;}
if(G==0x40+15){G=0;}
G++;
write_cmd(0X80+H);write_data('I');
if(H==15){H=0x40;}
if(H==0x40+15){H=0;}
H++;
write_cmd(0x01);//清屏
}
}