从前村里的狗蛋捡到了阿拉丁神灯,狗蛋向神灯许了三个愿望。第一个愿望狗蛋说“我想学会如何驱动LCD1602”,神灯说:“so easy”,然后把这篇博客的链接发给了他。神灯问他还有两个愿望是什么,狗蛋说:“希望神灯给这篇博客点赞加评论”,神灯看了文章但是忘记点赞,三天后,神灯猝。
目录
1. LCD1602基本介绍
2. LCD1602原理图
3. 引脚说明
4. 基本时序操作
5. 状态字说明
6. 1602地址映射
7. 指令说明
8. 程序及仿真
OK,这当然是和大家开个玩笑,你们的肯定就是对我最大的支持与鼓励,在接触我们的1602之前先来放松一下神经,接下来,我们就来了解LCD1602不能说的秘密。
管他三七二十一,我用液晶显示器————我国著名诗人1602。
LCD1602基本介绍:
从他的名言中我们可以定性的知道,LCD1602是一款液晶显示器。
LCD是 Liquid Crystal Display也就是液晶显示器的英文缩写。
1602是由于他可显示的区域是由16列2行的小黑块构成,如下图:
LCD1602原理图:
引脚说明:
引脚 | 功能说明 |
---|---|
GND、VCC | 1,2号是电源正负极,15,16号是LCD背光电源正负极 |
VEE | 液晶显示偏压信号,给的电压不同对比度有所区别 |
RS | 数据/命令选择端(H/L) |
RW | 读写选择端(H/L) |
E | 液晶使能端 |
D0~D7 | 写入数据/命令端 |
基本时序操作:
操作 | 输入 | 输出 |
---|---|---|
读状态 | RS=L,RW=H,E=H | D0~D7状态字 |
写指令 | RS=L,RW=L.D0~D7=指令码,E=高脉冲 | 无 |
读数据 | RS=H,RW=H,E=H | D0~D7数据 |
写数据 | RS=H,RW=L,D0~D7=数据,E=高脉冲 | 无 |
(高脉冲就是一个信号由0到1再到0一个非常短暂而迅速的过程)
状态字说明:
在每次进行读写操作时,要进行读写检测,确保STA7(D7)为0。
STA0~STA6(D0-D6)为最开始写入的指针地址。
1602地址映射图:
每一行有40个字节,但是只能显示前16个字节,后面的地址主要是为了显示移动字幕而设置。
指令说明:
具体程序:
#include <reg52.h>
#define DB P3
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;
void read_sta(); //读状态
void write_data(unsigned char dat); //写数据
void write_cmd(unsigned char cmd); //写指令
void set_cursor(unsigned int x,unsigned int y); //设置初始显示位置
void show_str(unsigned int x,unsigned int y,unsigned char *str); //显示字符
void lcd_init(); //初始化LCD1602
void main()
{
lcd_init();
show_str(0,0,"LQJ_LCD1206");
show_str(0,1,"HELLO_WORLD");
while(1);
}
void read_sta()
{
unsigned char sta;
DB = 0XFF;
RS = 0;
RW = 1;
do
{
E = 1;
sta = DB;
E = 0;
}
while(sta & 0x80); //检测到STA7=0,即可开始读写操作
}
void write_data(unsigned char dat)
{
read_sta(); //对照写数据的时序来看
RS = 1;
RW = 0;
DB = dat;
E = 1;
E = 0;
}
void write_cmd(unsigned char cmd)
{
read_sta();
RS = 0; //写指令的时序来看
RW = 0;
DB = cmd;
E = 1;
E = 0;
}
void set_cursor(unsigned int x,unsigned int y)
{
unsigned char address;
if(y == 0)
address = 0x00 + x; //第一行,第x-1列
else
address = 0x40 +x; //第二行,第x-1列
write_cmd(address | 0x80); //地址或上1000 0000,写入STA0~STA6地址值
}
void show_str(unsigned int x,unsigned int y,unsigned char *str)
{
set_cursor(x,y); //设置起始位置
while(*str != '\0') //不等于结束符就继续写入数据
{
write_data(*str++);
}
}
void lcd_init()
{
write_cmd(0x38); //0011 1000,设置16X2显示,5X7点阵,8位数据接口
write_cmd(0x0c); //0000 1100,开显示,不显示光标
write_cmd(0x06); //0000 0110,读一个字符后地址指针加一
write_cmd(0x01); //0000 0001,显示清屏
}