基于51单片机LCD流水显示字母

基于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,将二进制转换为十六进制即可)
CGROM(忘记从哪找到版)

全代码

#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);//清屏
	
  }

}

运行效果图

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值