1. 程式人生 > >51微控制器-矩陣按鍵

51微控制器-矩陣按鍵

 1 /**************************************************************************************                                                                                
 2 *                      矩陣按鍵實驗                                                  *                        
 3 實現現象:下載程式後數碼管顯示0,按下矩陣按鍵上的按鍵顯示對應的數字                                                                                
4 S1-S4:0-3 5 S5-S8:4-7 6 S9-S12:8-B 7 S13-S16:C-F。
8 注意事項:如果不想讓點陣模組顯示,可以將74HC595模組上的JP595短接片拔掉。 9 ***************************************************************************************/ 10
11 #include "reg52.h" //此檔案中定義了微控制器的一些特殊功能暫存器 12 13 typedef unsigned int u16; 14 typedef unsigned char u8; 15 16 #define GPIO_DIG P0 17 #define GPIO_KEY P1 18 19 sbit LSA=P2^2; 20 sbit LSB=P2^3; 21 sbit LSC=P2^4; 22 23 u8 KeyValue; //用來存放讀取到的鍵值 24 25 26 u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 27 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值 28 29 /******************************************************************************* 30 * 函 數 名 : delay 31 * 函式功能 : 延時函式,i=1時,大約延時10us 32 *******************************************************************************/ 33 void delay(u16 i) 34 { 35 while(i--); 36 } 37 38 /******************************************************************************* 39 * 函 數 名 : KeyDown 40 * 函式功能 : 檢測有按鍵按下並讀取鍵值 41 * 輸 入 : 無 42 * 輸 出 : 無 43 *******************************************************************************/ 44 void KeyDown(void) 45 { 46 char a=0; 47 GPIO_KEY=0x0f; 48 if(GPIO_KEY!=0x0f)//讀取按鍵是否按下 0000 1111 49 { 50 delay(1000);//延時10ms進行消抖 51 if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下 52 { 53 //測試列 54 GPIO_KEY=0X0F; 55 switch(GPIO_KEY) 56 { 57 case(0X07): KeyValue=0;break; 58 case(0X0b): KeyValue=1;break; 59 case(0X0d): KeyValue=2;break; 60 case(0X0e): KeyValue=3;break; 61 } 62 //測試行 63 GPIO_KEY=0XF0; 64 switch(GPIO_KEY) 65 { 66 case(0X70): KeyValue=KeyValue;break; 67 case(0Xb0): KeyValue=KeyValue+4;break; 68 case(0Xd0): KeyValue=KeyValue+8;break; 69 case(0Xe0): KeyValue=KeyValue+12;break; 70 } 71 while((a<50)&&(GPIO_KEY!=0xf0)) //檢測按鍵鬆手檢測 72 { 73 delay(1000); 74 a++; 75 } 76 } 77 } 78 } 79 80 81 /******************************************************************************* 82 * 函 數 名 : main 83 * 函式功能 : 主函式 84 * 輸 入 : 無 85 * 輸 出 : 無 86 *******************************************************************************/ 87 void main() 88 { 89 LSA=0; //給一個數碼管提供位選 90 LSB=0; 91 LSC=0; 92 while(1) 93 { 94 KeyDown(); //按鍵判斷函式 95 GPIO_DIG=smgduan[KeyValue]; // 96 } 97 }