简单介绍一下LCD1602的引脚、指令、热线,使用。
仿真中VEE直接接地,15,16脚是没有的!
来看一下显示地址与实际显示位置的关系:
原始显示地址为0x80,以下的地址要以0x80为初始值往上加。
第一行0x80 + 0x00 = 0x80,开始,陆续加1;
第二行0x80 + 0x40 = 0xc0,开始,陆续加1。
LCD1602常用的指令码:
对于LCD1602,经常用的还是写命令比较多。
RS = 0 的时候写命令;
RS = 1 的时候写数据。
仿真一下:
AT89C51连线,标线图
LCD1602连线、标线图
先测试一下显示单个字符,代码如下:
#include <REGX51.H>
sbit RS = P3^0;
sbit RW = P3^1;
sbit E = P3^2;
void delay(unsigned int t)
{
unsigned int i=0, j=0;
for(i=0;i<t;i++)
{
for(j=0;j<120;j++);
}
}
void writeData(unsigned char dat)
{
RS = 1;
RW = 0;
E = 0;
P2 = dat;
delay(5);
E = 1;
E = 0;
}
void writeCom(unsigned char com)
{
RS = 0;
RW = 0;
E = 0;
P2 = com;
delay(5);
E = 1;
E = 0;
}
void initLcd1602()
{
writeCom(0x38);
writeCom(0x0c);
writeCom(0x06);
writeCom(0x01);
}
void display()
{
writeCom(0x80);
delay(5);
writeData('A');
delay(5);
}
void main()
{
initLcd1602();
while(1)
{
display();
}
}
没问题,接下来再显示一个字符串,代码如下:
#include <REGX51.H>
sbit RS = P3^0;
sbit RW = P3^1;
sbit E = P3^2;
unsigned char str[] = {"Hello world!"};
void delay(unsigned int t)
{
unsigned int i=0, j=0;
for(i=0;i<t;i++)
{
for(j=0;j<120;j++);
}
}
void writeData(unsigned char dat)
{
RS = 1;
RW = 0;
E = 0;
P2 = dat;
delay(5);
E = 1;
E = 0;
}
void writeCom(unsigned char com)
{
RS = 0;
RW = 0;
E = 0;
P2 = com;
delay(5);
E = 1;
E = 0;
}
void initLcd1602()
{
writeCom(0x38);
writeCom(0x0c);
writeCom(0x06);
writeCom(0x01);
}
void display()
{
unsigned i=0;
writeCom(0x80);
delay(5);
// writeData('A');
// delay(5);
// writeData('x');
// delay(5);
// writeData(0X38);
// delay(5);
while(str[i] != '\0')
{
writeData(str[i]);
i++;
}
}
void main()
{
initLcd1602();
while(1)
{
display();
}
}
好了,显示正常,完活!