【单片机】通过自定义字模,让你的LCD1602A显示汉字

序言

书接上回,根据LCD1602A的数据手册,这个显示屏,本身呢它是不支持显示汉字的,但上次在文章的末尾,我贴了一张图,它很清晰的显示了汉字,这个就是我们自定义字模来实现的,那自定义字模呢,用到二进制转十六进制,如果你还不是很清楚进制的转换,可以看 二进制、八进制、十进制、十六进制之间的转换 ,如果你已经很清楚是如何转换的,那么这里会很轻松的学会如何让 LCD1602A 显示汉字。

准备工作

前面我们已经实现了点亮 LCD1602A,这里,我们直接使用已有代码,就不再赘述,如果你是第一次看到这篇文章,可以先看完上一篇 点亮LCD1602A,再来这里,会更加顺畅,以下是代码结构,不再赘述:

程序框架

// 引入头文件
#include <stc89c5xrc.h>

#define LCD_DATA_PORT P0

sbit LCD_RS = P2^1;
sbit LCD_RW = P2^2;
sbit LCD_EN = P2^3;


// 11.0592MHZ = 11059200HZ
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 wr_cmd)
{
	LCD_RS = 0;
	LCD_RW = 0;
	LCD_DATA_PORT = wr_cmd;
	LCD_EN = 1;
	Delay(1);
	LCD_EN = 0;
}

// 写数据
void LCD_Write_Data(unsigned char wr_data) 
{
	LCD_RS = 1;
	LCD_RW = 0;
	LCD_DATA_PORT = wr_data;
	LCD_EN = 1;
	Delay(1);
	LCD_EN = 0;
}

// 设置光标位置
void LCD_Set_Cusor(unsigned char line, unsigned char column)
{
	unsigned char prefix = line == 1 ? 0x80 : 0xc0;
	LCD_Write_Command(prefix|(column-1));
}

// LCD 初始化
void LCD_Init()
{
	// 设置2行16列
	LCD_Write_Command(0x38);
	// 0000 1111
	LCD_Write_Command(0x0c); //显示开,光标开,闪烁开
	// 清屏 0000 0001
	LCD_Write_Command(0x01);
}


void main()
{
	// 这里将是我们的主程序,本节只写创建字模和显示汉字有关的内容
}

字模

我们使用表格来创建一个 8*8 的点阵,默认填写 0,创建文字后被占用的格子置为1,根据数据手册,见图:
数据手册
我们知道 b7~b5不能使用,也就意味着,我们只能使用 b4~b0,因此,这里创建了一个字模“王”,如图:

王字的8*8点阵

还记得我们的进制转换吧,如果不记得,可以看 二进制、八进制、十进制、十六进制之间的转换 ,上述我们转成16进制后为:

行列 b7 b6 b5 b4 b3 b2 b1 b0 十六进制结果
1 0 0 0 1 1 1 1 1 0x1f
2 0 0 0 0 0 1 0 0 0x04
3 0 0 0 0 0 1 0 0 0x04
4 0 0 0 0 1 1 1 0 0x0e
5 0 0 0 0 0 1 0 0 0x04
6 0 0 0 0 0 1 0 0 0x04
7 0 0 0 1 1 1 1 1 0x1f
8 0 0 0 0 0 0 0 0 0x00

得到上面结果后,同样根据数据手册,我们可以使用指令来创建字模,见图:
数据手册
根据这一段,我们可以计算一下,最小值 01000000,最大值 01111111,那么他的取值范围就是 01111111(2)-01000000(2) = 111111(2) ,将其转换成十进制为 2^5+2^4+^3+2^2+2^1+2^0,这就是一个等比数列求和,当公比 q != 1 时,Sn = a1*(1-q^n)/(1-q) ,代入公式,计算结果:
S6 = 2^6-1 = 63,所以CGRAM中,最多只能存放 64位,且由于一个字符(char)占一个字节,一个字节是8位,因此,在CGRAM中,最多只能放8个字符,到这里,我们已经很清楚的知道了如何创建字模,以及最多能存储多少个了,接下来,为了通过程序写到CGRAM中,我们需要通过写指令的方式,把计算出来的十六进制写到 CGRAM中,那为什么是写指令而不是写数据,可以看上图中的前两位 00, 也可以看上面写着的汉字,指令码!!!

  • 注意:在写指令前,我们需要先让 AC 指到 CGRAM 开始的地方,使用 LCD_Write_Command(0x40);,为啥是 0x40,那是因为我们上面已经根据数据手册算过了,他的最小值是 0100 0000,而它转换成十六进制就是 0x40
  • // 指向初始位置
    LCD_Write_Command(0x40);
    
    // 开始创建字模
    LCD_Write_Command(0x1f);
    LCD_Write_Command(0x04);
    LCD_Write_Command(0x04);
    LCD_Write_Command(0x0e);
    LCD_Write_Command(0x04);
    LCD_Write_Command(0x04);
    LCD_Write_Command(0x1f);
    LCD_Write_Command(0x00);
    
    // 写数据到 LCD 屏幕上,为啥是 0,因为他创建字模时是从 0 开始的,下一个字模如果不指定的话,他会从 1 的位置创建
    LCD_Write_Data(0);
    

    完美,把这段代码放到主程序中,然后编译,然后再下载到单片机,这样,你的显示屏就能显示汉字了,神奇吧!

    最后,如果你觉得的有用,记得点赞收藏哦~

    作者:大事龙

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【单片机】通过自定义字模,让你的LCD1602A显示汉字

    发表回复