找回密码
 立即注册
查看: 103|回复: 11

使用XY查找4x4键的方法键值与表对应关系?

[复制链接]
  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 153 天

    [LV.7]常住居民III

    110

    主题

    458

    回帖

    860

    积分

    高级会员

    积分
    860
    发表于 2024-4-12 09:50:30 | 显示全部楼层 |阅读模式


    //                        1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

        行列键扫描程序
        使用XY查找4x4键的方法,只能单键,速度快

       Y     P04      P05      P06      P07
              |        |        |        |
    X         |        |        |        |
    P00 ---- K00 ---- K01 ---- K02 ---- K03 ----
              |        |        |        |
    P01 ---- K04 ---- K05 ---- K06 ---- K07 ----
              |        |        |        |
    P02 ---- K08 ---- K09 ---- K10 ---- K11 ----
              |        |        |        |
    P03 ---- K12 ---- K13 ---- K14 ---- K15 ----
              |        |        |        |

    回复 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-4-13 22:07
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    5

    主题

    16

    回帖

    25

    积分

    新手上路

    积分
    25
    发表于 2024-4-12 10:20:29 | 显示全部楼层
    既然只支持单键干嘛不直接 key_code = (P0 & 0x0f) ? P0 : 0; 获得唯一键值呢,查表需要额外花费地址计算和访问时间(可能需要DPTR,具体看代码生成)。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 153 天

    [LV.7]常住居民III

    110

    主题

    458

    回帖

    860

    积分

    高级会员

    积分
    860
     楼主| 发表于 2024-4-12 10:47:25 | 显示全部楼层
    lzyor 发表于 2024-4-12 10:20
    既然只支持单键干嘛不直接 key_code = (P0 & 0x0f) ? P0 : 0; 获得唯一键值呢,查表需要额外花费地址计算和 ...

    官方例程,我也是才看的,
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 153 天

    [LV.7]常住居民III

    110

    主题

    458

    回帖

    860

    积分

    高级会员

    积分
    860
     楼主| 发表于 2024-4-17 09:28:01 | 显示全部楼层
    带问号处的两个IO_KeyState,应该有一个是IO_KeyState1,才对,感觉,没看懂。
    /*********矩阵按键扫描************/
    void MatrixKeyScan(void)
    {
        u8  j;
        P0 = 0xf0;
        IO_KeyDelay();
        IO_KeyState = P0 & 0xc0;//这里的“IO_KeyState”???

        P0 = 0x0f;
        IO_KeyDelay();
        IO_KeyState |= (P0 & 0x0f);
        IO_KeyState ^= 0xcf;// 这里的“IO_KeyState”???
       
        if(IO_KeyState == IO_KeyState1)//连续两次读相等
        {
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2931

    回帖

    6607

    积分

    超级版主

    积分
    6607
    发表于 2024-4-23 10:55:15 | 显示全部楼层
    本帖最后由 梁工 于 2024-4-23 10:57 编辑

    这个程序是我首先于2015年第一代学习板(IAP15W4K61S4)发布的程序。
    其对应关系很简单(楼主的行列IO要换换一下,当时没留意改了):

    u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

           Y   P00       P01      P02       P03
                  |           |           |           |
    X            |           |           |           |
    P04 ---- K00 ---- K01 ---- K02 ---- K03 ----
                 |            |           |           |
    P05 ---- K04 ---- K05 ---- K06 ---- K07 ----
                  |           |           |           |
    P06 ---- K08 ---- K09 ---- K10 ---- K11 ----
                  |           |           |           |
    P07 ---- K12 ---- K13 ---- K14 ---- K15 ----
                  |           |           |           |

    P0=0xf0, 读入高4位, P0=0x0f,读入低4位,然后取反IO_KeyState变成正逻辑,即有按键对应的位为1,查表读数就是4个IO对应1~4。
    如果有键按下,则高4位和低4位均有一位为1,比如按下K14,则读到 1000 0100,高4位查表得到4,低4位查表得到3,则键码=(4-1)*4+3=15,即K00~K15对应键码1~16。

    点评

    最早的是2005年杜洋的4x4矩阵键盘行列线反转法  详情 回复 发表于 2024-4-23 14:26
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 153 天

    [LV.7]常住居民III

    110

    主题

    458

    回帖

    860

    积分

    高级会员

    积分
    860
     楼主| 发表于 2024-4-23 11:45:48 | 显示全部楼层
    梁工 发表于 2024-4-23 10:55
    这个程序是我首先于2015年第一代学习板(IAP15W4K61S4)发布的程序。
    其对应关系很简单(楼主的行列IO要换 ...

    太感谢老师的指点,我看到几个DEMO都用到了,就是看不懂,搞得我拐头大,我再看一下,
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 153 天

    [LV.7]常住居民III

    110

    主题

    458

    回帖

    860

    积分

    高级会员

    积分
    860
     楼主| 发表于 2024-4-23 13:52:37 | 显示全部楼层
    梁工 发表于 2024-4-23 10:55
    这个程序是我首先于2015年第一代学习板(IAP15W4K61S4)发布的程序。
    其对应关系很简单(楼主的行列IO要换 ...

    老师:你这个表是如何得?按键是搞懂,确实不看懂

    //                                0 1 2 3 4 5 6 7 8 9101112131415
    uint8_t code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

    点评

    4个IO,其组合一共有16种(下面的序号),但只有4种对应按下一个键。 0000:序号0,无键按下,键码为0 0001:序号1,有键按下,键码为1 0010:序号2,有键按下,键码为2 0011:序号3,异常(多键按下),无效状态,  详情 回复 发表于 2024-4-23 15:18
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    14 小时前
  • 签到天数: 85 天

    [LV.6]常住居民II

    13

    主题

    325

    回帖

    740

    积分

    荣誉版主

    热心市民

    积分
    740
    发表于 2024-4-23 14:26:03 | 显示全部楼层
    梁工 发表于 2024-4-23 10:55
    这个程序是我首先于2015年第一代学习板(IAP15W4K61S4)发布的程序。
    其对应关系很简单(楼主的行列IO要换 ...

    最早的是2005年杜洋的4x4矩阵键盘行列线反转法
    key44-fz{20051122}.pdf (146.89 KB, 下载次数: 6)

    点评

    哦,我在90年代就开始使用这个方法(当时是汇编)。我没看过杜洋的程序。 但是实际项目基本不使用这种方法,实际项目我一般使用定时扫描、最近三次扫描结果处理键的按下、释放、RepeatKey、双击、长按等等。  详情 回复 发表于 2024-4-23 15:10
    睁开眼睛做场梦~~~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 128 天

    [LV.7]常住居民III

    6

    主题

    72

    回帖

    498

    积分

    中级会员

    积分
    498
    发表于 2024-4-23 15:00:53 | 显示全部楼层
    晓飛飛 发表于 2024-4-23 14:26
    最早的是2005年杜洋的4x4矩阵键盘行列线反转法

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2931

    回帖

    6607

    积分

    超级版主

    积分
    6607
    发表于 2024-4-23 15:10:00 | 显示全部楼层
    晓飛飛 发表于 2024-4-23 14:26
    最早的是2005年杜洋的4x4矩阵键盘行列线反转法

    哦,我在90年代就开始使用这个方法(当时是汇编)。我没看过杜洋的程序。
    但是实际项目基本不使用这种方法,实际项目我一般使用定时扫描、最近三次扫描结果处理键的按下、释放、RepeatKey、双击、长按等等。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-2 14:24 , Processed in 0.090666 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表