这是我们使用MPLAB和XC8学习PIC单片机的第8个教程。从安装MPLABX到将LCD与PIC MCU一起使用,我们一路走来。如果您是新手,请查看以前的教程,在这里您可以学习计时器,LED闪烁,LCD接口等。您可以在这里找到我们所有的PIC教程。在上一个教程中,我们看到了如何通过16 * 2 LCD显示屏生成自定义字符,现在让我们为自己配备另一种类型的显示模块,称为7段显示器,并将其与PIC Microcontroller进行接口。
尽管16x2 LCD比7段显示器要舒适得多,但是很少有7段显示器比LCD显示器方便的情况。LCD的缺点是字符尺寸太小,如果您打算显示一些数字值,则对您的项目而言可能会显得过分杀伤。7段式显示器还具有防止不良照明条件的优势,并且可以从比普通LCD屏幕更大的角度观看。所以,让我们开始了解它。
7段和4位7段显示模块:
7段显示器中有七个段,每个段内部都有一个LED,通过点亮相应的段来显示数字。就像如果您希望7段显示数字“ 5”,则需要通过将其相应的引脚设为高电平来使a,f,g,c和d发光。7段显示器有两种类型:Common Cathode和Common Anode,这里我们使用Common Cathode 7段显示器。在此处了解有关7段显示的更多信息。
现在我们知道如何在单个7段显示器上显示所需的数字字符。但是,很明显,我们需要一个以上的7段显示器来传达超过一位的任何信息。因此,在本教程中,我们将使用如下所示的4位7段显示模块。
如我们所见,有四个七个分段显示器连接在一起。我们知道,每个7段模块将有10个引脚,而对于4个7段显示器,总共将有40个引脚,任何人将它们焊接在点板上都会很忙,所以我强烈建议任何人购买一个模块或制作自己的PCB以使用4位7段显示器。相同的连接示意图如下所示:
要了解4位七段模块的工作原理,我们必须查看上面的示意图,如图所示,所有四个显示器的A引脚连接在一起,一个A接在一起,对于B,C…直到DP接在一起。因此,基本上,如果触发A,那么所有四个A都应该变高吧?
但是,这不会发生。我们还有从D0到D3的另外四个引脚(D0,D1,D2和D3),可用于控制四个引脚中哪个应该变高。例如:如果我只需要在第二个显示器上显示输出,则仅D1应该设为高电平,而其他引脚(D0,D2和D3)保持低电平。简单地,我们可以使用D0到D3的引脚选择必须激活的显示器,以及使用A到DP的引脚选择要显示的字符。
将4位七段式模块与PIC微控制器连接:
在这里,我们使用了PIC单片机PIC16F877A,电路原理图如下所示。
该模块有12个输出引脚,其中8个用于显示字符,而4个则用于选择四个显示中的一个。因此,所有8个字符引脚都分配给PORTD,而显示选择引脚则分配给PORTC的前四个引脚。
注意:模块的接地引脚也应连接到此处未显示的MCU的接地。
使用PIC16F877A进行编程:
现在,我们知道了该模块的实际工作原理,让我们学习如何对PIC16F877A进行编程以使其显示4位数字。让我们将变量从0增加到1000,然后将其打印在7段显示器上。启动MPLABX程序并创建新项目,让我们从配置位开始。
#pragma config FOSC = HS //振荡器选择位(HS振荡器)#pragma config WDTE = OFF //看门狗定时器使能位(禁止WDT)#pragma config PWRTE = ON //上电定时器使能位(使能PWRT)# pragma config BOREN = ON //欠压复位使能位(使能BOR)#pragma config LVP = OFF //低压(单电源)在线串行编程使能位(RB3为数字I / O,HV开启必须使用MCLR进行编程)#pragma config CPD = OFF //数据EEPROM存储器代码保护位(Data EEPROM代码保护已关闭)#pragma config WRT = OFF //闪存程序存储器写使能位(写保护已关闭;所有程序存储器可能由EECON控件写入)#pragma config CP = OFF // Flash程序存储器代码保护位(代码保护关闭)
像往常一样,我们使用设置配置位窗口来设置这些位。如果不确定它们的含义,请在此处访问LED闪烁教程。
接下来,让我们定义用于在显示器的每个数字之间切换的输出引脚。
// ***定义所有四个显示器的信号引脚*** // #define s1 RC0 #define s2 RC1 #define s3 RC2 #define s4 RC3 // ***定义结束** ////
此处,引脚RC0,RC1,RC2和RC3用于在我们的7段显示模块的四位数之间进行选择。这些引脚分别定义为s1,s2,s3和s4。
接下来,让我们跳入 void main(), 在其中具有以下变量声明:
int i = 0; //要显示的4位数值int flag = 0; //用于创建延迟unsigned int a,b,c,d,e,f,g,h; //只是变量unsigned int seg = {0X3F,//十六进制值显示数字0 0X06,//十六进制值显示数字1 0X5B,//十六进制值显示数字2 0X4F,//十六进制值显示数字3 0X66,//十六进制值显示数字4 0X6D,//十六进制值显示数字5 0X7C,//十六进制值显示数字6 0X07,//十六进制值显示数字7 0X7F,/ /十六进制值显示数字8 0X6F //十六进制值显示数字9}; //显示0到9之间的数字的数组末尾
此处,变量 i 和 标志 分别用于存储要显示的值和创建延迟。该 无符号整数变量A到H 是用来打破的四位数字到个位数,并将它们存储(将在后面说明如下)。
这里要注意的一件事是 “ seg” 数组声明。在此程序中,我们使用一种称为数组的新数据类型。数组不过是相似数据类型值的集合。在这里,我们使用此数组存储所有等效的十六进制值,以显示从0到9的数字。
数组的地址始终从零开始。因此,此数组将在地址中存储一个与数字相同的十六进制值(0-9),如下所示
变量: |
段 |
段 |
段 |
段 |
段 |
段 |
段 |
段 |
段 |
段 |
十六进制代码: |
0X3F |
0X06 |
0X5B |
0X4F |
0X66 |
0X6D |
0X7C |
0X07 |
0X7F |
0X6F |
等式 数值: |
0 |
1个 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
简而言之,如果要在7段显示数字0,可以调用 seg, 同样,如果要显示数字6,则只需使用 段。
要了解如何实际获得十六进制值,让我们看一下下表。每个十进制数字的等效十六进制值存储在数组中,以便可以调用它以显示一个特定数字。
现在,让我们继续进行代码的下一部分,即I / O配置:
// ***** I / O配置**** // TRISC = 0X00; PORTC = 0X00; TRISD = 0x00; PORTD = 0X00; // *** I / O配置结束** ///
I / O配置很简单,因为我们7段中的所有引脚都是输出引脚,并且连接如上面的电路图所示,因此只需将它们声明为输出并将它们初始化为零即可。
现在让我们跳入无限循环 (while(1))。 在这里,我们必须将“ i”的值分成四个数字,并将它们显示在7段上。首先,让我们首先分割“ i”上的值
// ***将“ i”拆分为四位数字*** // a = i%10; // 4位数字保存在此处b = i / 10; c = b%10; //第3位保存在这里d = b / 10; e = d%10; //第二位保存在这里f = d / 10; g = f%10; //第一个数字保存在这里h = f / 10; // ***分割结束*** //
通过使用简单的模数和除法运算,将4位数字(i)分离为单个数字。在我们的例子中,让我们举一个例子,其中“ i”的值为4578。然后在此过程结束时,变量g = 4,e = 5,c = 7和a = 8。因此,现在只需使用该变量即可轻松显示每个数字。
PORTD = seg; s1 = 1; //打开显示1并打印第4位__delay_ms(5); s1 = 0; // 5ms延迟后关闭显示1 PORTD = seg; s2 = 1; //打开显示器2并打印第3位__delay_ms(5); s2 = 0; // 5ms延迟后关闭显示2 PORTD = seg; s3 = 1; //打开显示3并输出第二位__delay_ms(5); s3 = 0; // 5ms延迟后关闭显示3 PORTD = seg; s4 = 1; //打开显示4并打印第一个数字__delay_ms(5); s4 = 0; //延迟5ms后关闭显示4
这是MCU与7段进行通讯的实际位置。众所周知,我们一次只能显示一位数字,但是只有四位数字全部显示时,我们才能显示四位数字。对于用户,完整的四位数字将是可见的。
那么,我们该如何处理呢?
对我们来说幸运的是,我们的MCU比人眼快得多,所以我们实际要做的是:一次显示一位,但是如上所述,我们可以非常快地完成。
我们选择一个数字显示,等待5毫秒,以便MCU和7段处理器可以对其进行处理,然后关闭该数字并移至下一个数字,然后执行相同操作,直到到达最后一个数字。人眼无法观察到5ms的延迟,并且所有四个数字似乎同时处于打开状态。
就是这样,最后我们只是使用延迟来增加显示数字的值,如下所示
if(flag> = 100)//等待直到标志达到100 {i ++; flag = 0; //仅当标志为百“ i”时才递增} //每个闪存的递增标志
使用延迟是为了使从一个数字更改为另一个数字所花费的时间足够长,我们可以注意到该变化。
将完整的代码下面给出,过程也是在解释影片的结尾。
硬件设置和测试:
一如既往,让我们在实际使用硬件之前使用Proteus模拟程序。如果模拟成功,您应该会看到类似以下的内容
该项目没有任何复杂的硬件设置,我们再次使用在LED闪烁教程中创建的同一PIC单片机板。只需根据连接图将7段模块与PIC单片机板连接即可。完成连接后,只需使用PicKit 3编程器转储代码,即可享受输出的乐趣。