这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 学习AI8051开发板例程:08AI8051的行列式按键扫描

共1条 1/1 1 跳转至

学习AI8051开发板例程:08AI8051的行列式按键扫描

高工
2025-11-25 15:14:43     打赏

一:行列式按键知识

行列式扫描(矩阵键盘)通过将按键排列成矩阵形式,用较少的I/O口检测多个按键。常见的布局有:

4×4矩阵:16个按键,使用8个I/O口

3×4矩阵:12个按键,使用7个I/O口

4×3矩阵:12个按键,使用7个I/O口

二:工作的原理:

步骤1:将所有行设置为输出模式,列设置为输入模式

步骤2:逐行输出低电平(扫描行),其他行保持高电平

步骤3:读取所有列的电平状态

步骤4:如果某列为低电平,说明该列与当前扫描行的交叉点有按键按下。

三:原理图如下所示:

1125-1.png

四:软件代码如下所示:

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资源检测大量按键,是嵌入式系统中高效利用硬件资源的经典设计方法。




关键词: AI8051     行列式     扫描    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]