ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

初识矩阵键盘

初识矩阵键盘 一、硬件连接将51单片机的P1口连接矩阵键盘如下图所示。二、矩阵键盘分析思路先扫第一列其他三列不要管。第一列置0其他三列置1。然后判断行引脚若四个行引脚均为最开始的电平状态高电平无事发生按键当然没按下然后继续判断下一列。反之则不然。三、获取按键基础写法/** * brief 矩阵键盘读取按键键码 * param 无 * retval KeyNumber 按下按键的键码值 * 如果按键按下不放程序会停留在此函数松手的一瞬间返回按键键码没有按键按下时返回0 */ unsigned char MatrixKey() { unsigned char KeyNumber0; P10xFF; P1_30; //也可以直接将P10XF7 P1_7 - P1_0 为 1111 0111 判断第1列是否有按键按下 if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber1;} if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber5;} if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber9;} if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber13;} P10xFF; P1_20; //P1_7 - P1_0 为 1111 1011 判断第2列是否有按键按下 if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber2;} if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber6;} if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber10;} if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber14;} P10xFF; P1_10; //P1_7 - P1_0 为 1111 1101 判断第3列是否有按键按下 if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber3;} if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber7;} if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber11;} if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber15;} P10xFF; P1_00; //P1_7 - P1_0 为 1111 1110 判断第4列是否有按键按下 if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber4;} if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber8;} if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber12;} if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber16;} return KeyNumber; }四、进阶写法/** * brief 矩阵键盘扫描读取按键键码 * param 无 * retval 键码 1~16无按键返回 0 * note 按下不放会阻塞在此函数松手瞬间返回 */ unsigned char MatrixKey(void) { /* 四列的拉低掩码0xF7 / 0xFB / 0xFD / 0xFE 高 4 位全为 1保证行线是输入状态 */ static const unsigned char colMask[4] {0xF7, 0xFB, 0xFD, 0xFE}; unsigned char col; /* 当前扫描的列 0~3 */ unsigned char row; /* 命中的行 0~3 */ unsigned char rowBits; /* 行线电平高 4 位有效 */ for (col 0; col 4; col) { P1 colMask[col]; /* 拉低第 col 列 */ Delay(1); /* 等电平稳定 */ rowBits P1 0xF0; /* 只取行线屏蔽列线 */ if (rowBits 0xF0) /* 高 4 位全 1本列无键 */ continue; Delay(20); /* 消抖 */ rowBits P1 0xF0; if (rowBits 0xF0) /* 抖动消失忽略 */ continue; for (row 0; row 4; row) /* 查是哪一行被拉低 */ { if ((rowBits (0x80 row)) 0) break; } while ((P1 0xF0) ! 0xF0) /* 等待松手 */ ; Delay(20); /* 松手消抖 */ return (unsigned char)(row * 4 col 1); /* 立刻返回 */ } return 0; /* 四列都扫过无键 */ }
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表