理论教育 多数码管显示控制方法

多数码管显示控制方法

时间:2023-10-19 理论教育 版权反馈
【摘要】:这样两个数码管用10个I/O口就可以控制了。采用这种思想,控制4个数码管只需要12个I/O口,远远少于静态控制需要的32个I/O口。用PIC单片机控制一款4位共阳极数码管模块。编程实现让4个数码管显示数字2913。由于用数码管主要显示数字,所以应该有一个形参用来表示要显示的数值,这里假设只显示整数,并且小于10000。

多数码管显示控制方法

单片机中最常用的字形显示装置就是数码管了,前文已经介绍过数码管的原理和使用方法,本章就不重复介绍了。

在实际应用中,往往需要用单片机控制多个数码管,如2个、4个、6个等。如果按照以前的方法,每个数码管占用8个I/O口,那么一片PIC16F877最多可以接4个数码管。这种数码管显示的方法称为静态显示法。这种方法的优点是控制简单,但缺点也很明显:这样做的话就已经没有空余的I/O口留做它用,如果想控制5个、8个数码管怎么办呢?

由于静态显示占用的I/O口线较多,单片机资源的开销很大,所以为了节省单片机的I/O口线,常采用动态扫描方式作为LED数码管的接口电路,如图5-4所示。

978-7-111-33274-9-Chapter05-10.jpg

图5-4 数码管动态扫描原理示意图

在图5-4中,DS1和DS2是两个数码管,每个数码管由8个发光二极管构成,并排列成8字形和一个小数点。数码管的内部电路是把所有发光二极管的8个笔划段a-g和DP同名端连在一起,而每一个数码管的公共极COM端(对于共阳极数码管是A端,对于共阴极数码管是K端)与各自独立的I/O口连接。这样两个数码管用10个I/O口就可以控制了。采用这种思想,控制4个数码管只需要12个I/O口,远远少于静态控制需要的32个I/O口。下面介绍其动态扫描显示原理。

当单片机向字段输出口送出字形码时,所有数码管接收到相同的字形码,但究竟是哪个数码管亮,则取决于COM端,而这一端也是由I/O口间接控制的,这样通过适当的I/O控制就可以决定何时点亮哪个数码管。而所谓动态扫描就是指采用分时的方法,一位一位地轮流控制各个数码管的COM端,使各个数码管每隔一段时间点亮一次。在轮流点亮的扫描过程中,每位数码管的点亮时间是极为短暂的(约10ms),由于人的视觉暂留现象及发光二极管的余辉效应,所以给人的印象就是一组稳定的显示数据,不会有闪烁感。下面通过例子演示动态扫描的效果。

【例5-4】电路如图5-5所示。用PIC单片机控制一款4位共阳极数码管模块。编程实现让4个数码管显示数字2913。单片机主频为4MHz。

978-7-111-33274-9-Chapter05-11.jpg

图5-5 ISIS中的4位数码管扫描显示原理图

电路图在光盘位置:“\Example\Chapter5\S052\sch\smg4.DSN”。注意:本书中所有涉及到4位数码管显示的电路图都使用了Proteus ISIS自带的4位数码管模块,此模块省略了数码管驱动电路,但搭建硬件实物时不应省略。

题意分析

●根据电路图5-5可知,在同一时刻4位数码管不可能显示不同内容,但实际上由于人眼存在视觉暂留现象,若一个显示设备的刷新率大于25Hz,人眼看上去就是连续的动作。这样可以根据人眼的视觉暂留现象来设计此程序。

●若要求4位数码管显示的刷新率大于25Hz,就是要求在40ms(10000ms/25)内每个数码管都显示一次数据,这样平均每个数码管显示数据的时间约为10ms。

●经过以上分析,控制程序可以先只让RC0控制的数码管亮,显示2并延时10ms;接下来只让RC1控制的数码管亮,显示9并延时10ms;接下来只让RC2控制的数码管亮,显示1并延时10ms;接下来只让RC3控制的数码管亮,显示3并延时10ms;然后循环重复以上动作即可。

设计过程

1)新建一个MPLAB项目,加入一个新建的main.c文件,输入以下内容(本项目所有内容参考光盘“\Example\Chapter5\S052”文件夹内容)。

978-7-111-33274-9-Chapter05-12.jpg

978-7-111-33274-9-Chapter05-13.jpg

2)在MPLAB中使用调试工具Proteus VSM加载电路图smg4.DSN运行,观察显示内容。上例中的代码把所有函数都写在一个文件里,这不是好习惯。延时函数和数码管扫描代码将会频繁使用,如果能写成库函数的形式会便于这段代码的重复利用。在不同应用中数码管扫描用的端口不一定,所以要抽象出来,用宏定义可以实现。下面通过例子来学习如何把以上代码写成模块化的函数形式。

【例5-5】电路如图5-6所示。编程实现让4个数码管显示数字2913。单片机主频为4MHz。要求把数码管扫描代码和延时函数分别写成不同的模块文件,在main.c中酌情调用。

电路图在光盘位置:“\Example\Chapter5\S053\sch\smg4.DSN”。

978-7-111-33274-9-Chapter05-14.jpg

图5-6 ISIS中的4位数码管扫描显示原理图

题意分析

●本例中延时函数可以单独写成一个模块。例如,在delay.h中写延时函数的声明,在delay.c中写延时函数定义。但是要考虑到单片机主频不同,导致同一段延时程序所用时间不同的问题。在编写延时函数时需要把单片机的频率考虑进去。如图5-6所示,本例中单片机主频是4MHz。(www.daowen.com)

●数码管动态扫描代码在工程项目中会频繁用到,所以有必要把它用函数改写。为了让此函数具有通用性,也需要把此函数单独写成一个模块。在seg74.h中写动态扫描函数的声明,在seg74.c中编写相应的函数定义。

●对于数码管动态扫描函数建议用见名知意的方式来命名,如称为DisplayData。由于用数码管主要显示数字,所以应该有一个形参用来表示要显示的数值,这里假设只显示整数,并且小于10000(因为只有4位数码管,最大值9999)。这样此函数的声明可以写为

978-7-111-33274-9-Chapter05-15.jpg

●在数码管动态扫描函数中,为了方便将来硬件连接改变后的代码移植,这里把与硬件相关的特殊寄存器用宏名替换。例如,用SEG_FONT宏定义替换函数代码中的PORTB,数码管所用的硬件连接在seg74.h中定义为

978-7-111-33274-9-Chapter05-16.jpg

这样将来电路修改,如改为PORTC作为字形码输出用端口,那么只需把B改为C即可。

978-7-111-33274-9-Chapter05-17.jpg

其他位置都不用变就能继续使用此函数了。

设计过程

1)用MPLAB新建项目S053,语言工具选择为“HI-TECH Universal Toolsuite”,保存在“C:\S053”文件夹下。

2)新建main.c文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter05-18.jpg

978-7-111-33274-9-Chapter05-19.jpg

3)新建seg74.h文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter05-20.jpg

4)新建seg74.c文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter05-21.jpg

978-7-111-33274-9-Chapter05-22.jpg

5)新建delay.h文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter05-23.jpg

6)新建delay.c文件并加入项目中,其内容如下所示。

978-7-111-33274-9-Chapter05-24.jpg

7)程序录入完毕后,保存并编译。然后用Proteus VSM载入电路图smg4.DSN来运行,运行时注意观察Proteus VSM窗口显示内容。

采用这种软硬件结合的动态扫描方法,用PIC16F877理论上可以驱动24只数码管(1个端口(8个I/O引脚)用做字形显示,其他3个端口用做位选),这比静态控制方法能多控制20只数码管,由此可见软硬件结合的方法的确能够大幅度提高硬件的利用效率。

下面继续介绍用C语言如何实现输入端口的编程和使用。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈