zhange 发表于 2024-6-5 10:01:18

按键扫描键值获取原理是啥??

本帖最后由 zhange 于 2024-6-5 13:47 编辑

看了试验箱的程序和冲哥讲的不一样,看得不是很懂

各位大佬u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};为啥要设置为这几个数字

主要是这几个数字的由来不懂 其他都懂了


u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};
void IO_KeyScan(void)    //50ms call
{
    u8j;

    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;
                if((j != 0) && (T_KeyTable != 0))
                  KeyCode = (j - 1) * 4 + T_KeyTable + 16;    //计算键码,17~32
            }
      }
      else    IO_KeyHoldCnt = 0;
    }
    P0 = 0xff;
}
这俩一结合如何算的键值呀

上边那个数组为啥要取那几个值??????

有没有讲解视频???


AI-32位8051 发表于 2024-6-5 11:06:04



学习冲哥视频第十四通过扫描法识别按键,实战编写了一个密码锁。本次实战的主要任务是编写键码和扫描按键,可以先学习

【新提醒】视频教学:《STC32位8051单片机原理及应用》,200万大奖, 送实验箱; 冲哥版 - 视频教学,《单片机原理及应用》教学改革及实践研讨会,实战技术交流会,会务通知 国芯技术交流网站 - STC全球32位8051爱好者互助交流社区https://www.stcaimcu.com/forum.php?mod=viewthread&tid=323&extra=page%3D1

zhange 发表于 2024-6-5 12:43:38

STCAI-32位8051 发表于 2024-6-5 11:06
学习冲哥视频第十四通过扫描法识别按键,实战编写了一个密码锁。本次实战的主要任务是编写键码和扫描按键 ...

冲哥的代码和这个不一样   他那个我看懂了试验箱带的这个看不懂试验箱这个按键判断有点绕

zhange 发表于 2024-6-5 13:30:14

STCAI-32位8051 发表于 2024-6-5 11:06
学习冲哥视频第十四通过扫描法识别按键,实战编写了一个密码锁。本次实战的主要任务是编写键码和扫描按键 ...

大佬u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};为啥要设置为这几个数字

zhange 发表于 2024-6-5 15:45:57

来人{:4_200:}{:4_200:}

lezjin 发表于 2024-6-5 16:57:02

    IO_KeyState1 ^= 0xff;   //取反
读取的值和0XFF异或之后,相应的位置置1,比如0X81,就是P07,P00两路连接的按键被按下。

一堆判断后到这里:
j = T_KeyTable;
右移4为,就是取IO_KeyState1 的高4为,4个位置的1分别对应1、2、4、8

再判断后到这里:
KeyCode = (j - 1) * 4 + T_KeyTable + 16;    //计算键码,17~32

T_KeyTable 这个同理是取低4位,同样对应1、2、4、8



最后就是一些算法,你需要返回的值是多少,这个数组里边对应的1 、2、4、8位置取出来的数值是1、2、3、4。做一些运算返回你需要的键码值;
u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

我看了半天才大概理解,不知道正确不正确。

lezjin 发表于 2024-6-5 16:57:03

    IO_KeyState1 ^= 0xff;   //取反
读取的值和0XFF异或之后,相应的位置置1,比如0X81,就是P07,P00两路连接的按键被按下。

一堆判断后到这里:
j = T_KeyTable;
右移4为,就是取IO_KeyState1 的高4为,4个位置的1分别对应1、2、4、8

再判断后到这里:
KeyCode = (j - 1) * 4 + T_KeyTable + 16;    //计算键码,17~32

T_KeyTable 这个同理是取低4位,同样对应1、2、4、8



最后就是一些算法,你需要返回的值是多少,这个数组里边对应的1 、2、4、8位置取出来的数值是1、2、3、4。做一些运算返回你需要的键码值;
u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

我看了半天才大概理解,不知道正确不正确。

zhange 发表于 2024-6-5 17:28:04

lezjin 发表于 2024-6-5 16:57
IO_KeyState1 ^= 0xff;   //取反
读取的值和0XFF异或之后,相应的位置置1,比如0X81,就是P07,P00两 ...

我就想知道这个数组咋来的 u8 code T_KeyTable = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

lezjin 发表于 2024-6-5 18:15:39

高4位和低4位,每一个1对应的10进制是8、4、2、1,就是对应这个数组里的偏移量,通过这个取出对应的数值,相当与第几行,第几列,运算后返回键码

zhange 发表于 2024-6-5 19:11:48

lezjin 发表于 2024-6-5 18:15
高4位和低4位,每一个1对应的10进制是8、4、2、1,就是对应这个数组里的偏移量,通过这个取出对应的数值 ...

{:5_272:}6666
页: [1]
查看完整版本: 按键扫描键值获取原理是啥??