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

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:548
  • 最近打卡:2025-07-04 08:01:45
已绑定手机

158

主题

592

回帖

978

积分

高级会员

积分
978
发表于 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 ----
          |        |        |        |

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

5

主题

14

回帖

28

积分

新手上路

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:548
  • 最近打卡:2025-07-04 08:01:45
已绑定手机

158

主题

592

回帖

978

积分

高级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:548
  • 最近打卡:2025-07-04 08:01:45
已绑定手机

158

主题

592

回帖

978

积分

高级会员

积分
978
发表于 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)//连续两次读相等
    {
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:112
  • 最近打卡:2025-07-04 11:05:15

75

主题

6188

回帖

1万

积分

超级版主

积分
13034
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:548
  • 最近打卡:2025-07-04 08:01:45
已绑定手机

158

主题

592

回帖

978

积分

高级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:548
  • 最近打卡:2025-07-04 08:01:45
已绑定手机

158

主题

592

回帖

978

积分

高级会员

积分
978
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:476
  • 最近打卡:2025-07-03 00:07:50
已绑定手机

38

主题

2254

回帖

2818

积分

荣誉版主

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

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-07-04 09:19:00

23

主题

184

回帖

1773

积分

金牌会员

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:112
  • 最近打卡:2025-07-04 11:05:15

75

主题

6188

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-4 17:47 , Processed in 0.132605 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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