|
/********************************************************/ //單片機四獨立按鍵控制四LED; //四個獨立按鍵對應四個獨立的LED. //當某一按鍵按下時對應的LED亮,當?shù)诙伟聪聲r滅。 //四個LED只能有一個亮,初學者可以參考以下程式: /********************************************************/ #include < 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 函數(shù)更改為: unsigned char k_scan() { P1=0xff; k_new=0x00; k_new=(~(P1) & 0xf0)>>4; return(k_new); //無鍵按下k_new=0x00 } */ /********************************************************/ |