此文章,你将会看到,或了解到
工作电流:2mA(5V)
背光Led:10-20mA
序号 | 标识 | 功能 |
---|---|---|
1 | VSS | 电源地 |
2 | VDD | 电源正 |
3 | VL | 液晶偏压信号(对比度) |
4 | RS | 数据/命令选择(H/L) |
5 | R/W | 读/写选择(H/L) |
6 | E | 使能信号 |
7 | D0 | |
… | … | 8个状态字 |
14 | D7 | |
15 | BLA | 背光正 |
16 | BLK | 背光负 |
状态字说明
D0-D6:当前数据指针的值
D7:读写操作使能(1,禁止 0,允许)
1.2引脚是接电源
3号引脚的电流决定了液晶屏显示的对比度,这里我们直接连一个1K的电阻到地,如果你的液晶屏显示模糊,改变电阻大小就可以啦
4.5.6号引脚就是有关操作时序的引脚啦,如下图,如果你需要读取液晶屏的相关数据,RS=0,R/W=1,E=1,然后聪明的液晶屏就会在D0-D7引脚产生它的状态相关消息,这时候你只要读取D0-D7引脚信息就行啦
高脉冲的意思是指E产生变化的电平
详细例程请看下文说明
//读状态函数,在对液晶屏操作之前必须读到液晶屏“空闲”,才能进行操作
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB=0XFF;
LCD1602_RS=0;
LCD1602_RW=1;
do //等待液晶空闲
{
LCD1602_E=1;
sta=LCD1602_DB;
LCD1602_E=0;
}while(sta & 0x80); //判断D7是否为1,为1说明液晶忙,禁止读写操作
}
//写命令函数,cmd为需要写入的命令
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady(); //在读写操作前需要确定液晶空闲
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DB=cmd;
LCD1602_E=1; //这里E迅速变化,即高脉冲
LCD1602_E=0;
}
//初始化液晶
void InitLcd1602()
{
LcdWriteCmd(0x38); //设置16x2显示,每个方块5x7点阵,8位数据接口
LcdWriteCmd(0x0C); //显示器开,光标关闭
LcdWriteCmd(0x06); //文字不动,地址自动加一
LcdWriteCmd(0x01); //清屏
}
写数据函数与写命令函数类似,如下
//写数据函数
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DB=dat;
LCD1602_E=1;
LCD1602_E=0;
}
说了这么多,我不就是需要它显示一些什么吗,那么,我们开始吧,直接上代码
等等,在这之前,你需要知道
在液晶屏不同的液晶是有地址的(如下图),如果想在第一行第3个格子显示一个数字1的话,首先,你需要将地址指针设置到0x02,然后,再写入数字1的char类型(写数据函数),这样1就会被显示在那里
显示之后呢,如果这个时候再写入一个数字2会怎样呢,原来的1会瞬间变为2吗,不是的,记得初始化中的这条命令吗:
LcdWriteCmd(0x06); //文字不动,地址自动加一
它的作用就是在写入数据后(在这里是写入1)指针自动加1,即此时指针已经是0x03了,这个时候,再写入数据2,字符2就会显示在0x03的位置了,是不是很方便
//设置地址
void LcdSetCursor(unsigned char x,unsigned char 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++);
}
}
其实,有没有想过,为什么1的char数据正好可以显示1,因为,咳咳,液晶里面有这么一张表
想一想,字符1的ASCII值是不是49,十六进制为0x31,查表,第三列,第一行,是不是1
所以,只要给他发送数据0x31,是不是就会显示1了呀
看看这两行程序,效果是不是相同的呢
unsigned char array1[]="1";
unsigned char array2[]={'1'};
unsigned char array3[]={49};
unsigned char array4[]={0x31};
LcdShowStr(0,0,array1);
LcdShowStr(0,0,array2);
LcdShowStr(0,0,array3);
LcdShowStr(0,0,array4);
LcdShowStr(0,0,“What do you think it”);
小思考:这个时候,你也许就想到了,我可以显示各种奇形怪状的符号了,想一想,如果发送0xE6,会显示什么呢
这个时候,又出现了新的问题,现在,虽然可以显示除键盘以外的部分字符了,但是,还是缺少某些字符呀,比如摄氏度 华氏度,那么,这还有办法吗,当然是有的啦,不然我的另一份博客中的摄氏度怎么显示的呢
一个晚自习就过去了,很抱歉不能一次写完,如果您觉得写得挺详细,写得不错的话,给个鼓励吧,精神上的那种,比如一个赞什么的,哈哈哈,期待您的互动