学习1602的核心就是时序,一共有四种时序,但是常用的一共分为三种。分别是读状态,写指令,写数据
1 读状态
db要放置0xoo,rs为低电平,rw为高电平,使能e也要高电平,读取p0的高位,看看是否忙,只有不忙才能对液晶进行操作
2 写指令
rs和rw都为高电平,db写入指令,当e拉高电平再拉低,就能写入指令。
3 写数据
rs高电平,rw低电平,db写入数据,当e拉高电平再拉低,就能写入数据。
程序如下
#define DB P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P1^2;
void initlcd1602();
void lcdshowstr(unsigned char x,unsigned char y,unsigned char *str);
void main()
{
unsigned char str[] = "kingst xuxinyu";
initlcd1602();
lcdshowstr(2,0,str);
lcdshowstr(0,1,"welcome to hpu");
while(1);
}
void lcdwaitready()
{
unsigned char sta;
DB=0XFF;
RS=0;
RW=1;
do{
E=1;
sta=DB;
E=0;
}while(sta&0x80);
}
void lcdwritecmd(unsigned char cmd)
{
lcdwaitready();
RS=0;
RW=0;
DB=cmd;
E=1;
E=0;
}
void lcdwritedat(unsigned char dat)
{
lcdwaitready();
RS=1;
RW=0;
DB=dat;
E=1;
E=0;
}
void lcdsetcursor(unsigned x,unsigned y)
{
unsigned char addr;
if(y==0)
{
addr=0x00+x;
}
else
{
addr=0x40+x;
}
lcdwritecmd(addr|0x80);
}
void lcdshowstr(unsigned char x,unsigned char y,unsigned char *str)
{
lcdsetcursor(x,y);
while(*str!='\0')
{
lcdwritedat(*str++);
}
}
void initlcd1602()
{
lcdwritecmd(0x38);
lcdwritecmd(0x0C);
lcdwritecmd(0x06);
lcdwritecmd(0x01);
}
|