51单片机(二十三)—— 数码管中断扫描

         在之前的数码管的文章中,我们对数码管的扫描都是以延时的方式实现,这样做比较浪费单片机资源,在延时的过程,单片机一直在计数,不能执行其它功能。在学习了定时器的定时功能后,我们可以通过定时器进行定时,在定时器的中断函数中对数码管进行扫描。这篇文章我们就对数码管的中断方式扫描进行研究。采用定时器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位
}

在这个函数中,分别输出数码管的位码,以及每一位的断码,从而实现对每一位数码管的扫描。

        将程序烧写到单片机中,实验现象如下所示

发布了97 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104416783