【单片机】通过自定义字模,让你的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
,因此,这里创建了一个字模“王”,如图:
还记得我们的进制转换吧,如果不记得,可以看 二进制、八进制、十进制、十六进制之间的转换 ,上述我们转成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, 也可以看上面写着的汉字,指令码!!!
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);
完美,把这段代码放到主程序中,然后编译,然后再下载到单片机,这样,你的显示屏就能显示汉字了,神奇吧!
最后,如果你觉得的有用,记得点赞收藏哦~
作者:大事龙