|
/********************************************************/ //单片机四独立按键控制四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 }
*/
/********************************************************/ |