380091044 发表于 2024-4-12 09:50:30

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



//                        1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
u8 code T_KeyTable = {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 ----
          |      |      |      |

lzyor 发表于 2024-4-12 10:20:29

既然只支持单键干嘛不直接 key_code = (P0 & 0x0f) ? P0 : 0; 获得唯一键值呢,查表需要额外花费地址计算和访问时间(可能需要DPTR,具体看代码生成)。{:4_164:}

380091044 发表于 2024-4-12 10:47:25

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

官方例程,我也是才看的,

380091044 发表于 2024-4-17 09:28:01

带问号处的两个IO_KeyState,应该有一个是IO_KeyState1,才对,感觉,没看懂。
/*********矩阵按键扫描************/
void MatrixKeyScan(void)
{
    u8j;
    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)//连续两次读相等
    {

梁工 发表于 2024-4-23 10:55:15

本帖最后由 梁工 于 2024-4-23 10:57 编辑

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

u8 code T_KeyTable = {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。

380091044 发表于 2024-4-23 11:45:48

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

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

380091044 发表于 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 = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

晓飛飛 发表于 2024-4-23 14:26:03

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

最早的是2005年杜洋的4x4矩阵键盘行列线反转法

Tuier 发表于 2024-4-23 15:00:53

晓飛飛 发表于 2024-4-23 14:26
最早的是2005年杜洋的4x4矩阵键盘行列线反转法

{:4_250:}

梁工 发表于 2024-4-23 15:10:00

晓飛飛 发表于 2024-4-23 14:26
最早的是2005年杜洋的4x4矩阵键盘行列线反转法

哦,我在90年代就开始使用这个方法(当时是汇编)。我没看过杜洋的程序。
但是实际项目基本不使用这种方法,实际项目我一般使用定时扫描、最近三次扫描结果处理键的按下、释放、RepeatKey、双击、长按等等。
页: [1] 2
查看完整版本: 使用XY查找4x4键的方法键值与表对应关系?