单片机学习笔记(11)
多位数码管的动态显示(上)
单片机课程代码详解
提示:撰文本文的目的是为了学习交流,仅供参考,不保证其正确性。
废话少说,上代码!
#include <STC15.H> |
我们按照主函数的运行顺序一一介绍各个子函数的作用。
主函数
for(Sec=0;Sec<100;Sec++) |
这里的for循环语句,我们可以看到这里Sec被设置初值为0,一共要循环100次(即0-99),这与我们要实现的0-99动态显示这一功能有关。
数据处理函数
void ToDisBuff() |
这里的ToDisBuff函数,目的是将for循环当中的Sec进行处理。当for循环开始时,Sec的值为0.经过算式Sec/10(这里是除法运算,计算结果为商,例如25/7的结果为3),得出结果为0,并将0这个结果存入DisBuff[2]。此时在数组DisBuff当中,下表为2的数已经不是10了,而是0。下一句同理,将计算后的值存入DisBuff[3]当中。这里可以自己简单的写一段C代码来证明一下:
动态显示函数
void Display() //动态显示函数 |
这里的for循环总共循环四次,原因应该是因为本数码管为四位数码管。for循环第一次开始循环时,PSeg开始调用数组SegCode当中的字形码,DisBuff[i]是为了控制字形码数组的角标,当i=1时,得出DisBuff[1],DisBuff[1]的值为10,即PSeg=SegCode[10](0xff),接着PSel位选段向左位移1位(因为i=1),之后用延时函数进行延时。
提示:事实上也可以直接将DelayNms(1);这句改为DelayNms(100);,然后再将主函数里的for(s=0;s<100;s++)注释掉也能达到同样效果。
因为在这里使用的是共阳数码管,点亮是低电平有效。所以当PSeg=0xff时,数码管不点亮。
当循环到第二次时,此时i=2。PSeg=SegCode[DisBuff[2]]=SegCode[0](0xc0)。接着位选段向左移动2位,在数码管的第三位显示数字0,随着循环的进行依此类推,最终形成了0-99的动态显示。