按键冲突
最近写按键的时候发现一个很诡异的现象,明明没有按按键T0却一直显示按了,
最后翻看原理图才发现矩阵按键有个端口和独立按键冲突了
就是这个按键,
虽然没直接影响但是对于直接翻转P0口就会和独立按键起矛盾,
于是我就想到了与运算屏蔽这个按键,发现还是不行,
最后抱着试一试的态度与或运算一起用,
就成功了,不太懂为啥会这样
大概就是这么写的。
在这个按键冲突过阵子后我又发现了个诡异的现象,
我没有按按键3.5,也就是按键T1,却显示我按下了,
然后我就去原理图找,也没发现啥矛盾的地方,
这次是真搞不懂了
这个是stc32实验箱? 可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。 soma 发表于 2024-10-5 07:57
这个是stc32实验箱?
是的 乘风飞扬 发表于 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 08:41
可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。
代码我是这么写的,按道理来说能过滤抖动的,松手还有计时消抖 有时没弄明白的,暂时放一放 乘风飞扬 发表于 2024-10-5 08:41
可能是红外接收头输出的杂讯,按键加防抖判断应该就能过滤。
对,就是这个问题,搞了半天终于搞明白了,只要靠近电脑就会误以为按键按下,我电脑有红外光
页:
[1]