序言
本文档以一个小白的角度,详细的阐述了如何阅读LCD1602数据手册,如何连接硬件,如何编程,当然,还是需要你有基本的电路知识以及编程知识,如果没有,可以看我往期发布的有关【电路基础】和【编程基础】的文章。
数据手册
数据手册,是拿到一个硬件后,第一个要研读的对象,数据手册中详细的描述了当前这个硬件的功能、应用场景、使用方法以及使用范例,本文中就使用了 LCD1602A 的数据手册,如果你有需要可以在文章顶部下载
开始
硬件连接
打开数据手册,通过手册可知硬件链接方式:
这里,我们使用STC89C52是一样的连接方式,在此,为了方便后面的编程,这里我们约定一些规定,当然你也可以根据你的实际情况来确定:
STC89C52RC | LCD1602A |
---|---|
P01~P07 | DB0~DB7 |
P21 | LCD_RS |
P22 | LCD_RW |
P23 | LCD_E |
V0引脚,通过电位器,接到GND,可以用来调节显示屏的清晰度,为了测试你的屏幕是否正常,你可以将 V0 直接接到GND或VCC,如果接到GND,能看到5*8的点阵,接到VCC则看不到,说明你的LCD是正常的
编程及阅读数据手册
按上图,就能发现他分指令数据和显示数据,那么他们分别对应是什么呢,接下来我们需要关注数据手册的第四部分:
那么,通过这个内部结构,我们就可以清晰的知道,这个LCD1602A,他内部分为指令寄存器(IR)和数据寄存器(DR),针对这个图,我们稍微做一下解释:
- 注意: 数据手册中读写数据部分的RS标识有误,可以看下图,通过阅读后面的文档,我们可以印证这一点
好了,到这里,我们就可以开始编写我们的程序了,写指令和写数据,具体的指令有哪些,我们到后面再看,这里先完成两个函数,一个是写指令,一个是写数据,在写程序之前呢,我们需要先进行引脚的定义,还记得我们前面说过的约定吧,我们就参照约定进行定义
#include <stc89c52rc.h>
#define LCD_DATA_PORT P0 // 这就是将 P0~P7 全部放到 LCD_DATA_PORT 中
sbit LCD_RS = P2^1;
sbit LCD_RW = P2^2;
sbit LCD_EN = P2^3;
同时呢,为了保证程序能顺利执行,我们需要一个延时函数
// 延时函数
void Delay(unsigned int ms)
{
unsigned char i, j;
while(ms--) {
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
写指令
// 写指令
void LCD_Write_Command(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA_PORT = cmd;
LCD_EN = 1;
Delay(1);
LCD_EN = 0;
}
写数据
// 写数据
void LCD_Write_Data(unsigned char data)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA_PORT = data;
LCD_EN = 1;
Delay(1);
LCD_EN = 0;
}
到这里,我们已经把两个函数完成了,那么应该如调用呢,两个函数要传的参数是什么呢,接下继续阅读文档:
更详细的,可以自行查看数据手册,这里我截图了几个必须要用到的,通过阅读我们知道,
写指令有:
- 清屏
- 归位
- 设置输入模式
- 显示以及光标的开/关控制
- 光标以及显示的移位
- 功能设置
写数据有:
- 写数据到 CGRAM 或 DDRAM
参考文档,我们对上述进行整理,可以知道分别对应的二进制,以及转换后的十六进制,如果对进制转换不清楚,可以看往期二进制、八进制、十进制、十六进制之间的转换
功能 | 二进制 | 十六进制 |
---|---|---|
清屏 | 0000 0001 | 0x01 |
归位 | 0000 0010 | 0x02 |
字符写入后,光标右移 | 0000 0111 | 0x07 |
显示开,光标开,闪烁开 | 0000 1111 | 0x0f |
设置光标位置 | - | - |
设置5*7,16例2行展示 | 0011 1000 | 0x38 |
通过归纳,我们就可以调用函数进行功能的实现了,比如清屏,我们可以调用函数如下
LCD_Write_Command(0x01);
好了,我们可以开始我们的 main 函数的编写了
void main()
{
// 对屏幕进行初始化
// 1. 设置5*7,16列2行展示
LCD_Write_Command(0x38);
// 2. 设置光标的起始位置 第一行第一列
LCD_Write_Command(0x80 | 0);
// 设置光标的起始位置 第二行第一列
// LCD_Write_Command(0xc0 | 0);
// 3. 设置显示开,光标开,闪烁开
LCD_Write_Command(0x0f);
// 4. 清屏
LCD_Write_Command(0x01);
// 5. 写数据
LCD_Write_Data('h')
}
注意,写数据时,这里只能传入单个字符,如果想要实现传入字符串,可以自己定义函数处理,如下
void LCD_Show_Str(unsigned char *str)
{
while(*str) {
LCD_Write_Data(*str);
str++;
}
}
这样就可以传入多个字符了,调用如下:
LCD_Show_Str("Hello World");
最后
根据数据手册,我们只能输出特定的196个字符,且不能输出中文,但是,你知道吗?我们仍然可以通过自定义字模的方式实现输出中文,虽然复杂的字不能实现,且自定义数量有限,但不能阻止我们搞研究的心嘛,看图: