这是我们PIC教程系列中的第六篇教程 ,在本教程中,我们学习16x2 LCD与PIC单片机的接口。在以前的教程中,我们使用一些LED闪烁程序学习了PIC的基础知识,并且还学习了如何在PIC单片机中使用定时器。您可以在此处查看有关使用MPLABX和XC8编译器学习PIC单片机的所有教程。
本教程将是一个有趣的教程,因为我们将学习如何将16×2 LCD与PIC16F877A接口,请在本教程末尾查看详细的视频。我们过去使用LED进行用户指示的时代已经过去。让我们看看如何使用LCD显示器使我们的项目看起来更酷,更有用。还可以查看我们以前有关将LCD与8051,Arduino,Raspberry Pi和AVR接口的文章。
LCD与PIC单片机接口的功能:
为了使事情变得容易,我们建立了一个小程序库,可以在将PIC16F877A与LCD一起使用时使事情变得容易。头文件“ MyLCD.h”在此处提供下载,其中包含使用PIC MCU驱动LCD的所有必需功能。注释行很好地解释了库代码,但是如果您仍有疑问,请通过注释部分与我们联系。另外,请查看本文以了解基本的LCD工作原理及其引脚排列。
注意:始终建议您了解头文件中实际发生的情况,因为这将有助于您调试或更改MCU。
现在,有两种方法可以将此代码添加到您的程序中。您可以在MyLCD.h中复制以上所有代码行,并将其粘贴到void main()之前。或者,您可以使用链接下载头文件并将其添加到项目的头文件中( #include“ MyLCD.h ”; )。可以通过右键单击头文件并选择“ 添加现有项” 并浏览到此头文件来完成。
在这里,我已将头文件代码复制并粘贴到我的主C文件中。因此,如果您正在使用我们的代码,则无需下载并将头文件添加到程序中,只需使用本教程末尾给出的完整代码即可。还应注意,该库仅支持PIC16F系列PIC单片机。
在这里,我在下面解释头文件中的每个函数:
void Lcd_Start(): 此函数应该是开始使用LCD时必须调用的第一个函数。我们应该只调用一次此函数,以避免程序滞后。
void Lcd_Start(){Lcd_SetBit(0x00); for(int i = 1065244; i <= 0; i--)NOP(); Lcd_Cmd(0x03); __delay_ms(5); Lcd_Cmd(0x03); __delay_ms(11); Lcd_Cmd(0x03); Lcd_Cmd(0x02); // 02H用于返回原位->清除RAM并初始化LCD Lcd_Cmd(0x02); // 02H用于返回原位->清除RAM并初始化LCD Lcd_Cmd(0x08); //选择第1行Lcd_Cmd(0x00); //清除第1行显示Lcd_Cmd(0x0C); //选择第2行Lcd_Cmd(0x00); //清除第2行显示Lcd_Cmd(0x06); }
Lcd_Clear():此函数清除LCD屏幕,并且可以在循环内部使用以清除先前数据的外观。
Lcd_Clear(){Lcd_Cmd(0); //清除LCD Lcd_Cmd(1); //将光标移到第一个位置}
void Lcd_Set_Cursor(x pos,y pos): 一旦启动,我们的LCD即可接受命令,我们可以指示LCD通过使用此功能将光标设置在您的首选位置。假设是否需要在第一行的第5个字符处移出光标。然后该函数将无效Lcd_Set_Cursor(1,5)
无效Lcd_Set_Cursor(char a,char b){char temp,z,y; if(a == 1){temp = 0x80 + b-1; // 80H用于移动光标z = temp >> 4; //低8位y = temp&0x0F; //高8位Lcd_Cmd(z); //设置行Lcd_Cmd(y); //设置列} else if(a == 2){temp = 0xC0 + b-1; z =温度>> 4; //低8位y = temp&0x0F; //高8位Lcd_Cmd(z); //设置行Lcd_Cmd(y); //设置列}}
void Lcd_Print_Char(char data):一旦设置了光标,我们就可以通过简单地调用此函数将一个字符写入其位置。
void Lcd_Print_Char(char data)//通过4位模式发送8位{char Lower_Nibble,Upper_Nibble; Lower_Nibble = data&0x0F; Upper_Nibble = data&0xF0; RS = 1;// => RS = 1 Lcd_SetBit(Upper_Nibble >> 4); //通过上移4 EN = 1发送上半部分;for(int i = 2130483; i <= 0; i--)NOP(); EN = 0; Lcd_SetBit(Lower_Nibble); //发送下半部分EN = 1; for(int i = 2130483; i <= 0; i--)NOP(); EN = 0; }
Lcd_Print_String(char * a):如果要显示一组字符,则可以使用字符串函数。
Lcd_Print_String(char * a){int i; for(i = 0; a!='\ 0'; i ++)Lcd_Print_Char(a); //使用指针分割字符串并调用Char函数}
每次调用Lcd_Print_Char(char数据)时 ,其各自的字符值将发送到LCD的数据线。这些字符以位的形式到达HD44780U。现在,该IC通过使用其ROM存储器将这些位与要显示的字符相关联,如下表所示。您可以在HD44780U LCD控制器的数据表中找到所有字符的位。
现在,由于我们对头文件感到满意,因此让我们构建电路并测试程序。还要检查上面链接中给出的完整头文件。
电路图和测试:
下面是将16x2 LCD与PIC微控制器接口的电路图。
我没有在上述电路中显示电源或ICSP连接,因为我们使用的是与上一教程相同的电路板,请在此处进行检查。
程序中要注意的一件事是LCD的引脚定义:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
这些引脚定义可以根据程序员的硬件设置进行更改。如果在此进行更改,请记住在主要功能中更改受尊重的端口配置。
该项目的硬件非常简单。我们将重用上次使用的相同PIC模块,并使用跳线将LCD模块连接到我们的PIC。
下表可以理解该连接:
LCD引脚号 |
LCD引脚名称 |
MCU引脚名称 |
MCU引脚号 |
1个 |
地面 |
地面 |
12 |
2 |
VCC |
+5伏 |
11 |
3 |
VEE |
地面 |
12 |
4 |
注册选择 |
RD2 |
21 |
5 |
读/写 |
地面 |
12 |
6 |
启用 |
RD3 |
22 |
7 |
数据位0 |
数控 |
-- |
8 |
数据位1 |
数控 |
-- |
9 |
数据位2 |
数控 |
-- |
10 |
数据位3 |
数控 |
-- |
11 |
数据位4 |
RD4 |
27 |
12 |
数据位5 |
RD5 |
28 |
13 |
数据位6 |
RD6 |
29 |
14 |
数据位7 |
RD7 |
30 |
15 |
LED正极 |
+5伏 |
11 |
16 |
LED负极 |
地面 |
12 |
现在,让我们简单地进行连接,将代码转储到我们的MCU并验证输出。
如果您有任何疑问或疑问,请使用评论部分。还要检查下面给出的演示视频。