【单片机】让STC89C52点亮你的LCD1602A显示屏

序言

本文档以一个小白的角度,详细的阐述了如何阅读LCD1602数据手册,如何连接硬件,如何编程,当然,还是需要你有基本的电路知识以及编程知识,如果没有,可以看我往期发布的有关【电路基础】和【编程基础】的文章。

数据手册

数据手册,是拿到一个硬件后,第一个要研读的对象,数据手册中详细的描述了当前这个硬件的功能、应用场景、使用方法以及使用范例,本文中就使用了 LCD1602A 的数据手册,如果你有需要可以在文章顶部下载

开始

硬件连接

打开数据手册,通过手册可知硬件链接方式:
LCD1602A电路链接图
这里,我们使用STC89C52是一样的连接方式,在此,为了方便后面的编程,这里我们约定一些规定,当然你也可以根据你的实际情况来确定:

STC89C52RCLCD1602A
P01~P07DB0~DB7
P21LCD_RS
P22LCD_RW
P23LCD_E

V0引脚,通过电位器,接到GND,可以用来调节显示屏的清晰度,为了测试你的屏幕是否正常,你可以将 V0 直接接到GND或VCC,如果接到GND,能看到5*8的点阵,接到VCC则看不到,说明你的LCD是正常的

编程及阅读数据手册

引脚说明
按上图,就能发现他分指令数据和显示数据,那么他们分别对应是什么呢,接下来我们需要关注数据手册的第四部分:
LCM内部结构
那么,通过这个内部结构,我们就可以清晰的知道,这个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 00010x01
归位0000 00100x02
字符写入后,光标右移0000 01110x07
显示开,光标开,闪烁开0000 11110x0f
设置光标位置--
设置5*7,16例2行展示0011 10000x38

通过归纳,我们就可以调用函数进行功能的实现了,比如清屏,我们可以调用函数如下

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个字符,且不能输出中文,但是,你知道吗?我们仍然可以通过自定义字模的方式实现输出中文,虽然复杂的字不能实现,且自定义数量有限,但不能阻止我们搞研究的心嘛,看图:

输出中文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值