在之前的数码管的文章中,我们对数码管的扫描都是以延时的方式实现,这样做比较浪费单片机资源,在延时的过程,单片机一直在计数,不能执行其它功能。在学习了定时器的定时功能后,我们可以通过定时器进行定时,在定时器的中断函数中对数码管进行扫描。这篇文章我们就对数码管的中断方式扫描进行研究。采用定时器0进行定时,定时器0的初始化代码如下所示。
void init_T0(void)
{
TMOD|= 0x01; //使用方式1,16位定时器
TH0=(65536-2000)/256; //给TH0和TL0赋初值,计时时长为2ms
TL0=(65536-2000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
定时器0的定时周期为2000个机器周期,所以,定时时间为2ms。中断处理函数如下所示。
void T0_ISR(void) interrupt 1 using 1
{
TH0=(65536-2000)/256; //给TH0和TL0重新赋值
TL0=(65536-2000)%256;
scan(); //扫描数码管
}
中断函数中,重新赋值TH0和TL0的值,并调用scan()函数,进行数码管扫描。scan()函数的实现代码如下所示。
void scan(void)
{
DATA=0; //清空显示以防重影
DM=1; //段锁存
DM=0;
DATA=BJTY_WeiMa[m]; //取位码
WM=1; //位锁存
WM=0;
DATA=showdata[m]; //取段码
DM=1; //段锁存
DM=0;
m++;
if(m==8) //检测8位扫描是否结束
m=0; //如扫描完成则从第一个开始再次扫描8位
}
在这个函数中,分别输出数码管的位码,以及每一位的断码,从而实现对每一位数码管的扫描。
将程序烧写到单片机中,实验现象如下所示