×
嵌入式 > 技术百科 > 详情

数码管动态扫描的种类与设计

发布时间:2020-10-15 发布时间:
|
数码动态扫描可以节省I/O口,而且省电。一般的数码管动态扫描可以用延时函数来实现,也可以用定时器。用延时的话程序比较复杂,效率也差点,容易占用单片机的资源,但是可以不用定时器;如果你两个定时器都用在其他重要的地方,可以考虑这样做。
下面先讲什么是动态扫描,所谓动态扫描,就是数码管的段极都接在一起,利用数码管的位选脚在不同的时间点亮不同的数码管,并发送段码,利用人眼的暂留现象和数码管的余晖效应,看起来所有的数码管就是同时亮的,实际上,它们是在同一个时刻只亮一个而已,其它是不亮的,只是它们的扫描速度很快,我们人眼分辨不出来。
好了,先来讲延时的数码管动态扫描:
延时扫描有两种方法,一直是位操作,一种是字节操作。
首先得先写一个数码管的段码编码,数码管分为共阳和共阴,其编码是不同的,而且根据不同的电路设计编码也有所不同。下面我就举两个例子的0-9的数码管常用的编码值;
共阳:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;
共阴:0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;
先把编码值设置成一个数组,对其进行对10取余就可以显示个位,取整可以显示10位。
延时扫描的第一种方法:位操作
先发送段码,再开位选,然后延时,最后关位选,接着显示下一个,以此类推。
具体延时多久,要看数码管的多少,一般每个点亮大约5ms到10ms左右,太久了会出现严重闪烁,太短了数码管会很暗,根据具体情况做出调整。
延时扫描的第二种方法:字节操作 
采用字节操作只需把段码和位码都编好,一次延时就可以了,可以用两个FOR循环来完成,比如有8个数码管,扫描延时5MS,可以这样写:
for(i=0;i<1000;i++)
for(j=0;j<8;j++)
{
P0=NUM(段码)[j];
P1=NUM1(位码)[j];
}
现在来介绍定时器扫描,用定时器扫描可以使扫描时间比较准确稳定,可以用switch语句来实现;例如打开定时器1,数码管4个,可以这样写:
void main()
{
uchar t;
TMOD=0x01;
TH0=0xec;
TL0=0x78;//5ms
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xec;
TL0=0x78;
t++;
}
if(t==4)
{
t=0;
}
switch(t)
{
case 0:发送段码;关位选3;开位选1;break;
case 1:发送段码;关位选1;开位选2;break;
。。。。。
case 3:发送段码;关位选:2;开位选3;break;
}
}
这样写比较直观,当然,有其他方法大家可以探讨!
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分拣机器人的工作原理是什么