/*本文仅作编程思路的介绍,关于数码管的复用算法不做多余的描述。本文采用的是STC的一款8位单片机,从编程原理上也适用于32位单片机。*/
一、3位6脚数码管
在IO口资源紧张时,会使用到如下图所示的3位6脚数码管。这种数码管只需要6个引脚就能显示3个数字,大大减少了硬件资源的占用。从成本来讲,这种数码管不需要额外的驱动芯片进行驱动。在硬件IO口资源不够或者预算较低的情况下,3位6脚数码管无疑是一个很好的选择。
图1.数码管侧面图
二、数码管驱动
由于不需要额外的硬件资源进行驱动,相应的软件上实现代码量会增加,但想驱动起来并不复杂。对于三位六脚数码管,我们可以将其简单的理解为led灯的点亮。
图2.数码管led
如上图所示,数码管由a至h共8个段(即LED)组成。通过这种方式,数码管的显示可以简化为控制这些LED灯的点亮。例如,若要显示数字“1”,则需点亮b段和c段;若要显示数字“2”,则需同时点亮a、b、g、e、d段,以此推类。
如图3所示,通过给1脚施加高电平、6脚施加低电平,我们成功点亮了最右侧数码管的a段。利用不同的电压排列组合,理论上可以激活30个LED的状态。然而,由于3位6脚数码管实际仅包含24个LED,因此存在6种特定的电压组合不会使任何LED点亮。
图3.实物图
需要注意的是,这里给数码管进行点亮时,一个脚为高电平,一个脚为低电平,其余的引脚应该处于高阻态。
三、数字显示
3位6脚数码管数字显示并不复杂,我们以显示一个数字“1”为例子。在显示一个完整的数字时,由于数码管的特性不能同时点亮所有的led,但由于人眼无法捕捉较高的刷新频率。因此,我们可以通过在一个较短的时间内依次将我们需要的数码管段进行点亮。
以下是对数码管的代码分析:
#include "stc8h.h"
sbit led1=P1^5;
sbit led2=P1^4;
sbit led3=P1^3;
sbit led4=P1^2;
sbit led5=P3^4;
sbit led6=P3^5;
这里仅声明了6个引脚对应数码管的六个脚方便对引脚进行调用,并不是对相关引脚的初始化。关于具体哪两个引脚点亮那个数码管的段需要数码管的相关资料,或者使用万用表的二极管档位进行测试。
按照图3的现象,在编程中我们需要不断的改变引脚的初始化来设置引脚的三种状态,即高电平,低电平和高阻态。那么显示一个数字“1”的代码如下:
/*这里的作用是当上一个段显示的时候需要稍微等待避免同时进行显示,在等待的同时将所有脚设置为高阻态。 */
void a_wait(void)
{
Delay15us();
P1M0 &= ~0x3c; P1M1 |= 0x3c;
P3M0 &= ~0x30; P3M1 |= 0x30;
Delay15us();
}//"1B"
//这里是将led3和led6都设置成推挽输出,led1,2,4,5设置成高阻态
P1M0 = (P1M0 & ~0x34) | 0x08; P1M1 = (P1M1 & ~0x08) | 0x34;
P3M0 = (P3M0 & ~0x10) | 0x20;
P3M1 = (P3M1 & ~0x20) | 0x10;
led3=1; led6=0; //将led3置高电平 led6置低电平
a_wait();
//"1C"
//这里是将led5和led6都设置成推挽输出,led1,2,3,4设置成高阻态
P3M0 |= 0x30; P3M1 &= ~0x30;
led5=1; led6=0; //将led3置高电平 led6置低电平
a_wait();
通过显示数码管的c段和d段成功显示数字“1”
图4.数字“1”显示
四、总结
我拿到这个数码管的时间,但是看到网上的资料也比较全搜集起来比较方便。鉴于在网上搜到不同商家的数码管定义的引脚不相同,且我并没有数码管相应的资料,所以我是通过万用表测量 每两个引脚对应的段。需要注意的是:①关于代码的延时部分都为阻塞延时,②在每一次点亮一个段比如是数码管的“a”段只有对应的两个引脚配置成输出模式,其余引脚都要为高阻态。
在本文的结尾,我想特别说明,作为初学者,我在这款单片机及数码管应用方面的经验尚浅且代码编写较为随意。因此,文章中难免存在疏漏或不足之处。恳请各位读者不吝赐教,如有任何建议或指正,欢迎在评论区留言,您的宝贵意见将是我不断进步的动力。