首先,我们要解决如何在多位数码管显示数据的问题。回忆一位数码管的显示输出:定义码段表数组,通过数组下标值,调用相应码段至单片机端口输出。多位数码管显示输出与一位数码管相似,也是先要定义数码管的码段表,并通过数组下标调用输出。但是,由于多个数码管的码段数据线都是连在一起的,只有用片选线才能区分每位数据输出。
另外,有多位数据,例如,有4位数据,数据的存放问题也需要专门考虑。这里,我们仍然采用数组的方式存放4位数据,因为数组在程序处理上很方便。这样,一个数组位,就相当于一个变量,存放着一位数据,再把这个数组位作为码段表数组的下标,调用出相应的输出码段值送至单片机端口。
下面,我们编写一个0~500的自动计数程序,共用到3位数码管。程序从0开始计数显示,直到500后,再回到0,循环往复进行。
这个程序的头文件和数码管的码段表定义都和一位数码管显示一样,但增加了多位数存放和数字分离的内容。这里用一个数组Dat[]={0,0,0,0}存放4位数,初值都为0。用变量S作为计数,tmp作为片选值。(www.xing528.com)
数字分离的方法很奇妙,百位数分离用Dat[0]=S/100公式解决,因为这里S值不会超过500,所以不用担心结果会大于一位数。例如,S=235,则S/100=2,Dat[]是整数,小数部分自动删除。十位数分离用Dat[1]=S%100/10公式解决,S%100取除100的余数,再把这个余数除10,就得到十位数了。例如,还是以上数字S=235,S%100/10=3。最后是个位数的分离,用Dat[2]=S%10,取S除以10的余数,很容易理解。
这里Dat[0]存放百位数,Dat[1]存放十位数,Dat[2]存放个位数。在输出时要按从高到低的顺序输出,不能搞错,否则数字就反了。在输出时,先选定片选值,即决定在哪个数码管输出,送到P2口,因为我们将片选线接在P2口。第1个片选值是1,根据数码管的标识在最左边位输出,然后通过P0口输出码段值,这时,就会在第1位显示数据了。接着,把片选值向左移动一位,为下一位输出作准备,停留片刻后进行下一位输出。这样,共循环3次,将3位数都输出显示在数码管上了。因为,我们的眼睛有视觉残留,所以感觉3位数字一起显示出来。但由于在输出完毕后还要停留较长时间才会进入下一个数的显示,输出会有闪烁的感觉。
这里,延时子程序采用参数的方式,可以调节延时的长短。数码管输出移位延时比较短,其他延时可以比较长,这样就能用一个延时子程序解决多种需要了。仿真结果如图6-2所示。
图6-2 多位数码显示仿真结果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。