找回密码
 立即注册
查看: 412|回复: 7

按键冲突

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-05-02 09:41:21

13

主题

164

回帖

363

积分

中级会员

积分
363
发表于 2024-10-5 07:25:46 | 显示全部楼层 |阅读模式
最近写按键的时候发现一个很诡异的现象,
明明没有按按键T0却一直显示按了,
最后翻看原理图才发现矩阵按键有个端口和独立按键冲突了

F8127DF1214ABABA4657EFE1B798E03C.jpg

就是这个按键,
虽然没直接影响但是对于直接翻转P0口就会和独立按键起矛盾,
于是我就想到了与运算屏蔽这个按键,发现还是不行,
最后抱着试一试的态度与或运算一起用,
就成功了,不太懂为啥会这样
8FAEA22030FD0188EF5F85BAA8F2B1FF.jpg

大概就是这么写的。
    在这个按键冲突过阵子后我又发现了个诡异的现象,

我没有按按键3.5,也就是按键T1,却显示我按下了,
然后我就去原理图找,也没发现啥矛盾的地方,
这次是真搞不懂了
75A76930D5A5AB71B3573F36BE63F5F8.jpg


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-03 00:02:01
已绑定手机

19

主题

3191

回帖

4876

积分

论坛元老

积分
4876
发表于 2024-10-5 07:57:05 来自手机 | 显示全部楼层
这个是stc32实验箱?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-10-5 08:41:52 来自手机 | 显示全部楼层
可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-05-02 09:41:21

13

主题

164

回帖

363

积分

中级会员

积分
363
发表于 2024-10-5 12:51:11 | 显示全部楼层
so*** 发表于 2024-10-5 07:57
这个是stc32实验箱?

是的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-05-02 09:41:21

13

主题

164

回帖

363

积分

中级会员

积分
363
发表于 2024-10-5 12:52:56 | 显示全部楼层
乘风*** 发表于 2024-10-5 08:41
可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。
  1. uint8_t Key_State[4];
  2. /**
  3.    *@brief  功能按键扫描函数,放在1-10ms定时器即可
  4.                                           松手计时时间@Key_RTim 和 长按触发时间@Key_LTim
  5.                                                 根据具体定时器中断时间调整,一般松手时间为100-250ms
  6.    *@param         Key_RTim  Key_LTim  Key_PTim
  7.    *@retval 无
  8.    */
  9. void Key_Scan(void)
  10. {
  11.         static uint8_t Key_PressTime[4];          //按下计时
  12.         static uint8_t Key_ReleaseTime[4]; //松手计时
  13.         static uint8_t Key_PressCount[4];         //按下计次
  14.         static uint8_t Key_PressFlag;                         //按下标志
  15.        
  16.         uint8_t i;
  17.         for(i = 0;i < 4 ;i++)                                                         //循环扫描P32—P35口
  18.         {
  19.                 if(~KEY_PORT & (0x04 << i))
  20.                 {
  21.                         if(~Key_PressFlag & (0x01 << i))
  22.                         {
  23.                                 Key_PressFlag |= (0x01 << i);
  24.                                 Key_PressCount[i]++;
  25.                                 Key_ReleaseTime[i] = Key_RTim;
  26.                         }
  27.                         if(Key_PressTime[i] < 255)
  28.                         {
  29.                                 Key_PressTime[i]++;
  30.                         }
  31.                         if(Key_PressTime[i] == Key_LTim)
  32.                         {
  33.                                 Key_PressCount[i] = 0;
  34.                                 Key_ReleaseTime[i] = 0;
  35.                                 Key_State[i] = Key_Long;
  36.                         }
  37.                        
  38.                 }
  39.                 else
  40.                 {
  41.                         Key_PressFlag &= ~(0x01 << i);
  42.                         Key_PressTime[i] = 0;
  43.                         if(Key_ReleaseTime[i] > 0)
  44.                         {
  45.                                 Key_ReleaseTime[i]--;
  46.                         }
  47.                         else
  48.                         {
  49.                                 if(Key_PressCount[i])
  50.                                 {
  51.                                         switch (Key_PressCount[i])
  52.                                         {
  53.                                                 case 1:         Key_State[i] = Key_Click;  break;
  54.                                                 case 2:         Key_State[i] = Key_Double; break;
  55.                                                 default:        Key_PressCount[i] = 0;                  break;       
  56.                                         }
  57.                                         Key_PressCount[i] = 0;
  58.                                 }
  59.                         }
  60.                 }
  61.         }
  62. }
  63. /**
  64.    *@brief  功能按键状态查询函数,可查询按键的单击双击三击长按状态
  65.    *@param         Key_0 Key_1 Key_2 Key_3   
  66.    *@retval Key_Click Key_Double Key_Long
  67.    */
  68. uint8_t Key_GetState(uint8_t Key_x)
  69. {
  70.         uint8_t Key_Temp[4];
  71.         Key_Temp[Key_x] = Key_State[Key_x];
  72.         Key_State[Key_x] = 0;
  73.         return Key_Temp[Key_x];
  74. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-05-02 09:41:21

13

主题

164

回帖

363

积分

中级会员

积分
363
发表于 2024-10-5 12:54:50 | 显示全部楼层
乘风*** 发表于 2024-10-5 08:41
可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。

代码我是这么写的,按道理来说能过滤抖动的,松手还有计时消抖
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:343
  • 最近打卡:2025-05-02 13:52:41
已绑定手机

6

主题

202

回帖

814

积分

高级会员

积分
814
发表于 2024-10-5 17:00:16 | 显示全部楼层
有时没弄明白的,暂时放一放
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:127
  • 最近打卡:2025-05-02 09:41:21

13

主题

164

回帖

363

积分

中级会员

积分
363
发表于 2024-10-5 21:42:52 | 显示全部楼层
乘风*** 发表于 2024-10-5 08:41
可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。

对,就是这个问题,搞了半天终于搞明白了,只要靠近电脑就会误以为按键按下,我电脑有红外光
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 14:35 , Processed in 0.125951 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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