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