##解疑 51单片机独立按键的代码

小白在线求助 2020-12-13 06:47:44
有哪位可以解释一下这串代码的意思嘛 就是怎么运行的 看了半天实在没看懂它的逻辑关系
第一个if的条件是backup[i] != KeySta[i] 这两个数组一开始都赋了初值了啊 不就一直相等吗 那不就进不去if函数内部吗
第二个if条件backup[i] != 0一直是正确的啊 所以它怎么检测的按键是否按下的啊 按照这个不应该总是按下的吗
uchar pdata KeySta[4] = { //4位独立按键当前状态
1, 1, 1, 1
};

void KeyDriver()
{
uint8 i;
static uint8 pdata backup[4] = { //4位独立按键备份值
1, 1, 1, 1
};
for (i=0; i<4; i++)//循环检测4个独立按键
{
if (backup[i] != KeySta[i])//检测按键
{
if(backup[i] != 0) //如果按键按下
{
KeyAction(KeyCodeMap[i]); //调用按键动作函数
}
backup[i] = KeySta[i];//刷新备份值
}
}
}
...全文
5922 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
小白在线求助 2020-12-15
  • 打赏
  • 举报
回复
有点明白了 谢谢
小白在线求助 2020-12-15
  • 打赏
  • 举报
回复
引用 9 楼 luj_1768的回复:
这个代码能用吧?消颤、连按,没有考虑到。
不 这只是代码的一部分 消抖在其他地方
小白在线求助 2020-12-15
  • 打赏
  • 举报
回复
引用 8 楼 UIUI的回复:
[quote=引用 6 楼 小白在线求助 的回复:][quote=引用 2 楼 UIUI的回复:]1, 赋值了,只是初始化而已, 就不能在程序其它地方更改吗?
2, 你第一个问题解决了, 那么第二个问题,也解决了.

但backup是局部变量嘛,在程序其他地方修改,能影响到这里的值?[/quote]


这样理解,行不行.
if (backup[i] != KeySta[i])//检测按键
{
if (backup[i] != 0) //如果按键按下
{
KeyAction(KeyCodeMap[i]); //调用按键动作函数
}
backup[i] = KeySta[i];//刷新备份值
}

//KeySta[I] 应该有其它函数来置位(被按下)复位(弹起).
backup[i] 初始为1,
正常情况下, 上电后, backup[i] 即应该被复位为 0.
上电时, backup[i] 即不可能 等于KeySta[I](上电时, 未被按下), 即进入第一个 if.
然后, 执行一次KeyAction(不确定为什么backup要初始化为1, 按理应该初始化为0,)
然后backup[I] 即为0.
下一个周期
当你按钮按下的时候.
if (backup[i] != KeySta[i])//检测按键 条件即成立, 进入
backup[I] 此时为0, 不执行.
然后.backup[I]保存当前按钮值.即变成1
下一个周期
释放按钮的时候, 会执行.KeyAction.,
再次保存backup[I] 为0.


感觉怪怪的.释放按钮的时候,才执行函数.



[/quote] 对 你说的没错 我又看了一遍 在另外一个函数里面对keysta进行了改变 我以为这个函数是先执行的 其实它前面还有一个函数
小白在线求助 2020-12-14
  • 打赏
  • 举报
回复
引用 2 楼 UIUI的回复:
1, 赋值了,只是初始化而已, 就不能在程序其它地方更改吗?
2, 你第一个问题解决了, 那么第二个问题,也解决了.
但backup是局部变量嘛,在程序其他地方修改,能影响到这里的值?
小白在线求助 2020-12-14
  • 打赏
  • 举报
回复
引用 3 楼 weixin_46056697的回复:
一开始赋值了而已,你下载到实物后,按下按键会有导致电平变化,也就会使1变成0啊。 你没按的时候就一直在循环,直到你按下,就会使第一个if条件达成(某个i值,就是你按下的键)。 而且个人感觉第二个if应该是判断按键是否松开吧,松开了才执行下面语句。
但是无论是keysta还是backup都是我们自己定义的不是吗,按键按下导致电平变化,是怎么影响到我们自己定义的函数的呀
小白在线求助 2020-12-14
  • 打赏
  • 举报
回复
引用 1 楼 智者知已应修善业的回复:
管中窥豹?必定是哪里有修改数组的值才能在函数中作比较。
backup这个数组是在这个函数里定义的,不就只能在这个函数里用吗? 在另外一个函数里修改会影响到这个数组backup的值?
weixin_46056697 2020-12-14
  • 打赏
  • 举报
回复
一开始赋值了而已,你下载到实物后,按下按键会有导致电平变化,也就会使1变成0啊。 你没按的时候就一直在循环,直到你按下,就会使第一个if条件达成(某个i值,就是你按下的键)。 而且个人感觉第二个if应该是判断按键是否松开吧,松开了才执行下面语句。
UIUI 2020-12-14
  • 打赏
  • 举报
回复
1, 赋值了,只是初始化而已, 就不能在程序其它地方更改吗?
2, 你第一个问题解决了, 那么第二个问题,也解决了.
  • 打赏
  • 举报
回复
管中窥豹?必定是哪里有修改数组的值才能在函数中作比较。
luj_1768 2020-12-14
  • 打赏
  • 举报
回复
这个代码能用吧?消颤、连按,没有考虑到。
UIUI 2020-12-14
  • 打赏
  • 举报
回复
引用 6 楼 小白在线求助 的回复:
[quote=引用 2 楼 UIUI的回复:]1, 赋值了,只是初始化而已, 就不能在程序其它地方更改吗?
2, 你第一个问题解决了, 那么第二个问题,也解决了.

但backup是局部变量嘛,在程序其他地方修改,能影响到这里的值?[/quote]


这样理解,行不行.
if (backup[i] != KeySta[i])//检测按键
{
if (backup[i] != 0) //如果按键按下
{
KeyAction(KeyCodeMap[i]); //调用按键动作函数
}
backup[i] = KeySta[i];//刷新备份值
}

//KeySta[I] 应该有其它函数来置位(被按下)复位(弹起).
backup[i] 初始为1,
正常情况下, 上电后, backup[i] 即应该被复位为 0.
上电时, backup[i] 即不可能 等于KeySta[I](上电时, 未被按下), 即进入第一个 if.
然后, 执行一次KeyAction(不确定为什么backup要初始化为1, 按理应该初始化为0,)
然后backup[I] 即为0.
下一个周期
当你按钮按下的时候.
if (backup[i] != KeySta[i])//检测按键 条件即成立, 进入
backup[I] 此时为0, 不执行.
然后.backup[I]保存当前按钮值.即变成1
下一个周期
释放按钮的时候, 会执行.KeyAction.,
再次保存backup[I] 为0.


感觉怪怪的.释放按钮的时候,才执行函数.



27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧