在上一教程中,我们学习了如何将16 * 2 LCD与PIC单片机接口。如果您是PIC微控制器的初学者,我们建议您先进行遍历。以前,我们还使用PIC微控制器中的LED闪烁程序和定时器学习了PIC的基础知识。您可以在此处查看有关使用MPLABX和XC8编译器学习PIC单片机的所有教程。
在本教程中,让我们通过创建自己的自定义字符并使用PIC16F877A PIC单片机在LCD屏幕上显示它们来使其更加有趣。HD44780A IC本身也提供了一些预定义的,最常用的自定义字符,我们还将看到如何使用它们。如我们之前的教程中所述,我们的LCD上装有Hitachi HD44780控制器,可帮助我们显示字符。我们显示的每个字符已经在HD44780 IC的ROM中预先定义。在LCD上显示字符之前,我们将了解LCD控制器IC HD44780。
16x2点矩阵LCD控制器IC HD44780:
为了显示自定义字符,我们必须以某种方式告诉IC自定义字符的外观。为此,我们应该了解HD44780 LCD控制器IC内存在的三种类型:
字符生成器ROM(CGROM): 如前所述,它是只读存储器,其中包含内部预定义的所有字符模式。该ROM会因接口IC的每种类型而异,并且某些ROM可能带有一些预定义的自定义字符。
显示数据RAM(DDRAM):这是一个随机存取存储器。每次我们显示一个字符时,其图案都会从CGROM中提取并传输到DDRAM,然后将其放置在屏幕上。简而言之,DDRAM将具有LCD屏幕上当前显示的所有字符的模式。这样,对于每个周期,IC都无需从CGROM中获取数据,并有助于缩短更新频率
字符生成器RAM(CGRAM):这也是一个随机存取存储器,因此我们可以从中读写数据。顾名思义,此内存将是可用于生成自定义字符的内存。我们必须为角色形成一个图案并将其写入CGRAM,该图案可以在需要时读取并显示在屏幕上。
现在,由于我们对HD44780接口IC中存在的存储器类型有了基本的了解。让我们看一下它的数据表,以了解更多信息。
正如数据表所暗示的,HD44780 IC提供了8个位置来将我们的自定义模式存储在CGRAM中,在右侧我们还可以看到一些预定义字符也可以在我们的LCD屏幕上显示。让我们看看我们如何做到这一点。
在16x2 LCD上显示自定义字符:
要显示自定义字符,我们必须首先为其生成图案,然后将其保存到CGRAM。由于我们已经具有库功能,因此使用一些简单的命令即可轻松完成此操作。这是LCD功能的库,但是在这里,我们已将所有库功能复制粘贴到程序本身中,因此无需在程序中包含此头文件。另外,请查看本文以了解基本的LCD工作原理及其引脚排列。
第一步是生成图案或自定义字符。众所周知,每个字符都是5 * 8点的组合。我们必须选择哪个点(像素)应该变高,哪个点应该保持低。只需在下面绘制一个方框,然后根据您的角色为区域着色。我在这里的角色是一个棍子人(希望它看起来像一个)。着色后,只需写入每个字节的等效二进制值,如下所示。
只需为每个字节在阴影区域上添加“ 1”,在非阴影区域上添加“ 0”,就可以使用我们的自定义模式。同样,我为8个存储空间制作了8个自定义模式代码,将其显示为CGROM。它们在下表中列出。
序号 |
自订角色 |
模式码 |
1个 |
0b01110, 0b01110, 0b00100, 0b01110, 0b10101, 0b00100, 0b01010, 0b01010 |
|
2 |
0b00000, 0b00000, 0b01010, 0b00100, 0b00100, 0b10001, 0b01110, 0b00000 |
|
3 |
0b00100, 0b01110, 0b11111, 0b11111, 0b01110, 0b01110, 0b01010, 0b01010 |
|
4 |
0b01110, 0b10001, 0b10001, 0b11111, 0b11011, 0b11011, 0b11111, 0b00000 |
|
5 |
0b01110, 0b10000, 0b10000, 0b11111, 0b11011, 0b11011, 0b11111, 0b00000 |
|
6 |
0b00000, 0b10001, 0b01010, 0b10001, 0b00100, 0b01110, 0b10001, 0b00000 |
|
7 |
0b00000, 0b00000, 0b01010, 0b10101, 0b10001, 0b01110, 0b00100, 0b00000 |
|
8 |
0b11111, 0b11111, 0b10101, 0b11011, 0b11011, 0b11111, 0b10001, 0b11111 |
注意:不必强制加载CGRAM中提供的所有8个空间。
编程和工作说明:
现在我们的模式代码已经准备好了,我们只需要将它们加载到LCD的CGRAM并使用PIC微控制器显示它们即可。要将它们加载到CGRAM中,我们可以形成一个5 * 8的元素数组,并使用“ for循环 ”加载每个字节。模式代码的数组如下所示:
const unsigned short Custom_Char5x8 = {0b01110,0b01110,0b00100,0b01110,0b10101,0b00100,0b01010,0b01010,// CGRAM内存空间1的代码0b00000,0b00000,0b01010,0b00100,0b00100,0b10001,0b01110,0b00000, CGRAM内存空间2 0b00100,0b01110,0b11111,0b11111,0b01110,0b01110,0b01010,0b01010,// CGRAM内存空间3的代码0b01110,0b10001,0b10001,0b11111,0b11011,0b11011,0b11111,0b00000,// CGRAM内存的代码space 4 0b01110,0b10000,0b10000,0b11111,0b11011,0b11011,0b11111,0b00000,// CGRAM存储空间的代码5 0b00000,0b10001,0b01010,0b10001,0b00100,0b01110,0b10001,0b00000,// CGRAM存储空间的代码6 0b00000,0b00000,0b01010,0b10101,0b10001,0b01110,0b00100,0b00000,// CGRAM存储空间7的代码0b11111,0b11111,0b10101,0b11011,0b11011,0b11111,0b10001,0b11111 // CGRAM存储空间的8};
每个内存空间都加载有其受尊重的字符模式。要将这种模式加载到HD44780 IC中,必须参考HD44780的数据表,但这只是命令行,可用于设置CGRAM的地址。
// ***将自定义字符加载到CGROM *** ////// Lcd_Cmd(0x04); //设置CGRAM地址Lcd_Cmd(0x00); //..将CGRAM地址设置为(i = 0; i <= 63; i ++)Lcd_Print_Char(Custom_Char5x8); Lcd_Cmd(0); //返回首页Lcd_Cmd(2); //..返回首页// ***加载自定义字符完成*** ///////
在这里,在“ for循环” 内部,每个二进制值都被加载到CGROM中。加载图案后,可以通过使用 void Lcd_Print_Char(char data) 函数简单地调用图案的位置来使自定义字符显示,如下所示。
Lcd_Print_Char(0); //显示自定义字符0 Lcd_Print_Char(1); //显示自定义字符1 Lcd_Print_Char(2); //显示自定义字符2 Lcd_Print_Char(3); //显示自定义字符3 Lcd_Print_Char(4); //显示自定义字符4 Lcd_Print_Char(5); //显示自定义字符5 Lcd_Print_Char(6); //显示自定义字符6 Lcd_Print_Char(7); //显示自定义字符7
打印预定义的特殊字符:
HD44780 IC在DDROM中存储了一些预定义的特殊字符。可以通过参考数据表中的二进制值将这些字符直接打印到屏幕上。
例如:字符“ ALPHA”的二进制值为0b11100000。可以从下图了解如何获得此值,同样,您可以获取IC中预定义的任何特殊字符的值。
知道二进制值后,只需使用如下所示的 void Lcd_Print_Char(char data) 函数即可将相应的字符打印到屏幕上,
Lcd_Print_Char(0b11100000); //数据表中alpha的二进制值
该项目的完整代码在下面的“代码”部分中给出,并在本教程结尾处查看详细的视频说明。
电路连接和测试:
该项目没有任何其他硬件要求,我们只使用了与以前的LCD接口教程相同的连接,并使用了我们在LED闪烁教程中创建的相同板。与往常一样,让我们使用Proteus模拟程序以验证我们的输出。
一旦仿真按预期运行,就可以直接将代码刻录到我们的硬件设置中。程序的输出应如下所示:
这样便可以使用带有MPLABX和XC8编译器的PIC单片机在16x2 LCD上显示任何自定义字符。还要在这里查看我们完整的PIC单片机学习系列。