简单的介绍一下LCD1602
每行显示16个字符,一共有两行,每个字符由5*7个点显示。
着重介绍下面几个管脚
管脚名字 | 功能 |
---|---|
r/s | 数据命令选择端,高电平为数据端,低电平为命令端 |
r/w | 读写选择端,高电平为读,低电平为写 |
en | 使能信号端 |
D0~D7 | 数据I/O口 |
VL | 液晶显示偏压信号,多和10kΩ蓝白电阻配合使用 |
控制接口的简单说明
如果你只是把液晶屏当作显示工具,只需执行,写指令和写数据两步(图中的1.2和1.4)
还有的就是为了减低代码的难度,这里就不进行查忙了,在每步操作之后留有一定的延时即可。
下面是写数据的时序图
依据这个写操作的时序图,再加上控制器说明这两张图片可以得到以下两个自定义函数函数,写时序的时候还要考虑编译的环境和使用的芯片,我使用的是AT89C51,
延时函数
void delay(int z) //延时1ms
{
int i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void write_com(uchar com) //写指令函数
{
rs = 0;
P0 = com;
delay(5);
en = 1;
delay(5);
en = 0;
}
void write_data(uchar date ) //写数据函数
{
rs = 1;
P0 = date;
delay(5);
en =1;
delay(5);
en = 0;
}
LCD1602的初始化函数,下图
void int(void)
{
rw = 0;
write_com(ox01);//清屏命令
write_com(ox38);//lcd模式设置
write_com(ox0f);//开显示,显示光标,光标闪烁
}
主函数
lcd的RAM地址
从图片中可以看出地址不是连续的第一行是0x00~0x27,第二行是0x40 ~0x67;
void main()
{
int i,j,mun;
unchar table[20] = "The king of world"
init();
write_com(0x80);//LCD的第一行的地址,是从这个位置开始写入数据
//如果想把数据显示在第二行,write_com(ox80+0x40);
mun = strlen(table[20]);
for(i=0;i<mun;i++)
{
write_data(table[i]);
delay(5);//延时5ms
}
while(1);
}
主要这个程序使用到strlen()需要添加头文件
#include<string.h>
#include<reg51.h>
最后给出一个我自己写的两行显示的代码
#include<reg51.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
void init(void);
void write_com(uchar com); //写命令函数
void write_data(uchar date); //写数据函数
void delay(int z);
sbit lcdrs =P2^7; //液晶屏数据/命令选择端
sbit lcdrw =P2^6; //液晶屏读写端
sbit lcden =P2^5; //使能端
void delay(int z) //延时1ms
{
int i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void write_com(uchar com) //写命令函数,注意里面的参数的类型
{
lcdrs = 0;
lcdrw = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void write_data(uchar date ) //写数据函数,注意里面的参数的类型
{
lcdrs = 1;
lcdrw = 0;
P0 = date;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void init(void)
{
lcden = 0;//默认使能端是低电平
lcdrw = 0;
write_com(0x38);//显示模式设置
write_com(0x0f);// 开显示,显示光标,光标闪烁
write_com(0x06);//当读或者写一个字符后地址加一,且光标加一
//write_com(0x07)当读或者写一个字符后地址加一,且光标加一,且写一个字符,整屏显示左移
write_com(0x80);
}
void main()
{
int mun1,mun2,i,j;
uchar table1[20]="Who am I";
uchar table2[20]="china";
mun1 = strlen(table1);
mun2 = strlen(table2);
init();
for(i=0;i<mun1;i++)
{
write_data(table1[i]);
delay(200);
}
//重新设置显示指针
//0x80+0x40 = 0xc0
write_com(0xc0);//把指针移到第二行去显示,如果没有这句那么china会接在who am i 后面显示,会发生字符被吞的现象
for(j=0;j<mun2;j++)
{
write_data(table2[j]);
delay(200);
}
while(1);
}