一:行列式按键知识
行列式扫描(矩阵键盘)通过将按键排列成矩阵形式,用较少的I/O口检测多个按键。常见的布局有:
4×4矩阵:16个按键,使用8个I/O口
3×4矩阵:12个按键,使用7个I/O口
4×3矩阵:12个按键,使用7个I/O口
二:工作的原理:
步骤1:将所有行设置为输出模式,列设置为输入模式
步骤2:逐行输出低电平(扫描行),其他行保持高电平
步骤3:读取所有列的电平状态
步骤4:如果某列为低电平,说明该列与当前扫描行的交叉点有按键按下。
三:原理图如下所示:

四:软件代码如下所示:
void IO_KeyScan(void) //50ms call
{
u8 j;
j = IO_KeyState1; //保存上一次状态
P0 = 0xf0; //X低,读Y
IO_KeyDelay();
IO_KeyState1 = P0 & 0xf0;
P0 = 0x0f; //Y低,读X
IO_KeyDelay();
IO_KeyState1 |= (P0 & 0x0f);
IO_KeyState1 ^= 0xff; //取反
if(j == IO_KeyState1) //连续两次读相等
{
j = IO_KeyState;
IO_KeyState = IO_KeyState1;
if(IO_KeyState != 0) //有键按下
{
F0 = 0;
if(j == 0) F0 = 1; //第一次按下
else if(j == IO_KeyState)
{
if(++IO_KeyHoldCnt >= 20) //1秒后重键
{
IO_KeyHoldCnt = 18;
F0 = 1;
}
}
if(F0)
{
j = T_KeyTable[IO_KeyState >> 4];
if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0))
KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16; //计算键码,17~32
}
}
else IO_KeyHoldCnt = 0;
}
P0 = 0xff;
}五:总结如下所示:
优点:
节省I/O资源:16个按键只需8个I/O口
扩展性好:容易增加更多按键
成本低:硬件结构简单
缺点:
扫描占用CPU时间
可能存在鬼影问题(多个按键同时按下时)
需要消抖处理
总结
行列式按键设计的核心原理是:通过矩阵坐标定位 + 分时扫描,用有限的I/O资源检测大量按键,是嵌入式系统中高效利用硬件资源的经典设计方法。
我要赚赏金
