单片机交流
登录
直播中
申换换
7年用户
1501经验值
私信
关注
[问答]
如何去消除K1-K3的按键问题?有哪几种消抖方法?
开启该帖子的消息推送
按键
按键消抖的实验原理是什么?
如何去消除K1-K3的按键问题?有哪几种消抖方法?
回帖
(2)
张婧怡
2021-7-14 10:27:52
我们前面在电子中的学习中就接触过按键,但是我们只清楚其威廉希尔官方网站 图代表的含义,却不明白真正操作起来会遇到的一系列问题,由于机械触点的弹性,一个按键开关在闭合后不会马上稳定接通,断开时也不会马上断开,如果不处理的话,会导致按键识别为多下,故我们就来研究一下按键消抖(针对的是K1 K2 K3)
实验原理
这个威廉希尔官方网站 图我们在前面已经接触过,但我们现在主要来消除K1-K3的按键问题
当按键被按下的时候,威廉希尔官方网站 导通接地,I/O口为低电平;
当按键未被按下时,威廉希尔官方网站 断开,I/O口保持高电平。
但一般的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,假如不加以处理,会导致按键被识别为按下多次。为了不产生这种现象而作的措施就是按键消抖。
消抖方法
硬件消抖
RS触发器
这是一个双稳态威廉希尔官方网站 ,学过数字逻辑的小伙伴应该会明白
软件消抖
法一:使用延时
检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序
法二:检测多次
可以设定一个检测周期,如果在一个检测周期内,按键被检测为被按下达到了一定次数,则确认为真正被按下
代码解析
由于按下K1加1,按下K2减1
初始化number为5000,显示在数码管上
全局变量
uint number;//显示在数码管上 uint flag;//位选的位置 int count1,count2,count3,count4;//用于消抖计数 bit status_P,status_P2;//记录按键前一状态
设置中断内容
void InterruptTimer0()interrupt 1 { switch(flag) { case 0:P0=0;P2=weixuan[flag];P0=duanxuan[number/1000];break; case 1:P0=0;P2=weixuan[flag];P0=duanxuan[(number/100)%10];break; case 2:P0=0;P2=weixuan[flag];P0=duanxuan[(number%100)/10];break; case 3:P0=0;P2=weixuan[flag];P0=duanxuan[(number%100)%10];break; } flag++; count1++; if(key1==0) { count2++; //记录K1的按下状态 } count3++; if(key2==0) { count4++; //记录K2的按下状态 } }
主函数部分
void main() { Init(); while(1) { if(flag==4)//修正位选位置 flag=0; if(count1==30)//消抖大概6ms,总共统计次数30次 { if(count2》=20)// 如果低电平有效次数为2/3以上 { if(status_P==1) { status_P=0; number++; } } else status_P=1; count1=0; count2=0; } //同理 K2的按键消抖 if(count3==30)//消抖大概6ms,总共统计次数30次 { if(count4》=20)// 如果低电平有效次数为2/3以上 { if(status_P2==1) { status_P2=0; number--; } } else status_P2=1; count3=0; count4=0; } } } 代码比较的简单,其实也算是在一定时间内检测多次,即利用了软件消抖
我们前面在电子中的学习中就接触过按键,但是我们只清楚其威廉希尔官方网站 图代表的含义,却不明白真正操作起来会遇到的一系列问题,由于机械触点的弹性,一个按键开关在闭合后不会马上稳定接通,断开时也不会马上断开,如果不处理的话,会导致按键识别为多下,故我们就来研究一下按键消抖(针对的是K1 K2 K3)
实验原理
这个威廉希尔官方网站 图我们在前面已经接触过,但我们现在主要来消除K1-K3的按键问题
当按键被按下的时候,威廉希尔官方网站 导通接地,I/O口为低电平;
当按键未被按下时,威廉希尔官方网站 断开,I/O口保持高电平。
但一般的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,假如不加以处理,会导致按键被识别为按下多次。为了不产生这种现象而作的措施就是按键消抖。
消抖方法
硬件消抖
RS触发器
这是一个双稳态威廉希尔官方网站 ,学过数字逻辑的小伙伴应该会明白
软件消抖
法一:使用延时
检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序
法二:检测多次
可以设定一个检测周期,如果在一个检测周期内,按键被检测为被按下达到了一定次数,则确认为真正被按下
代码解析
由于按下K1加1,按下K2减1
初始化number为5000,显示在数码管上
全局变量
uint number;//显示在数码管上 uint flag;//位选的位置 int count1,count2,count3,count4;//用于消抖计数 bit status_P,status_P2;//记录按键前一状态
设置中断内容
void InterruptTimer0()interrupt 1 { switch(flag) { case 0:P0=0;P2=weixuan[flag];P0=duanxuan[number/1000];break; case 1:P0=0;P2=weixuan[flag];P0=duanxuan[(number/100)%10];break; case 2:P0=0;P2=weixuan[flag];P0=duanxuan[(number%100)/10];break; case 3:P0=0;P2=weixuan[flag];P0=duanxuan[(number%100)%10];break; } flag++; count1++; if(key1==0) { count2++; //记录K1的按下状态 } count3++; if(key2==0) { count4++; //记录K2的按下状态 } }
主函数部分
void main() { Init(); while(1) { if(flag==4)//修正位选位置 flag=0; if(count1==30)//消抖大概6ms,总共统计次数30次 { if(count2》=20)// 如果低电平有效次数为2/3以上 { if(status_P==1) { status_P=0; number++; } } else status_P=1; count1=0; count2=0; } //同理 K2的按键消抖 if(count3==30)//消抖大概6ms,总共统计次数30次 { if(count4》=20)// 如果低电平有效次数为2/3以上 { if(status_P2==1) { status_P2=0; number--; } } else status_P2=1; count3=0; count4=0; } } } 代码比较的简单,其实也算是在一定时间内检测多次,即利用了软件消抖
举报
李景天
2021-7-14 10:27:55
我们前面在电子中的学习中就接触过按键,但是我们只清楚其威廉希尔官方网站 图代表的含义,却不明白真正操作起来会遇到的一系列问题,由于机械触点的弹性,一个按键开关在闭合后不会马上稳定接通,断开时也不会马上断开,如果不处理的话,会导致按键识别为多下,故我们就来研究一下按键消抖(针对的是K1 K2 K3)
实验原理
这个威廉希尔官方网站 图我们在前面已经接触过,但我们现在主要来消除K1-K3的按键问题
当按键被按下的时候,威廉希尔官方网站 导通接地,I/O口为低电平;
当按键未被按下时,威廉希尔官方网站 断开,I/O口保持高电平。
但一般的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,假如不加以处理,会导致按键被识别为按下多次。为了不产生这种现象而作的措施就是按键消抖。
消抖方法
硬件消抖
RS触发器
这是一个双稳态威廉希尔官方网站 ,学过数字逻辑的小伙伴应该会明白
软件消抖
法一:使用延时
检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序
法二:检测多次
可以设定一个检测周期,如果在一个检测周期内,按键被检测为被按下达到了一定次数,则确认为真正被按下
代码解析
由于按下K1加1,按下K2减1
初始化number为5000,显示在数码管上
全局变量
uint number;//显示在数码管上 uint flag;//位选的位置 int count1,count2,count3,count4;//用于消抖计数 bit status_P,status_P2;//记录按键前一状态
设置中断内容
void InterruptTimer0()interrupt 1 { switch(flag) { case 0:P0=0;P2=weixuan[flag];P0=duanxuan[number/1000];break; case 1:P0=0;P2=weixuan[flag];P0=duanxuan[(number/100)%10];break; case 2:P0=0;P2=weixuan[flag];P0=duanxuan[(number%100)/10];break; case 3:P0=0;P2=weixuan[flag];P0=duanxuan[(number%100)%10];break; } flag++; count1++; if(key1==0) { count2++; //记录K1的按下状态 } count3++; if(key2==0) { count4++; //记录K2的按下状态 } }
主函数部分
void main() { Init(); while(1) { if(flag==4)//修正位选位置 flag=0; if(count1==30)//消抖大概6ms,总共统计次数30次 { if(count2》=20)// 如果低电平有效次数为2/3以上 { if(status_P==1) { status_P=0; number++; } } else status_P=1; count1=0; count2=0; } //同理 K2的按键消抖 if(count3==30)//消抖大概6ms,总共统计次数30次 { if(count4》=20)// 如果低电平有效次数为2/3以上 { if(status_P2==1) { status_P2=0; number--; } } else status_P2=1; count3=0; count4=0; } } } 代码比较的简单,其实也算是在一定时间内检测多次,即利用了软件消抖
我们前面在电子中的学习中就接触过按键,但是我们只清楚其威廉希尔官方网站 图代表的含义,却不明白真正操作起来会遇到的一系列问题,由于机械触点的弹性,一个按键开关在闭合后不会马上稳定接通,断开时也不会马上断开,如果不处理的话,会导致按键识别为多下,故我们就来研究一下按键消抖(针对的是K1 K2 K3)
实验原理
这个威廉希尔官方网站 图我们在前面已经接触过,但我们现在主要来消除K1-K3的按键问题
当按键被按下的时候,威廉希尔官方网站 导通接地,I/O口为低电平;
当按键未被按下时,威廉希尔官方网站 断开,I/O口保持高电平。
但一般的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,假如不加以处理,会导致按键被识别为按下多次。为了不产生这种现象而作的措施就是按键消抖。
消抖方法
硬件消抖
RS触发器
这是一个双稳态威廉希尔官方网站 ,学过数字逻辑的小伙伴应该会明白
软件消抖
法一:使用延时
检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序
法二:检测多次
可以设定一个检测周期,如果在一个检测周期内,按键被检测为被按下达到了一定次数,则确认为真正被按下
代码解析
由于按下K1加1,按下K2减1
初始化number为5000,显示在数码管上
全局变量
uint number;//显示在数码管上 uint flag;//位选的位置 int count1,count2,count3,count4;//用于消抖计数 bit status_P,status_P2;//记录按键前一状态
设置中断内容
void InterruptTimer0()interrupt 1 { switch(flag) { case 0:P0=0;P2=weixuan[flag];P0=duanxuan[number/1000];break; case 1:P0=0;P2=weixuan[flag];P0=duanxuan[(number/100)%10];break; case 2:P0=0;P2=weixuan[flag];P0=duanxuan[(number%100)/10];break; case 3:P0=0;P2=weixuan[flag];P0=duanxuan[(number%100)%10];break; } flag++; count1++; if(key1==0) { count2++; //记录K1的按下状态 } count3++; if(key2==0) { count4++; //记录K2的按下状态 } }
主函数部分
void main() { Init(); while(1) { if(flag==4)//修正位选位置 flag=0; if(count1==30)//消抖大概6ms,总共统计次数30次 { if(count2》=20)// 如果低电平有效次数为2/3以上 { if(status_P==1) { status_P=0; number++; } } else status_P=1; count1=0; count2=0; } //同理 K2的按键消抖 if(count3==30)//消抖大概6ms,总共统计次数30次 { if(count4》=20)// 如果低电平有效次数为2/3以上 { if(status_P2==1) { status_P2=0; number--; } } else status_P2=1; count3=0; count4=0; } } } 代码比较的简单,其实也算是在一定时间内检测多次,即利用了软件消抖
举报
更多回帖
rotate(-90deg);
回复
相关问答
按键
怎样通过
按键
去
控制LED灯的亮与灭呢
2021-09-23
2331
有
什么
方法
去
实现
按键
的
消
抖
呢
2021-12-15
1352
STM32
按键
方法
有
哪几种
?
2021-11-26
1110
请问怎样
去
设计一种
按键
消
抖
威廉希尔官方网站 ?
2021-04-29
2004
软件
消
抖
威廉希尔官方网站 中存在的不足是什么?
2021-05-06
1706
ACEX
1K
系列器件实现加载的
方法
有
哪几种
?
2021-04-15
765
矩阵
按键
是否被按下的检测
方法
有
哪几种
呢
2022-02-23
1980
按键
检测gpio中断的方式
方法
有
哪几种
?
2022-02-07
1300
求大佬分享一个堵塞式
按键
消
抖
程序
2022-01-17
491
矩阵
按键
的原理是什么?
有
哪几种
扫描方式呢
2022-01-18
1296
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分