09_单片机_矩阵按键1
1. 4*4 矩阵按键图如下:

2. 利用上图LED,检测按键是否是低电平,验证矩阵按键规律
按键 0x0F
1 #include <REG51.H> 2 3 #define LED P1 4 #define KEY P0 5 6 7 void main(void) 8 { 9 while(1) 10 { 11 KEY = 0x0f; 12 if(KEY != 0x0f) 13 { 14 LED = KEY; 15 } 16 } 17 }
按键0xF0
1 #include <REG51.H> 2 3 #define LED P1 4 #define KEY P0 5 6 7 void main(void) 8 { 9 while(1) 10 { 11 KEY = 0xf0; 12 if(KEY != 0xf0) 13 { 14 LED = KEY; 15 } 16 } 17 }
通过上述验证,得到如下表格

3. 如下图,按键是横向和纵向相交,Key1 是 行1和列1 相交


4. 4*4矩阵按键 & 数码管显示(Key1~Key16 对应 数码管0~F,默认数码管不显示)
1 #include <REG51.H> 2 3 /*******************数据类型定义*******************/ 4 typedef unsigned char u8; 5 6 /*******************I/O定义*******************/ 7 #define GPIO_DIG P1 8 #define GPIO_KEY P0 9 10 /*******************函数声明*******************/ 11 void delay10ms(void); 12 u8 KeyPress(void); 13 14 /*******************变量定义*******************/ 15 u8 code dat[] = 16 {0x00, 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 17 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; 18 19 20 void main(void) 21 { 22 while(1) 23 { 24 u8 i=0; 25 i = KeyPress(); 26 GPIO_DIG = ~dat[i]; 27 delay10ms(); 28 } 29 } 30 31 u8 KeyPress(void) 32 { 33 u8 row = 0; 34 u8 column = 0; 35 u8 result = 0; 36 37 // 判断 行 38 GPIO_KEY = 0x0f; 39 if(GPIO_KEY != 0x0f) 40 { 41 delay10ms(); 42 switch(GPIO_KEY) 43 { 44 case(0x0e): 45 row = 1; 46 break; 47 case(0x0d): 48 row = 2; 49 break; 50 case(0x0b): 51 row = 3; 52 break; 53 case(0x07): 54 row = 4; 55 break; 56 default: 57 break; 58 } 59 } 60 61 // 判断 列 62 GPIO_KEY = 0xf0; 63 if(GPIO_KEY != 0xf0) 64 { 65 delay10ms(); 66 switch(GPIO_KEY) 67 { 68 case(0xe0): 69 column = 1; 70 break; 71 case(0xd0): 72 column = 2; 73 break; 74 case(0xb0): 75 column = 3; 76 break; 77 case(0x70): 78 column = 4; 79 break; 80 default: 81 break; 82 } 83 } 84 85 if(row == 0 && column == 0) 86 { 87 return result; 88 } 89 else 90 { 91 result = (row-1)*4+column; 92 return result; 93 } 94 95 } 96 97 void delay10ms(void) 98 { 99 u8 a,b,c; 100 for(c=5;c>0;c--) 101 for(b=4;b>0;b--) 102 for(a=248;a>0;a--); 103 }
记录~
浙公网安备 33010602011771号