目录
1、数码管函数显示
2、数码管的中断显示
3、两种显示方法比较
1、数码管函数显示
不用说,刚入门肯定是这种写法:
void Display()
{
uchar i,temp;
temp=0x01;
for(i=0;i<8;i++)
{
P2=0xC0;
P0=temp;
temp<<=1;
P2=0xE0;
P0=smg[i];
Delay2ms();
P0=0xFF;
}
}
temp存储数码管位选值,并在一次循环中移动一位,浅显易懂;
2、数码管的中断显示
void Timer0()interrupt 1
{
smg_cnt++;
if(smg_cnt==2)
{
smg_cnt=0;
P2=0xc0;P0=0x01<<i;P2=0;
P2=0xe0;P0=smg[i];P2=0;
i++;
if(i==8)i=0;
}
}
3、两种显示方法比较
显然,以上两段代码理解起来一点问题都莫得(前提至少是懂定时器和中断),所以这篇文章重点分析两段代码的异同点。
1.相同点
都能动态扫描并显示。
2.不同点
(1).在分析不同点之前,最好再温习一遍这个常识:定时器和CPU是独立的模块;
(2).函数显示延时靠CPU,相对于定时器来说,并不是那么“自由”。
所谓自由,如果你一直在主函数里卡着CPU(如按键松手检测),那么函数显示就会异常(可以自己动手试试),而中断则不会出现这种情况,这一局“定时器显示”得一分;
(3).函定时器显示靠中断,相对于函数显示来说来说,并不是那么“生命力强”。
所谓生命力强,即当你使用其他通信协议的时候(如iic),不得不关中断来确保数据传输的可靠性,因此这一局函数显示得一分(但其实定时器这个问题可以完美解决);
(4).其他就不赘述,例如中断显示可拓展性强,如:
void Timer0()interrupt 1
{
smg_cnt++;
if(smg_cnt==2)
{
smg_cnt=0;
P2=0xc0;P0=0x01<<i;P2=0;
if(menu_index==1){P2=0xe0;P0=menu1[i];P2=0;}
if(menu_index==2){P2=0xe0;P0=menu2[i];P2=0;}
if(menu_index==3){P2=0xe0;P0=menu3[i];P2=0;}
if(menu_index==4){P2=0xe0;P0=menu4[i];P2=0;}
......
i++;
if(i==8)i=0;
}
}
因为蓝桥杯赛题中往往是多个显示界面。
综之:二者并没有一定程度上的孰强孰弱,只是每个人的代码风格不一样,只能说更倾向于哪种写法,当然我推荐你使用定时器显示写法,代码精炼,这在比赛中是很能节省时间的。当然还有各种各样的写法,我这里只是列举其中两个。
喜欢的话可以关注我,我会陆续把其他模块及省赛、国赛历年真题代码完全免费开源,届时会同步至github和CSDN博客上。
本文完整源代码移步至[我的github]免费下载。