单片机蓝桥杯大赛

关于对定时器,按键,LED,数码管的一体化应用,进阶提升能力 



//999定时器倒计时LED闪烁,s4 正计时
#include 
#define uchar unsigned char;
uchar code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar num;
uchar yi,er,san,si,time;
uchar mode;
bit s4,s5,s6,s7;
void Delayms(int ms);
void Time0Init(void);
void Keyscan(void);
void Display1(void);
void Display2(void);
void LED(void);
void main(void)
{
	P2=0xA0;P0=0x00;P2=0x80;P0=0xFF;
	P2=0xC0;P0=0x03;P2=0xFF;P0=0xFF;
	Time0Init();
	EA=1;
	ET0=1;
	

	
 while(1)
 {
	 Keyscan();
	 LED();
	 if(s4==1)
	 {
		mode=1;
		num=0; 
		s4=0;
	 }
	}
}

void Time0Init(void)
{		
	AUXR |=0x80;//定时器时钟模式//AUXR=AUXR|0x80;0010 1010 |1000 0000=
	TMOD &=0xF0;//设置定时器模式
	TH0=0x28;//设置初始值
	TL0=0x00;//设置初始值
	TF0=0;//清楚TF0标志
	TR0=1;//开始计时

}

void time0() interrupt 1
{
	if(mode!=1){
	TH0=0x28;
	TL0=0x00;
	time++;
	
	if(time==200)
	{
		time=0;
		if(num==0)
		{
			num=1000;	
		}
		num--;
		
		}
	
		yi=num/100%10;
		er=num/10%10;
		san=num%10;
		Display1();
		Display2();
		
	
	}
	else if(mode==1)
		{
			TH0=0x28;
			TL0=0x00;
			time++;
			if(time==200)
			{
			time=0;
			if(num==1000)
			{
				num=0;	
			}
				num++;
			}
			yi=num/100%10;
			er=num/10%10;
			san=num%10;
			Display1();
			Display2();
		
			
		}
	
}
void Delayms(int ms)
{
	int i,j;
	for(i=0;i0;j--);
}

void Display1(void)
{
	P2=0xc0;//打开控制数码管位选的573
	P0=0x01;//选中所有数码管
	P2=0xE0;//打开控制数码管段选的573
	P0=a[yi];//
	Delayms(1);
	
	P2=0xc0;//打开控制数码管位选的573
	P0=0x02;//选中所有数码管
	P2=0xE0;//打开控制数码管段选的573
	P0=a[er];//
	Delayms(1);	
}

void Display2(void)
{
	P2=0xc0;//打开控制数码管位选的573
	P0=0x04;//选中所有数码管
	P2=0xE0;//打开控制数码管段选的573
	P0=a[san];//
	Delayms(1);
	
	P2=0xc0;//打开控制数码管位选的573
	P0=0x08;//选中所有数码管
	P2=0xE0;//打开控制数码管段选的573
	P0=a[si];//
	Delayms(1);	
}
void Keyscan(void)//独立按键
{
	if(P30==0)
	{
	Delayms(1);
		if(P30==0)
		{
			s7=1;
		}
		while(!P30);//松手检测
	}
	else if(P31==0)
	{
		Delayms(1);
		if(P31==0)
		{
			s6=1;
		}
		while(!P31);//松手检测
	}
	else if(P32==0)
	{
	Delayms(1);
		if(P32==0)
		{
			s5=1;
		}
		while(!P32);//松手检测
	}
	else if(P33==0)
	{
		Delayms(1);
		if(P33==0)
		{
			s4=1;
		}
		while(!P33);//松手检测
	}
}	
void LED(void)
{
	if(num%2==0)
	{
	P2=0x80;//打开控制LED的573
	P0=0xfe;//关闭所有LED
	}
	else {
	P2=0x80;//打开控制LED的573
	P0=0xff;//关闭所有LED
	}
}
	

你可能感兴趣的:(蓝桥杯,单片机,嵌入式硬件,蓝桥杯)