数码动态扫描能够节约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;
}
}
这样写比较直观,当然,有其他办法我们能够讨论!
数码管动态扫描的品种与规划
数码动态扫描可以节省IO口,而且省电。一般的数码管动态扫描可以用延时函数来实现,也可以用定时器。用延时的话程序比较复杂,效率也差点
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/255527.html