03KEY+DSEG按键控制动态数码管

一、多位数码管倒计时+联合LED控制

第6,7,8位数码管显示255——0倒计时,其他数码管保持熄灭,倒计时至250时L1灯点亮

#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned int MS);
unsigned char Num=255;
unsigned int Num_Refresh=0;
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
void SEG_Display12(unsigned char yi,unsigned char er);
void SEG_Display34(unsigned char san,unsigned char si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);
void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;	
	SEG1=11,SEG2=11,SEG3=11,SEG4=11,SEG5=11,SEG6=2,SEG7=5,SEG8=5;
		
	while(1)
	{
		
		
		if(++Num_Refresh==125)
		{
			Num_Refresh=0;
			Num--;
			SEG6=Num/100;SEG7=Num%100/10;SEG8=Num%10;
			if(Num==250)
			{
				P2=0X80;//打开控制LED灯的锁存器
				P0=0XFE;//操作LED
			}
		}
		
		SEG_Display12(SEG1,SEG2);
		SEG_Display34(SEG3,SEG4);
		SEG_Display56(SEG5,SEG6);
		SEG_Display78(SEG7,SEG8);
		
	}
}
void Delay_MS(unsigned int MS)
{
	unsigned i,j; 
	for(i=0;i<MS;i++)
	for(j=853;j>0;j--);
}
void SEG_Display12(unsigned char yi,unsigned char er)
{
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		P0=0XFF;
	
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
	    P0=0XFF;
}
void SEG_Display34(unsigned char san,unsigned char si)
{	
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		P0=0XFF;
	
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		P0=0XFF;
}

void SEG_Display56(unsigned char wu,unsigned char liu)
{
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		P0=0XFF;
	
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
	    P0=0XFF; 
}	
void SEG_Display78(unsigned char qi,unsigned char ba)
{
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
	    P0=0XFF;
		
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
        P0=0XFF;	
}

二、独立按键控制数码管显示(上电之后所有数码管显示字符“—”,按下按键S7,第一个数码管显示“1”,按下按键S6,第一个数码管显示“2”,按下按键S5,第一个数码管显示“3”,按下按键S4,第一个数码管显示“4”) 

#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned int MS);
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char S7_Flag=0;S6_Flag=0;S5_Flag=0;S4_Flag=0;
void SEG_Display12(unsigned char yi,unsigned char er);
void SEG_Display34(unsigned char san,unsigned char si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);

void Key_Scan(void);
void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;	
	SEG1=10,SEG2=10,SEG3=10,SEG4=10,SEG5=10,SEG6=10,SEG7=10,SEG8=10;
		
	while(1)
	{
		Key_Scan();
		if(S7_Flag==1){S7_Flag=0;SEG1=1;}
		if(S6_Flag==1){S6_Flag=0;SEG2=2;}
		if(S5_Flag==1){S5_Flag=0;SEG3=3;}
		if(S4_Flag==1){S4_Flag=0;SEG4=4;}
		
		
		SEG_Display12(SEG1,SEG2);
		SEG_Display34(SEG3,SEG4);
		SEG_Display56(SEG5,SEG6);
		SEG_Display78(SEG7,SEG8);
		
	}
}
void Delay_MS(unsigned int MS)
{
	unsigned i,j; 
	for(i=0;i<MS;i++)
	for(j=853;j>0;j--);
}
void SEG_Display12(unsigned char yi,unsigned char er)
{
		P0=0XFF;
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}
void SEG_Display34(unsigned char san,unsigned char si)
{	
		P0=0XFF;
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}

void SEG_Display56(unsigned char wu,unsigned char liu)
{
		P0=0XFF;
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
}	
void SEG_Display78(unsigned char qi,unsigned char ba)
{
		P0=0XFF;
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		
		P0=0XFF;
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);	
}
void Key_Scan(void)
{
	if(P30==0)
		{
			Delay_MS(10);
			if(P30==0)S7_Flag=1;
			while(!P30);
		}
		if(P31==0)
		{
			Delay_MS(10);
			if(P31==0)S6_Flag=1;
			while(!P31);
		}
		if(P32==0)
		{
			Delay_MS(10);
			if(P32==0)S5_Flag=1;
			while(!P32);
		}
		if(P33==0)
		{
			Delay_MS(10);
			if(P33==0)S4_Flag=1;
			while(!P33);
		}
}

三、独立按键控制数码管显示+倒计时+LED控制(上电之后所有数码管显示字符“—”,按下按键S7,第一个数码管显示“1”,按下按键S6,第一个数码管显示“2”,按下按键S5,控制点亮L1灯,且第6,7,8位数码管显示255——0倒计时,其他数码管保持熄灭,倒计时至250时L8灯点亮) 

#include<stc15.h>
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
void Delay_MS(unsigned int MS);
unsigned char Num=255;
unsigned int Num_Refresh=0;
unsigned char SEG_Run=0;
unsigned char SEG1,SEG2,SEG3,SEG4,SEG5,SEG6,SEG7,SEG8;
unsigned char S7_Flag=0;S6_Flag=0;S5_Flag=0;S4_Flag=0;
void Key_Scan(void);
void SEG_Display12(unsigned char yi,unsigned char er);
void SEG_Display34(unsigned char san,unsigned char si);
void SEG_Display56(unsigned char wu,unsigned char liu);
void SEG_Display78(unsigned char qi,unsigned char ba);
void main(void)
{
	P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
	P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;	
	SEG1=10,SEG2=10,SEG3=10,SEG4=10,SEG5=10,SEG6=10,SEG7=10,SEG8=10;
		
	while(1)
	{
		Key_Scan();
		if(S7_Flag==1){S7_Flag=0;SEG1=1;}
		if(S6_Flag==1){S6_Flag=0;SEG2=2;}
		if(S5_Flag==1)
			{
				S5_Flag=0;
				SEG1=11,SEG2=11,SEG3=11,SEG4=11,SEG5=11;
				SEG6=Num/100;SEG7=Num%100/10;SEG8=Num%10;
				P2=0X80;P0=0XFE;
				SEG_Run=1;
			}
				if(SEG_Run==1)
				{
				if(++Num_Refresh==125)
					{
						Num_Refresh=0;
						Num--;
						SEG6=Num/100;SEG7=Num%100/10;SEG8=Num%10;
						if(Num==250)
							{
								P2=0X80;//打开控制LED灯的锁存器
								P0=0X7F;//操作LED
							}
					}
				}
	
		
		
		SEG_Display12(SEG1,SEG2);
		SEG_Display34(SEG3,SEG4);
		SEG_Display56(SEG5,SEG6);
		SEG_Display78(SEG7,SEG8);
		
	}
}
void Delay_MS(unsigned int MS)
{
	unsigned i,j; 
	for(i=0;i<MS;i++)
	for(j=853;j>0;j--);
}
void SEG_Display12(unsigned char yi,unsigned char er)
{
		P2=0XC0;P0=0X01; 	//打开控制数码管位选的锁存器,然后选中第一个数码管
		P2=0XFF;P0=tab[yi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		P0=0XFF;
	
		P2=0XC0;P0=0X02; 	//打开控制数码管位选的锁存器,然后选中第二个数码管
		P2=0XFF;P0=tab[er];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
	  P0=0XFF;
}
void SEG_Display34(unsigned char san,unsigned char si)
{	
		P2=0XC0;P0=0X04; 	//打开控制数码管位选的锁存器,然后选中第三个数码管
		P2=0XFF;P0=tab[san];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		P0=0XFF;
	
		P2=0XC0;P0=0X08; 	//打开控制数码管位选的锁存器,然后选中第四个数码管
		P2=0XFF;P0=tab[si];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		P0=0XFF;
}

void SEG_Display56(unsigned char wu,unsigned char liu)
{
		P2=0XC0;P0=0X10; 	//打开控制数码管位选的锁存器,然后选中第五个数码管
		P2=0XFF;P0=tab[wu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
		P0=0XFF;
	
		P2=0XC0;P0=0X20; 	//打开控制数码管位选的锁存器,然后选中第六个数码管
		P2=0XFF;P0=tab[liu];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
	  P0=0XFF; 
}	
void SEG_Display78(unsigned char qi,unsigned char ba)
{
		P2=0XC0;P0=0X40; 	//打开控制数码管位选的锁存器,然后选中第七个数码管
		P2=0XFF;P0=tab[qi];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
	  P0=0XFF;
		
		P2=0XC0;P0=0X80; 	//打开控制数码管位选的锁存器,然后选中第八个数码管
		P2=0XFF;P0=tab[ba];	//打开控制数码管段选的锁存器,然后给上述打开的数码管输出码值
		Delay_MS(1);
    P0=0XFF;	
}
void Key_Scan(void)
{
	if(P30==0)
		{
			Delay_MS(10);
			if(P30==0)S7_Flag=1;
			while(!P30);
		}
		if(P31==0)
		{
			Delay_MS(10);
			if(P31==0)S6_Flag=1;
			while(!P31);
		}
		if(P32==0)
		{
			Delay_MS(10);
			if(P32==0)S5_Flag=1;
			while(!P32);
		}
		if(P33==0)
		{
			Delay_MS(10);
			if(P33==0)S4_Flag=1;
			while(!P33);
		}
}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值