找回密码
 立即注册
查看: 450|回复: 9

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:236
  • 最近打卡:2025-05-04 07:52:37

61

主题

818

回帖

1502

积分

金牌会员

积分
1502
发表于 2024-6-5 10:01:18 | 显示全部楼层 |阅读模式
本帖最后由 zhange 于 2024-6-5 13:47 编辑

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

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

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


  1. u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};
复制代码
  1. void IO_KeyScan(void)    //50ms call
  2. {
  3.     u8  j;
  4.     j = IO_KeyState1;   //保存上一次状态
  5.     P0 = 0xf0;  //X低,读Y
  6.     IO_KeyDelay();
  7.     IO_KeyState1 = P0 & 0xf0;
  8.     P0 = 0x0f;  //Y低,读X
  9.     IO_KeyDelay();
  10.     IO_KeyState1 |= (P0 & 0x0f);
  11.     IO_KeyState1 ^= 0xff;   //取反
  12.    
  13.     if(j == IO_KeyState1)   //连续两次读相等
  14.     {
  15.         j = IO_KeyState;
  16.         IO_KeyState = IO_KeyState1;
  17.         if(IO_KeyState != 0)    //有键按下
  18.         {
  19.             F0 = 0;
  20.             if(j == 0)  F0 = 1; //第一次按下
  21.             else if(j == IO_KeyState)
  22.             {
  23.                 if(++IO_KeyHoldCnt >= 20)   //1秒后重键
  24.                 {
  25.                     IO_KeyHoldCnt = 18;
  26.                     F0 = 1;
  27.                 }
  28.             }
  29.             if(F0)
  30.             {
  31.                 j = T_KeyTable[IO_KeyState >> 4];
  32.                 if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0))
  33.                     KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16;    //计算键码,17~32
  34.             }
  35.         }
  36.         else    IO_KeyHoldCnt = 0;
  37.     }
  38.     P0 = 0xff;
  39. }
复制代码
这俩一结合  如何算的键值呀  

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

有没有讲解视频???  


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2025-04-30 10:59:33

25

主题

1154

回帖

2391

积分

超级版主

积分
2391
发表于 2024-6-5 11:06:04 | 显示全部楼层
截图202406051100283746.jpg

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

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

STC官网:https://www.stcai.com/
QQ:2593903262
微信号:18106296598
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:236
  • 最近打卡:2025-05-04 07:52:37

61

主题

818

回帖

1502

积分

金牌会员

积分
1502
发表于 2024-6-5 12:43:38 | 显示全部楼层
STCAI-32*** 发表于 2024-6-5 11:06
学习冲哥视频第十四通过扫描法识别按键,实战编写了一个密码锁。本次实战的主要任务是编写键码和扫描按键 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:236
  • 最近打卡:2025-05-04 07:52:37

61

主题

818

回帖

1502

积分

金牌会员

积分
1502
发表于 2024-6-5 13:30:14 | 显示全部楼层
STCAI-32*** 发表于 2024-6-5 11:06
学习冲哥视频第十四通过扫描法识别按键,实战编写了一个密码锁。本次实战的主要任务是编写键码和扫描按键 ...

大佬  u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};  为啥要设置为这几个数字
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:236
  • 最近打卡:2025-05-04 07:52:37

61

主题

818

回帖

1502

积分

金牌会员

积分
1502
发表于 2024-6-5 15:45:57 | 显示全部楼层
来人
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

积分
1160
发表于 2024-6-5 16:57:02 | 显示全部楼层
    IO_KeyState1 ^= 0xff;   //取反
读取的值和0XFF异或之后,相应的位置置1,比如0X81,就是P07,  P00两路连接的按键被按下。

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

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

T_KeyTable[IO_KeyState & 0x0f] 这个同理是取低4位,同样对应1、2、4、8



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

我看了半天才大概理解,不知道正确不正确。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

积分
1160
发表于 2024-6-5 16:57:03 | 显示全部楼层
    IO_KeyState1 ^= 0xff;   //取反
读取的值和0XFF异或之后,相应的位置置1,比如0X81,就是P07,  P00两路连接的按键被按下。

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

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

T_KeyTable[IO_KeyState & 0x0f] 这个同理是取低4位,同样对应1、2、4、8



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

我看了半天才大概理解,不知道正确不正确。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:236
  • 最近打卡:2025-05-04 07:52:37

61

主题

818

回帖

1502

积分

金牌会员

积分
1502
发表于 2024-6-5 17:28:04 | 显示全部楼层
lez*** 发表于 2024-6-5 16:57
IO_KeyState1 ^= 0xff;   //取反
读取的值和0XFF异或之后,相应的位置置1,比如0X81,就是P07,  P00两 ...

我就想知道这个数组咋来的 u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

积分
1160
发表于 2024-6-5 18:15:39 | 显示全部楼层
高4位和低4位,每一个1对应的10进制是  8、4、2、1,就是对应这个数组里的偏移量,通过这个取出对应的数值,相当与第几行,第几列,运算后返回键码
截图202406051813175030.jpg
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:236
  • 最近打卡:2025-05-04 07:52:37

61

主题

818

回帖

1502

积分

金牌会员

积分
1502
发表于 2024-6-5 19:11:48 | 显示全部楼层
lez*** 发表于 2024-6-5 18:15
高4位和低4位,每一个1对应的10进制是  8、4、2、1,就是对应这个数组里的偏移量,通过这个取出对应的数值 ...

{:5_272:}6666
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-4 09:57 , Processed in 0.151442 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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