【蓝桥杯单片机的备赛旅行日记系列】之动态数码管

目录


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]免费下载。

发布了4 篇原创文章 · 获赞 7 · 访问量 453

猜你喜欢

转载自blog.csdn.net/weixin_43894786/article/details/105179197