单片机C语言程序设计实训100例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.8 8只数码管显示多个不同字符

本例不同于上一案例的是在集成式数码管上同时显示了多个不同字符。

本例电路如图3-8所示。

图3-8 8只数码管显示多个不同字符电路

程序设计调试与实训:

前面已经讨论过,对于集成式数码管,任何时候发送的段码会被所有数码管收到,如果本例中所有共阳数码管的位码均为1(0xFF),则所有数码管都会显示同一字符。

为了使不同数码管显示不同字符,本例使用的是集成式多位数码管常用的动态扫描显示技术,它利用了人的视觉暂留特征,选通第1只数码管时,发送1的段码;选通第2只数码管时,发送2的段码;选通第3只数码管时,发送3的段码。每次仅选通一只数码管,发送对应的段码,每次切换选通下一数码管并发送相应段码的时间间隔非常短,视觉惰性使人感觉不到字符是一个接一个显示在不同数码管上的,而会觉得所有字符很稳定地同时显示在不同数码管上。

可见,这种设计方法和上一案例类似的是仍然是在数码管不同位置上逐个显示不同字符,只是切换速度大大增加了,在控制切换延时的时候,要注意全屏的扫描频率要高于视觉暂留频率16~20Hz。对于代码中的最后一行语句DelayMS(2),读者可尝试将函数参数修改为3,10,20等,观察会出现什么样的效果。

读者可修改代码,实现自定义的若干位数字串的显示。

源程序代码:

        //-----------------------------------------------------------------
        //  名称: 8只数码管动态显示多个不同字符
        //-----------------------------------------------------------------
        //  说明: 数码管动态扫描显示0~7。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #include <intrins.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //各数字的数码管段码
        uchar code DSY_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
        //-----------------------------------------------------------------
        // 延时
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar i;
          while(x--) for(i = 0; i < 120; i++);
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          uchar k,m = 0x80;
          P0 = 0xff;
          P2 = 0x00;
          while(1)
          {
            for(k = 0; k < 8; k++)
            { m = _crol_(m,1);
                P2 = m;                   //位码
                P0 = DSY_CODE[ k + 1 ];  //段码
                DelayMS(2);               //延时
            }
          }
        }