【STC89C52单片机如何点亮LCD1602A显示屏】

序言

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

数据手册

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

开始

硬件连接

打开数据手册,通过手册可知硬件链接方式:
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是正常的

编程及阅读数据手册

引脚说明
按上图,就能发现他分指令数据和显示数据,那么他们分别对应是什么呢,接下来我们需要关注数据手册的第四部分:
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 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个字符,且不能输出中文,但是,你知道吗?我们仍然可以通过自定义字模的方式实现输出中文,虽然复杂的字不能实现,且自定义数量有限,但不能阻止我们搞研究的心嘛,看图:

    输出中文

    作者:大事龙

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STC89C52单片机如何点亮LCD1602A显示屏】

    发表回复