1、硬件连接图

2、实现原理
(1)如上图所示,P1.0,P1.1,P1.2,P1.3引脚分别可以检测是哪一行按下按键,电平设置如下:
第1行检测:[P1.0,P1.1,P1.2,P1.3] = [0,1,1,1];
第2行检测:[P1.0,P1.1,P1.2,P1.3] = [1,0,1,1];
第3行检测:[P1.0,P1.1,P1.2,P1.3] = [1,1,0,1];
第4行检测:[P1.0,P1.1,P1.2,P1.3] = [1,1,1,0];
(2)对应列扫描
通过将P1.0,P1.1,P1.2,P1.3引脚分别设为低电平,再去检测P1.4,P1.5,P16,P1.6引脚的电平则可判断4x4键盘矩阵中究竟是哪一个按键被按下
第1行扫码:若没有按下则 P1 = 0xfe, 若有按键按下则可能P1 = 0xee(1行1列按下),P1 = 0xde(1行2列按下),P1 = 0xbe(1行3列按下),P1 = 0x7e(1行4列按下)
第2行扫码:若没有按下则 P1 = 0xfd, 若有按键按下则可能P1 = 0xed(2行1列按下),P1 = 0xdd(2行2列按下),P1 = 0xbd(2行3列按下),P1 = 0x7d(2行4列按下)
第3行扫码:若没有按下则 P1 = 0xfb, 若有按键按下则可能P1 = 0xeb(3行1列按下),P1 = 0xdb(3行2列按下),P1 = 0xbb(3行3列按下),P1 = 0x7b(3行4列按下)
第4行扫码:若没有按下则 P1 = 0xf7, 若有按键按下则可能P1 = 0xe7(4行1列按下),P1 = 0xd7(4行2列按下),P1 = 0xb7(4行3列按下),P1 = 0x77(4行4列按下)
3、代码实现
1 unsigned char display(void) 2 { 3 unsigned char tmp; 4 unsigned char num; 5 6 /* 第1行键盘扫描 */ 7 P3 = 0xfe; 8 tmp = P3; // 读取端口P3 9 while(tmp != 0xfe) 10 { 11 delay_ms(5); //延时去抖 12 tmp = P3; // 读取端口P3 13 while(tmp != 0xfe) 14 { 15 switch (tmp) 16 { 17 case 0xee: 18 num = 0; 19 break; 20 case 0xde: 21 num = 1; 22 break; 23 case 0xbe: 24 num = 2; 25 break; 26 case 0x7e: 27 num = 3; 28 break; 29 } 30 tmp = P3; // 松手检测,松开手tmp=0xfe 31 } 32 } 33 /* 第2行键盘扫描 */ 34 P3 = 0xfd; 35 tmp = P3; // 读取端口P3 36 while(tmp != 0xfd) 37 { 38 delay_ms(5); //延时去抖 39 tmp = P3; // 读取端口P3 40 while(tmp != 0xfd) 41 { 42 switch (tmp) 43 { 44 case 0xee: 45 num = 4; 46 break; 47 case 0xde: 48 num = 5; 49 break; 50 case 0xbe: 51 num = 6; 52 break; 53 case 0x7e: 54 num = 7; 55 break; 56 } 57 tmp = P3; // 松手检测,松开手tmp=0xfe 58 } 59 60 } 61 /* 第3行键盘扫描 */ 62 P3 = 0xfb; 63 tmp = P3; // 读取端口P3 64 while(tmp != 0xfb) 65 { 66 delay_ms(5); //延时去抖 67 tmp = P3; // 读取端口P3 68 while(tmp != 0xfb) 69 { 70 switch (tmp) 71 { 72 case 0xeb: 73 num = 8; 74 break; 75 case 0xdb: 76 num = 9; 77 break; 78 case 0xbb: 79 num = 10; 80 break; 81 case 0x7b: 82 num = 11; 83 break; 84 } 85 tmp = P3; // 松手检测,松开手tmp=0xfe 86 } 87 88 } 89 /* 第4行键盘扫描 */ 90 P3 = 0xf7; 91 tmp = P3; // 读取端口P3 92 while(tmp != 0xf7) 93 { 94 delay_ms(5); //延时去抖 95 tmp = P3; // 读取端口P3 96 while(tmp != 0xf7) 97 { 98 switch (tmp) 99 { 100 case 0xe7: 101 num = 12; 102 break; 103 case 0xd7: 104 num = 13; 105 break; 106 case 0xb7: 107 num = 14; 108 break; 109 case 0x77: 110 num = 15; 111 break; 112 } 113 tmp = P3; // 松手检测,松开手tmp=0xfe 114 } 115 } 116 return num; 117 }
浙公网安备 33010602011771号