2017年11月29日
矩陣按鍵程序
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit we = P2^7; sbit du = P2^6; uchar code leddata[]={ 0x3F, //"0" 0x06, //"1" 0x5B, //"2" 0x4F, //"3" 0x66, //"4" 0x6D, //"5" 0x7D, //"6" 0x07, //"7" 0x7F, //"8" 0x6F, //"9" 0x77, //"A" 0x7C, //"B" 0x39, //"C" 0x5E, //"D" 0x79, //"E" 0x71, //"F" 0x76, //"H" 0x38, //"L" 0x37, //"n" 0x3E, //"u" 0x73, //"P" 0x5C, //"o" 0x40, //"-" 0x00, //熄滅 0x00 //自定義 }; void delay(uint z) { uint x,y; for(x = z;x > 0;x --) for(y = 112;y > 0;y --); } //嵌套延時函數 uchar KeyScan() //按鍵判斷函數 { uchar cord_l,cord_h; //聲明列和行函數名 P3 = 0xf0; //將0xf0賦給P3口,將行置高電平列置低電平 //if((P3 & 0xf0) != 0xf0) if(P3 != 0xf0) //當行和列不再是初始的時候代表有按鍵被按下 { delay(5); //軟件消抖延時 //if((P3 & 0xf0) != 0xf0) if(P3 != 0xf0) //確定有按鍵按下 { cord_l = P3 & 0xf0; //按位與運算,將結果賦給cord_l函數 P3 = cord_l | 0x0f; //按位或運算,將運算結果賦給P3口 //掃描矩陣鍵盤的每一列將其結果賦給cord_l函數 cord_h = P3 & 0x0f; // 按位與,將P3口的行與0x0f中不同的二進制數置爲低電平 while((P3 & 0x0f) != 0x0f); //不斷的判斷按鍵是否按下 return(cord_l + cord_h); //列和行的按鍵地址 } } } void KeyPro() //按鍵地址函數 { switch(KeyScan()) //按鍵地址選擇語句塊 { //當按鍵地址等於以下之一時則選擇將後面leddata數組中的數字送入數碼管 //第一行 case 0xee:P0 = leddata[0]; break; //第一列 case 0xde:P0 = leddata[1]; break; //第二列 case 0xbe:P0 = leddata[2]; break; //第三列 case 0x7e:P0 = leddata[3]; break; //第四列 //第二行 case 0xed:P0 = leddata[4]; break; //第一列 case 0xdd:P0 = leddata[5]; break; //第二列 case 0xbd:P0 = leddata[6]; break; //第三列 case 0x7d:P0 = leddata[7]; break; //第四列 //第三行 case 0xeb:P0 = leddata[8]; break; //第一列 case 0xdb:P0 = leddata[9]; break; //第二列 case 0xbb:P0 = leddata[10]; break; //第三列 case 0x7b:P0 = leddata[11]; break; //第四列 //第四行 case 0xe7:P0 = leddata[12]; break; //第一列 case 0xd7:P0 = leddata[13]; break; //第二列 case 0xb7:P0 = leddata[14]; break; //第三列 case 0x77:P0 = leddata[15]; break; //第四列 } } void main() //主函數開始 { we = 1; //打開位選 P0 = 0; //打開所有8組數碼管 we = 0; //打開位選 du = 1; //打開段選 P0 = leddata[22]; //向P0口段選送一個初始顯示數但此地不可爲空 while(1) //循環執行按鍵地址程序 { KeyPro(); //按鍵地址函數 } }