LCD1602液晶显示器
LCD1602引脚
引脚号 | 符号 | 引脚说明 | 引脚号 | 符号 | 引脚说明 |
1 | VSS | 电源地 | 9 | D2 | 数据端口 |
2 | VDD | 电源正极 | 10 | D3 | 数据端口 |
3 | VO | 偏压信号 | 11 | D4 | 数据端口 |
4 | RS | 命令/数据 | 12 | D5 | 数据端口 |
5 | RW | 读/写 | 13 | D6 | 数据端口 |
6 | E | 使能,下降沿执行指令 | 14 | D7 | 数据端口 |
7 | D0 | 数据端口 | 15 | A | 背光正极 |
8 | D1 | 数据端口 | 16 | K | 背光负极 |
基本操作
LCD1602的基本操作分为四种:
1. 读状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。
2. 读数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。
3. 写命令:输入RS=0,RW=0,E=高脉冲。输出:无。
4. 写数据:输入RS=1,RW=0,E=高脉冲。输出:无。
读时序
写时序
DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下:
电路原理图
源代码
#include<reg51.h> #include<string.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit RS = P3^5; sbit EN = P3^4; sbit RW = P3^6; uchar code table1[] = {"hello world!"}; uchar code table2[] = {"1991/02/03"}; void delay1ms(uint time);//延时N毫秒 void init_1602(void); //初始化1602 void writecmd_1602(uint cmd); //写指令函数 void writedata_1602(uchar dat); //写数据函数 void display(uchar num,uchar * table); //显示函数 int main() { init_1602(); //初始化1602 delay1ms(5); writecmd_1602(0x80); //设置显示的起始位置 delay1ms(5); display(strlen(table1),table1); writecmd_1602(0xC0); //设置显示的起始位置 delay1ms(5); display(strlen(table2),table2); while(1); return 0; } void delay1ms(uint time) { unsigned char a,b,i; for(i = time; i != 0;i--) for(b=199;b>0;b--) for(a=1;a>0;a--); } void init_1602(void) { writecmd_1602(0x38); //模式设置,8位数据,2行显示,5*8点阵字符 writecmd_1602(0x0F); //显示设置,显示开,光标显示,光标闪烁 writecmd_1602(0x06); //显示模式,写入新数据后光标右移 writecmd_1602(0x01); //清屏 } void writecmd_1602(uint cmd) { RS = 0; RW = 0; P1 = cmd; EN = 1; delay1ms(1); EN = 0; } void writedata_1602(uchar dat) { RS = 1; RW = 0; P1 = dat; EN = 1; delay1ms(1); EN = 0; } void display(uchar num,uchar * table) { uchar i; for(i = 0; i < num; i++) { writedata_1602(table[i]); } delay1ms(5); } |
自定义显示字符
写入CGRAM存储器的指令
共有64个存储区,每个8个存储区对应一个字符,所以可以自定义8个字符。如下图所示每个存储区的高3位不用。
显示自定义字符时,向DDRAM写入0x00至0x07即可,另外0x08至0x0F也能实现同样的功能。
#include<reg51.h> #define uchar unsigned char #define uint unsigned int // 自定义字符 一共可写入16个自字义字符,写入后可用其CGRAM代码直接提取显示。 uchar code Xword[]={ 0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00, //℃,代码 0x00 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, //一,代码 0x01 0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00, //二,代码 0x02 0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00, //三,代码 0x03 0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00, //四,代码 0x04 0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00, //五,代码 0x05 0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00, //六,代码 0x06 0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0xFF, //日,代码 0x07 }; sbit RS = P3^5; sbit EN = P3^4; sbit RW = P3^6; void delay1ms(uint time);//延时N毫秒 void init_1602(void); //初始化1602 void writecmd_1602(uint cmd); //写指令函数 void writedata_1602(uchar dat); //写数据函数 void CgramWrite(void) { // 装入CGRAM // uchar i; writecmd_1602(0x40); // CGRAM地址设为00处 for(i=0;i<64;i++) { writedata_1602(Xword[i]);// 按数组写入数据 } } int main() { init_1602(); //初始化1602 writecmd_1602(0xC0); //设置显示的起始位置 writedata_1602(0x00); writedata_1602(0x01); writedata_1602(0x02); writedata_1602(0x03); writedata_1602(0x04); writedata_1602(0x05); writedata_1602(0x06); writedata_1602(0x07); writedata_1602(0x20); while(1); return 0; } void delay1ms(uint time) { unsigned char a,b,i; for(i = time; i != 0;i--) for(b=199;b>0;b--) for(a=1;a>0;a--); } void init_1602(void) { writecmd_1602(0x38); //模式设置,8位数据,2行显示,5*8点阵字符 writecmd_1602(0x0F); //显示设置,显示开,光标显示,光标闪烁 writecmd_1602(0x06); //显示模式,写入新数据后光标右移 writecmd_1602(0x01); //清屏 delay1ms(5); CgramWrite(); } void writecmd_1602(uint cmd) { RS = 0; RW = 0; P1 = cmd; EN = 1; delay1ms(1); EN = 0; } void writedata_1602(uchar dat) { RS = 1; RW = 0; P1 = dat; EN = 1; delay1ms(1); EN = 0; } |
运行结果如下
附件:国内厂家的一个说明书
smc1602c
2021年8月24日