
连接方式为8-1顺序连接P1端口P10-P17,代码返回键值 0-15.
cpp
// 矩阵键盘扫描
uchar key_scan(void)
{
u8 key_value = 255;
u8 row, col;
// 设置P1.0-P1.3为输出,P1.4-P1.7为输入
P1 = 0xF0; // 1111 0000
if((P1 & 0xF0) != 0xF0) { // 有按键按下
delay_ms(10); // 消抖
if((P1 & 0xF0) != 0xF0) { // 确认按键按下
// 逐行扫描
for(row = 0; row < 4; row++) {
P1 = ~(1 << row) | 0xF0; // 将当前行置低,其他行置高
// 检查列
if((P1 & 0x10) == 0) col = 0; // 第1列
else if((P1 & 0x20) == 0) col = 1; // 第2列
else if((P1 & 0x40) == 0) col = 2; // 第3列
else if((P1 & 0x80) == 0) col = 3; // 第4列
else continue;
// 计算键值
key_value = row * 4 + col ; // 键值从0开始
// 等待按键释放
while((P1 & 0xF0) != 0xF0);
delay_ms(10); // 消抖
break;
}
}
}
return key_value;
}