|
#include<AT89X51.h> #include<intrins.h> void delay(unsigned int i); const unsigned char leddigit[12]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a, 0x20,0x60,0xff,0xdf}; /* 字符 0-9 編碼,0xff為關(guān)顯示,0xdf為小數(shù)點 */ #define disp(a,b) P2=~(1<<(a));P0=leddigit[b] #define uchar unsigned char #define uint unsigned int void key() { uchar k; P1 = 0xf0;//低位置○,準(zhǔn)備查詢按鍵 k = P1;//取得當(dāng)前P1口的狀態(tài) if(k != 0xf0) {//如果有變化則表示有鍵按下 k = 0xfe; do{//循環(huán)掃描每一行 P1 = k; if(k != P1) { switch(P1) { //第一行 case 0x77:{disp(1,1);break;} case 0xb7:{disp(1,2);break;} case 0xd7:{disp(1,3);break;} case 0xe7:{disp(1,4);break;} //第二行 case 0x7b:{disp(1,5);break;} case 0xbb:{disp(1,6);break;} case 0xdb:{disp(1,7);break;} case 0xeb:{disp(1,8);break;} //第三行 case 0x7d:{disp(1,9);break;} case 0xbd:{disp(1,10);break;} case 0xdd:{disp(1,11);break;} case 0xed:{disp(4,11);break;} //第四行 case 0x7e:{disp(2,1);break;} case 0xbe:{disp(2,2);break;} case 0xde:{disp(3,3);break;} case 0xee:{disp(4,4);break;} } } k = _crol_(k,1);//移位,進(jìn)入下一行掃描 }while(k !=0xef);//超過范圍退出 } } main() { while(1) { key(); } } |