集成式数码管动态扫描显示电路图3-7所示。在该仿真电路运行时,集成式数码管“同时”显示多个不同字符。本案例程序设计使用了集成式数码管动态扫描显示技术。为将年、月、日的显示分开,在该仿真电路中未使用元器件库提供的8位集成式共阳数码管,而是选用了一组4位及两组2位的共阳集成式数码管,并将其拼装成一组“8位集成式”数码管。在拼装时,要注意“段引脚并联、位引脚分立”。
图3-7 集成式数码管动态扫描显示电路
本案例仿真电路中显示“年”时,使用了4位集成式七段蓝色共阳数码管(7SEG-MPX4-CA-BLUE)。其中,CA表示共阳,MPX4表示4位复用。第一组4位集成式数码管是共阳的,从“纵向”看,任意一个数码管内A~G、DP各段的阳极连接在一起,4只数码管分别引出共阳极1、2、3、4(或称C1~C4);从“横向”看,4只数码管共有4个A段,所有A段的阴极引脚并联在一起,B、C、D、E、F、G、DP阴极也分别“横向”并联,分别引出段引脚A~G、DP。
根据上述构造可知,任何时候发送的段码都会传送给所有数码管的各段,管段是否被点亮取决于数码管的共阳极1~4(或称C1~C4)是否连接高电平。如果它们同时连接高电平,则所发送的数字将同时显示在4只数码管上。如果各数码管要分别独立显示,显然不能让所有位引脚同时为高电平。
后两组显示“月”与“日”的2位集成式数码管的结构与第一组4位集成式数码管相似。在本案例仿真电路中,3组集成式数码管的段引脚全部并联,从逻辑上看,它们相当于一个8位的集成式共阳数码管。
仿真电路中,集成式数码管共阳极分别与8只8050(NPN)三极管射极相连,集电极接高电平。若要选通某个数码管位引脚,只要在相应的连接NPN三极管基极的P2引脚输出高电平。程序运行时,任意时刻只能有一只数码管的位引脚(共阳极)连接+5V。当P0输出段码时,相应数字将只会显示在对应的那个数码管上。在依次循环选通8位数码管中的每一个时,即可逐个显示每位数字。
例如,要在最左边的数码管上显示数字,对于仿真电路中的共阳数码管,其位引脚1(或称C1)要连接+5V。当P1.0引脚值为1,即P1端口输出位码00000001时,三极管Q1饱和导通,对应数码管共阳极连接+5V;不难看出,为显示下一位数字,P1端口必须输出位码00000010。
主程序中的for循环通过P1=1 << i逐一发送位码。当i取值为0~7时,P1分别输出位码00000001,00000010,00000100,…,10000000。在第i只共阳数码管被选通,结合对应输出的段码,相应的数字将显示在对应的第i只数码管上。
对于集成式数码管,任何时候发送的段码会被所有数码管收到。如果仿真电路中所有共阳数码管的位码均为1(即11111111,也就是0xFF),则所有数码管都会显示同一字符。为使不同数码管显示不同字符,主程序使用了集成式数码管显示常用的动态扫描显示技术。在选通第一只数码管时,发送第一个数字的段码,选通第二只数码管时发送第二个数字的段码,以此类推,每次仅选通一只数码管,发送对应的段码。
如果切换选通下一个数码管并发送相应段码的时间间隔非常短,视觉惰性将使人感觉不到字符是一个接一个显示在不同数码管上的,而会觉得所有字符是很稳定地“同时”显示在不同数码管上,这就是人的视觉暂留特征。在控制切换延时时长的时候,要注意设置扫描频率高于视觉暂留频率16~20Hz。电影胶片正是采取了24张/s的播放速度,才使观众觉察不到人物或景色是一帧一帧显示出来的,相反会觉得画面非常连贯,没有任何抖动或闪烁感。
主函数中的for循环是控制数码管动态扫描显示的核心部分,根据数码管输出控制经验,可采取两种可靠方式输出,这样可以有效解决乱码现象或无显示现象。
方式1:先暂时关闭段码,然后再发送位码和段码,该顺序简称为“段、位、段”;
方式2:先暂时关闭位码,然后再发送段位和位码,该顺序简称为“位、段、位”。
两种方式均首先暂时关闭段码(或位码),然后再发送位码、段码(或段码、位码)。
对于集成式数码管,其位码输出通常使用以下两种方法。
方法1:使用位码表。
使用该方法时要首先在程序中单独建立数码管位码表,对于所设计的仿真电路有:
有了位码表以后,主函数中发送位码的语句P1=1<<i即可改成P1=Scan_BITs[i]。
方法2:使用位运算符(<<、>>、~)。
对于共阳数码管,可使用1<<i得到位码字节,当i取值为0~7时,输出序列为00000001,00000010,…,10000000,可依次选通8位共阳数码管中的每一个。
对于共阴数码管,则可使用~(1<<i),输出序列为11111110,11111101,…,01111111,可依次选通共阴数码管中的每一个。
此外,还可以使用0x80>>i和~(0x80>>i),其差别是扫描顺序刚好相反。
要注意,如果端口不是直接连接数码管位引脚的,而是通过NPN或PNP三极管控制位引脚的,位码输出序列要由三极管的开关控制码决定。
本案例程序使用了方法2列出的数码管扫描方法,通过单条语句实现动态扫描显示。
① 将代码中delay_ms(4)语句的参数修改为10、20或100并编译运行,观察会出现什么样的效果。
② 改用位码表Scan_BITs实现对集成式数码管的位码控制。