#include<reg51.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char //********************************* //;P1 Registers sbit P2_0=P2^7; sbit P2_1=P2^7; sbit P2_2=P2^7; sbit P2_3=P2^7; sbit P2_4=P2^7; sbit P2_5=P2^7; sbit P2_6=P2^7; sbit P2_7=P2^7; #define LEDPort2 P2 //LED控制口 #define LEDPort3 P3 // const uchar leddigit[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF}; //* 字符 0-9 編碼,0xff為關(guān)顯示,0xdf為小數(shù)點 */ //********************************** static uchar bdata StateREG; //可位尋址的狀態(tài)寄存器 sbit flag = StateREG^0; //key是否按下,=1為按下 static uchar keyvl; //********************************** /*函數(shù)說明*/ //********************************** void delay_10ms(); uchar keyscan(); void temp(); //********************************** /*主函數(shù)*/ //********************************** void main(void) { uchar keyV; flag=0; while(1) {keyV=keyscan(); //調(diào)用鍵盤掃描函數(shù),返回的鍵值送變量key keyvl=keyV; if(flag==1) temp(); delay_10ms(); } } //*************************** /*延時函數(shù)*/ //*************************** void delay_10ms(void) {uint j; for(j=0;j<5000;j++) {;} } //*************************** /*鍵值處理程序*/ //*************************** /* void temp(void) { switch(keyvl) { case 0x11:{ P2=0x01; break; } case 0x21:{ P2=0x02; break; } case 0x41:{ P2=0x03; break; } case 0x81:{ P2=0x04; break; } default: break; } } */ //*************************** /*鍵值處理程序*/ //*************************** void temp() { if(keyvl==0x11) {P2=0xfe;return;} else if(keyvl==0x21){P2=0xFD;return;} else if(keyvl==0x41){P2=0xFB;return;} else if(keyvl==0x81){P2=0xF7;return;} else if(keyvl==0x12){P2=0xEF;return;} else if(keyvl==0x22){P2=0xDF;return;} else if(keyvl==0x42){P2=0xBF;return;} else if(keyvl==0x82){P2=0x7F;return;} else if(keyvl==0x14){P3=0xFE;return;} else if(keyvl==0x24){P3=0xFD;return;} else if(keyvl==0x44){P3=0xFB;return;} else if(keyvl==0x84){P3=0xF7;return;} else if(keyvl==0x18){P3=0xEF;return;} else if(keyvl==0x28){P3=0xDF;return;} else if(keyvl==0x48){P3=0xBF;return;} else if(keyvl==0x88){P3=0x7F;return;} } //*********************************** /*鍵盤掃描函數(shù)*/ //*********************************** uchar keyscan(void) { uchar code_h; //行掃描值 uchar code_l; //列掃描值 flag=0; // P1=0xF0; //P1.0--P1.3發(fā)0,準備讀列狀態(tài) if((P1&0xF0)!=0xF0) //如果P1.4--P1.7不為全1,可能有鍵按下 { delay_10ms(); //延時去抖動 if((P1&0xF0)!=0xF0)//重讀高4位,若還是不全為1,定有鍵按下 { code_h=0xFE; //P1.0置為0,開始行掃描 while((code_h&0xF0)!=0xE0) //判斷是否為最后一行,若不是,繼續(xù)掃描 { P1=code_h; //P1口輸出行掃描值 if((P1&0xF0)!=0xF0) //如果P1.4--P1.7不為全1,該行有鍵按下 { flag=1; // code_l=(P1&0xF0|0x0F); //保留P1口高4位,低4位變?yōu)?,作為列值 return((~code_h)+(~code_l)); //鍵編碼=行掃描+列掃描值,返回主程序 } else //若該行無鍵按下,行掃描值左移,掃描下一行 code_h = _crol_(code_h,1);//移位,進入下一行掃描 } } } return(0); //無鍵按下,返回0 } // |