微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 由数码管动态显示浅谈单片机程序

由数码管动态显示浅谈单片机程序

时间:11-30 来源:互联网 点击:
数码管动态显示原理:动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。这样一来,就没有必要每一位数码管接一组IO口,从而大大地节约了IO口。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。 即实际上,每个数码管是一个个的依次点亮。利用人眼视觉停留,快速扫描,一般每隔10ms以的下时间刷新一次数码管显示即可看到稳定的显示效果。本人亲自试验,最好刷新时间设定为5ms一下,高于5ms显示会略微有些晃眼。

传统的数码管显示程序为:

#define DUAN P1

#define WEI P0

void delayms(uchar x)

{

uchar y=120;

while(x--)

while(y--);

}

WEI=0; //消影 共阳,共阴为 WEI=0xff

DUAN=code[value_duan1]; //送段选数据

WEI=value_wei1; //送位选数据,确定第几个数码管点亮

Delayms(5); //延时5ms使其显示稳定

WEI=0; //消影 共阳,共阴为 WEI=0xff

DUAN=code[value_duan2]; //送段选数据

WEI= value_wei2; //送位选数据,确定第几个数码管点亮

Delayms(5); //延时5ms使其显示稳定

当延时后依次再送下一个数据,再延时······

这里我想再次说一下关于延时的问题。一般教科书或者说目前绝大多数能看到的数码管处理程序资料大多都是按照上面的方式处理的。我想问一下,这里延时5ms的意义何在?可否不延时?答案是可以,但显示结果就是最后一个被点亮的数码管会比较亮,其余的都比较暗。至于原因很简单,点亮最后一个数码管后,单片机CPU还要跑其他程序,然后再次跑到数码管显示处理函数时再依次点亮第一第二个数码管。显然这样最后一个被点亮的数码管点亮的时间远远比其他的数码管时间要长,自然这一个特别亮,其余的很暗淡。然而加上5ms延时的话呢?由于单片机速度还算比较快(一般一条指令1us),5ms相当于5000条指令。5000条指令什么概念呢?怎么说呢,若程序里不用“delay”这样的空指令的话,一般一个大型项目就差不多了。一般而言,比如AD测温、adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=17&is_app=0&jk=85d214d39ac24f75&k=%B5%E7%D7%D3%CA%B1%D6%D3&k0=%B5%E7%D7%D3%CA%B1%D6%D3&kdi0=0&luki=8&n=10&p=baidu&q=98059059_cpr&rb=0&rs=1&seller_id=1&sid=754fc29ad314d285&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1831118&u=http%3A%2F%2Fwww%2E51hei%2Ecom%2Fmcu%2F2120%2Ehtml&urlid=0" id="16_nwl" mpid="16" target="_blank">电子时钟等这样小项目实际有用的指令绝对不会达到好几千的样子。所以说5ms对于单片机来说是个相当长的时间。

再回到延时5ms后显示较为稳定的问题上。因为点亮最后一个数码管延时5ms后单片机在跑其他的指令时相对要不了多久(前提是其余地方没有“delay”空指令),所以最后一个数码管比其他数码管多亮的时间就不太明显了,这样自然显示也会比较均匀一些。但是事实上,最后一个被点亮的数码管还是稍微比别的数码管亮一些。注意上面所说的是单片机跑其他指令用的时间不长的情况。如果,程序比较大,模块很多,单片机要处理的事情很多呢?比方说一个float型数据的除法(不知道读者有没有在单片机上试过)所耗费的指令数可能你都想象不到(尤其是对于内部不含硬件除法器单片机,其除法指令转换成其他的运算)。我当时做AD测电阻时用的sonix芯片(没有除法器),开始程序里面一个float型除法,整个程序当时有1.5k的样子,数码管显示,老是一个亮,其余的暗淡,而且很不稳定。后来查找原因,就是因为那条float型除法的问题,竟然占了大几ms的时间。当删除那条指令后,整个程序只有700多字节,也就是说就这么一条指令就直接让程序大小翻倍了!查看编译器翻译成的汇编指令占了相当大一部分,而且还有很多CALL指令。所以说,8位单片机 确实不适合做除法以及float运算。

扯远了,回到数码管问题。综上面所述,delayms(5)的方式是不可靠的。而且最为关键的时delay指令是毫无意义的,就是让单片机啥也不做,在那里死等。试想一下,单片机还要处理其他事情,光在这里死等岂不是太浪费了吗?就好比人一样我可以在吃饭的同时听音乐,而不是先吃饭,饭吃完了再专门听音乐。单片机也是一样,要的是效率,而不是在那里死等。

那么这种方式不好,该怎么办呢?要不要延时?延时肯定是需要的,不然显示不均匀,但不是这种方式。正确的方式是定

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top