经典防抖动键C51源程序
扫描二维码
随时随地手机看文章
********************************************************/
//单片机四独立按键控制四LED;
//四个独立按键对应四个独立的LED.
//当某一按键按下时对应的LED亮,当第二次按下时灭。
//四个LED只能有一个亮,初学者可以参考以下程式:
/********************************************************/
#i nclude< reg52.h >
unsigned char k_scan();
unsigned char k_pro();
unsigned char k_new,k_old;
unsigned char k;
void delay(unsigned char m);
sbit k1=P1^4; sbit k2=P1^5;
sbit k3=P1^6; sbit k4=P1^7;
sbit led0=P0^0; sbit led1=P0^1;
sbit led2=P0^2; sbit led3=P0^3;
bit n;
/********************************************************/
void main(void)
{
P0=0xff;
k_old=0x00;
while(1)
{
k_new=k_scan();
if(k_new!=k_old)
{ delay(1);
if(k_new!=k_old)
{k_old=k_new;
k=k_pro();}
}
switch(k)
{
case 1:{if(n)led0=0;else if(!n)led0=1;} break;
case 2:{if(n)led1=0;else if(!n)led1=1;} break;
case 3:{if(n)led2=0;else if(!n)led2=1;} break;
case 4:{if(n)led3=0;else if(!n)led3=1;} break;
default: break;
}
}
}
/********************************************************/
unsigned char k_pro()
{
switch (k_new)
{
case 0x01:{k=1;if(led1&led2&led3){n=!n;}
else {P0=0xff;}}
break;
case 0x02:{k=2;if(led0&led2&led3){n=!n;}P0=0xff;}
break;
case 0x04:{k=3;if(led0&led1&led3){n=!n;}P0=0xff;}
break;
case 0x08:{k=4;if(led0&led1&led2){n=!n;}P0=0xff;}
break;
default:
break;
}
return(k);
}
/********************************************************/
unsigned char k_scan()
{
P1=0xff;
k_new=0x00;
k_new=k_new|(!k4);
k_new=k_new<<1;
k_new|=(!k3);
k_new=k_new<<1;
k_new|=(!k2);
k_new=k_new<<1;
k_new|=(!k1);
return(k_new); //无键按下?k_new=0x00
}
/********************************************************/
void delay(unsigned char m)
{
while(m--)
{
unsigned char i=255;
while(i--);
}
}
/********************************************************/
/*
还可以将 k_scan 函数更改为:
unsigned char k_scan()
{
P1=0xff;
k_new=0x00;
k_new=(~(P1) & 0xf0)>>4;
return(k_new); //无键按下?k_new=0x00
}
*/