LCD1602A显示字符或字符串
2017-09-14 / 电子技术 / 1861 次围观 / 0 次吐槽 /C
#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
sbit EN=P1^4;
sbit RS=P1^6;
sbit RW=P1^5;
void LCD1602()
{
EN=0;
RS=1;
RW=1;
P0=0xff; //这里P0为与LCD D0~D7相连的I/O口
}
void read_busy()
{
P0=0xff;
RS=0;
RW=1;
EN=1;
while(P0&0x80); //P0和10000000相与,D7位若不为0,停在此处
EN=0; //若为0跳出进入下一步;这条语句的作用就是检测D7位
}
void write(uchar i,bit j)
{
read_busy();
P0=i; //其中i=0,写指令;i=1,写数据;
RS=j;
RW=0;
EN=1;
EN=0;
}
void delay(uint c) //功能为提供初始化等其他子程序中的延时1xc MS
{
uint a,b;
for(a=0;a<c;a++)
for(b=0;b<120;b++);
}
void init() //完全按照要求初始化流程来,中间省略了一步写指令38H
{
delay(15);
write(0x38,0);
delay(5);
write(0x38,0);
write(0x08,0);
write(0x01,0);
write(0x06,0);
write(0x0c,0);
}
void display_lcd_byte(uchar y,uchar x,uchar z) //Y=0,1(起始行)X=0~15(起始列)Z=想写字符的ASCII码
{ if(y) //是否显示在第二行(若在第一行Y=0,不进入IF语句,若在第二行,进入IF语句
{
x+=0x40; //第二行起始地址加上列数为字符显示地址
}
x+=0x80; //设置数据指针位置
write(x,0);
write(z,1); //写入数据
}
void display_lcd_text(uchar y,uchar x,uchar table[]) //Y,X同上字符显示,table[]字符串数组
{
uchar z=0;
uchar t;
t=strlen(table)+x; // 求得字符串长度加上起始列位置
while(x<t) //功能为LCD显示到字符串最后一个字符,防止字符串
{ //没有16个字符,从而不够位产生乱码;
display_lcd_byte(y,x,table[z]); //逐位显示数组内字符
x++;
z++;
}
}
void main()
{
LCD1602();
init();
display_lcd_byte(0,0,'C'); // 显示一个字符
display_lcd_text(1,0,"www.cheug.com"); // 显示字符串
while(1);
}
Powered By Cheug's Blog
Copyright Cheug Rights Reserved.