阿杰爱学单片机 发表于 2024-10-5 07:25:46

按键冲突

最近写按键的时候发现一个很诡异的现象,
明明没有按按键T0却一直显示按了,
最后翻看原理图才发现矩阵按键有个端口和独立按键冲突了



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


大概就是这么写的。
    在这个按键冲突过阵子后我又发现了个诡异的现象,
我没有按按键3.5,也就是按键T1,却显示我按下了,
然后我就去原理图找,也没发现啥矛盾的地方,
这次是真搞不懂了



soma 发表于 2024-10-5 07:57:05

这个是stc32实验箱?

乘风飞扬 发表于 2024-10-5 08:41:52

可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。

阿杰爱学单片机 发表于 2024-10-5 12:51:11

soma 发表于 2024-10-5 07:57
这个是stc32实验箱?

是的

阿杰爱学单片机 发表于 2024-10-5 12:52:56

乘风飞扬 发表于 2024-10-5 08:41
可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。

uint8_t Key_State;

/**
   *@brief功能按键扫描函数,放在1-10ms定时器即可
                                          松手计时时间@Key_RTim 和 长按触发时间@Key_LTim
                                                根据具体定时器中断时间调整,一般松手时间为100-250ms
   *@param         Key_RTimKey_LTimKey_PTim
   *@retval 无
   */
void Key_Scan(void)
{
        static uint8_t Key_PressTime;        //按下计时
        static uint8_t Key_ReleaseTime; //松手计时
        static uint8_t Key_PressCount;       //按下计次
        static uint8_t Key_PressFlag;                       //按下标志
       
        uint8_t i;
        for(i = 0;i < 4 ;i++)                                                       //循环扫描P32—P35口
        {
                if(~KEY_PORT & (0x04 << i))
                {
                        if(~Key_PressFlag & (0x01 << i))
                        {
                                Key_PressFlag |= (0x01 << i);
                                Key_PressCount++;
                                Key_ReleaseTime = Key_RTim;
                        }
                        if(Key_PressTime < 255)
                        {
                                Key_PressTime++;
                        }
                        if(Key_PressTime == Key_LTim)
                        {
                                Key_PressCount = 0;
                                Key_ReleaseTime = 0;
                                Key_State = Key_Long;
                        }
                       
                }
                else
                {
                        Key_PressFlag &= ~(0x01 << i);
                        Key_PressTime = 0;
                        if(Key_ReleaseTime > 0)
                        {
                                Key_ReleaseTime--;
                        }
                        else
                        {
                                if(Key_PressCount)
                                {
                                        switch (Key_PressCount)
                                        {
                                                case 1:         Key_State = Key_Click;break;
                                                case 2:         Key_State = Key_Double; break;
                                                default:        Key_PressCount = 0;                break;       
                                        }
                                        Key_PressCount = 0;
                                }
                        }
                }
        }
}

/**
   *@brief功能按键状态查询函数,可查询按键的单击双击三击长按状态
   *@param         Key_0 Key_1 Key_2 Key_3   
   *@retval Key_Click Key_Double Key_Long
   */
uint8_t Key_GetState(uint8_t Key_x)
{
        uint8_t Key_Temp;
        Key_Temp = Key_State;
        Key_State = 0;
        return Key_Temp;
}

阿杰爱学单片机 发表于 2024-10-5 12:54:50

乘风飞扬 发表于 2024-10-5 08:41
可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。

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

springvirus 发表于 2024-10-5 17:00:16

有时没弄明白的,暂时放一放

阿杰爱学单片机 发表于 2024-10-5 21:42:52

乘风飞扬 发表于 2024-10-5 08:41
可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。

对,就是这个问题,搞了半天终于搞明白了,只要靠近电脑就会误以为按键按下,我电脑有红外光
页: [1]
查看完整版本: 按键冲突