单片机按键去抖程序
单片机的按键消抖与几种按键电路
用其他的各类触发器,锁存器亦可达到消抖效果。 二、 软件消抖 : 通过软件延时 10ms 达到消除抖动的效果,不加文字赘述。 三、 按键电路 : 独立按键
矩阵按键 译码按键 AD 模拟按键 锁定按键
单片机的按键消抖与几种按键电路
一、 硬件消抖 : 按键防抖电路控制电路 所示利用 RC 积分电路来达成杂波的滤除与波形修整的电路(如图 1 )。 在 S1 ON 的瞬间由于接触弹跳的关系,会使 A 点电压呈现高速的断 续现象,再 S1 OFF 时亦然,详(如图 2 所示),然而由于电容两端电压需由 电压经电阻慢慢充电才会上升,使得 B 点电位缓步上升情形:S1 OFF 时亦 然,电容电压经 R 放电,使 B 点电压缓缓下降。此一变化,经史密特反相 修整后,可得一标准负脉波输出,如波
单片机51 去抖按键程序
#define START_TIMER1 TR1=1
#define STOP_TIMER10 TR1=0
#define KD_VAL 15
sbit Ktemph=P1^0;
sbit Ktempl=P1^1;
sbit Ktime=P1^2;
sbit Kset=P1^3;
unsigned char Irbufnum;
unsigned char Irbuf[6];
unsigned char Recposi;
unsigned int idata Irbuffer[50];
unsigned char Kscanbuf[8];
unsigned char Kscan[8];
unsigned char Kcount[8];
RCAP2L = 0XB8 ;
TR2=1;
EX0=1;/*ÔÊÐíÍⲿ0ÖжÏ*/
EA = 1;/*¿ªÈ«¾ÖÖжÏ*/
TR0=0;
TMOD|=1<<4;/*¼ÆʱÆ÷1×÷Ϊ16λ*/
ET1=1;
TH1=0xf8;
TL1=0xcc;
TR1=1;
PX0=1;/*ÍⲿÖжÏ0ÓÅÏÈ*/
IT0=1;/*ϽµÑØ´¥·¢ÖжÏ*/
/*ET0=1;*/
/*ES = 1;*//*ÔÊÐí´®ÐпÚÖжÏ*/
TCLK = 1 ; /*¶¨Ê±Æ÷2ÓÃ×÷²¨ÌØÂÊ·¢ÉúÆ÷*/
RCLK = 1 ;
/*¾§Õñ 22.1184 £¬ 6T £¬²¨ÌØÂÊ9600*/
RCAP2H = 0xff ;
按键开关消抖程序
按键开关消抖程序实践中,单片机端口在连接开关器件时都要考虑消抖的问题,或在硬件上增加延迟,或是增加软件延迟查询的功能模块。
这里,我们考虑这样一个检测电路:单片机连接一个开关和两个LED。
程序是这样的,如果开关的消抖正确,就点亮LED1,否则就闪亮LED2。
按下开关,点亮LED1,释放开关,LED1即熄灭。
我们加入20 毫秒的消抖延迟时间。
当检测到开关为低电平时,单片机在延迟20 毫秒后再次检测开关的状态。
如果此时开关状态为高,则LED2就闪亮,如为低则点亮LED1。
源代码:led1bitP2.0led2bitP2.1switch1bitP1.0ORG 0000hsetb switch1//initialize switch 1 as inputsetb led1//Turn OFF LED1setb led2//Turn OFF LED2wait:jb switch1,wait// Wait till switch1 has been pressedcall debounce_delayjb switch1,c1_wait//switch low even after debouncing period//switch has been succesfully debouncedclr led1//Turn ON LED1jnb switch1,$//wait till switch has been releasedsetb led1//Turn OFF LED1ajmp waitc1_wait://Switch PIN high after debounce period so error in debouncingcpl led2ajmp waitdebounce_delay://Subroutine for generating 20ms delaymov r7,#245l1_debounce_delay:mov r6,#40djnz r6,$djnz r7,l1_debounce_delayretENDtips:感谢大家的阅读,本文由我司收集整编。
单片机按键电容消抖电路
单片机按键电容消抖电路1.引言1.1 概述概述部分的内容:在许多电子设备中,按键电路常常被使用来实现用户与设备之间的交互。
然而,由于按键的物理特性,如机械弹性和触点接触的不稳定性,会导致按键的震荡现象,即按键在按下或释放时会产生多次跳变。
这种跳变会导致单片机误读按键的信号,可能引发系统错误操作或不稳定的现象。
因此,为了保证按键信号的可靠性和稳定性,需要对按键进行消抖处理。
本篇文章将详细介绍单片机按键电容消抖电路的设计和实现原理。
通过在按键电路中引入电容元件,可以达到消抖的效果。
电容元件具有快速充放电的特性,可以有效地过滤掉按键震荡带来的干扰信号,确保单片机正确读取按键状态。
文章将首先介绍单片机按键的工作原理,包括按键的接口电路和输入电平变化的检测方式。
接着,将深入探讨按键消抖的必要性,分析不进行消抖处理所带来的潜在问题。
在这之后,将详细介绍按键电容消抖电路的设计原理,包括电容的连接方式和参数的选择。
最后,将给出经过实际测试的电路实现结果和相关性能指标的评估。
通过本文的阅读,读者将能够了解单片机按键的基本原理和消抖处理的必要性,掌握按键电容消抖电路的设计和实现方法,以及了解该电路的性能表现。
这对于开发单片机应用的工程师和爱好者来说,具有一定的指导意义和实践价值。
文章结构部分的内容是对整篇文章的组织和布局进行描述。
它向读者展示了文章的章节和主题,并指导读者理解和阅读文章的内容。
在本文中,文章结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 单片机按键原理2.2 按键消抖的必要性3. 结论3.1 按键电容消抖电路的设计原理3.2 电路实现与测试结果文章的结构分为引言、正文和结论三个主要部分。
在引言部分,概述简要介绍了单片机按键电容消抖电路的背景和重要性;文章结构部分指出了本文的章节组成和布局,为读者提供了阅读指南;目的阐明了文章的目标和意图。
正文部分主要包括单片机按键原理和按键消抖的必要性。
一种软件去除键抖动的方法
一种软件去除键抖动的方法摘要:单片机控制系统中大多使用控制键来实现控制功能。
消除按键瞬间的抖动是设计者必须要考虑的问题。
本文介绍一种很实用的软件去抖动方法,它借助于单片机内的定时中断资源,只要运算一下逻辑表达就完成了去抖动。
这个方法效率高,不耗机时且易实现。
文中使用的逻辑表达式由简单卡诺图和真值表推出,使该方法的机理容易理解。
文中还提供用C51单片机编程语言编写的实用例程。
关键词:单片机键处理控制系统去抖动键盘概述在单片机控制系统中,通过按键实现控制功能是很常见的。
对按键处理的重要环节是去抖动,包括去除按下和抬起瞬间的抖动。
去抖动的方法有很多种,如使用R-S触发器的硬件方法、运用不同算法的各种软件方法等。
硬件方法会增加成本和体积,对于按键较多的矩阵式键盘,会用硬件方法;软件方法用的比较普遍,但有一种加固定延时的去抖动法效率最低,它以无谓地耗费机时来实现去抖动。
此处介绍的是一种软件方法。
简单说来是一种运算法,配合定时中断读取按键,通过运算逻辑表达式:Keradyn=Ktemp Kinput+Kreadyn-1 (Ktemp ⊙Kinput) (1)Ktemp=Kinput (2)可以获得消除抖动的按键消息。
这种方法效率高,不需耗时的循环等待,而且算法简单、使用方便。
一、基本原理由于按键的按下与抬起都会有10~20ms的抖动毛刺存在,因此,为了获取稳定的按键信息,须要避开这段抖动期。
设置3个变量Kready、Ktemp和Kinput,并设置定时中断周期为20ms。
在定时中断服务程序中读取按键,并把读取的数据存于变量Kinput中。
变量Kready中是所需要的稳定的按键信息;Ktemp是中间变量,它的值是上一次的Kinput。
根据当前按键的状态,考虑到Kready中是20ms抖动后的有效键信息,则Kready、K temp和Kinput之间,在不同时刻的状态关系如表1所列。
表1时刻1为没有键按下的初始状态;时刻2的Kinput为1,但时刻3的Kinput又变为0,说明时刻2的Kinput为1并不是有键按下,可能只是干扰,所以Kreqdy为0;时刻4同时刻2的情况类似,但是时刻4和时刻5时Kinput都为1,说明有按键按下,在时刻5时Kr eady为1;虽然时刻7时Kinput为0,但时刻5、6、8时Kinput都为1,说明按键一直按下,只不过有干扰,Kready保持为1;时刻9、10连续两个时刻Kinput为0,表示按键抬起,时刻10时Kready为0。
单片机按键去抖
单片机按键去抖
我们首先要清楚为什么要按键去抖。
先看先按键按下的波形图
通过这个图形就很清楚为什么要按键去抖了,要是不去抖的话,当按下按键的时候就会在0~5ms 内出现抖动,相当于在不停地按下按键而就不是只按了一次了。
稳定闭合时间大约是10ms,松手抖动的时间和按下抖动的时间差不多。
去抖的方法有硬件去抖和软件去抖
我们常用牺牲CPU 的时间来软件去抖,就是按下按键后延时5~10ms 时间后再来检查是否有按键按下,松手检测也一样。
硬件去抖的方法如图所示
独立按键的去抖方法很简单,就是在按下和松手后分别加一小段延时再来判断。
例:
sbit key=P1;
........................
.......................
if(!key) //如果有按键按下
{
delay(10); //延时一小段时间
if(!key) //真有按键按下
{。
// 执行按键按下后的操作
}
while(!key); // 松手检测,要是没有松手的话就一直执行while 循环。
单片机 电子钟(显示 键盘 去抖)程序
键盘(KEY)MOV 21H,#0MAIN: LCALL KEYQU ;键盘去抖LCALL KEYRD ;读键值SJMP MAINKEYQU: MOV KEYP,#0FFHANL KEYP,#11110000B ;检测四行键NOPMOV A,KEYPCPL AANL A,#0F0HJZ KEYR1JB KT,KEYQUEJNB KD,KEYR2SETB KTSETB KCLJMP KEYQUEKEYR2: SETB KDLJMP KEYQUEKEYR1: CLR KDCLR KTKEYQUE: RETKEYRD: JNB KC,KEYRD1CLR KCMOV KEYP,#0FFHANL KEYP,#11111110B ;检测第一行键NOPMOV A,KEYPJNB ACC.7,KEYR14JNB ACC.6,KEYR13JNB ACC.5,KEYR12JNB ACC.4,KEYR11LJMP KEYRD2KEYRD1: LJMP KEYRDEKEYR11: MOV KEYZ,#1LJMP KEYRDEKEYR12: MOV KEYZ,#2LJMP KEYRDEKEYR13: MOV KEYZ,#3LJMP KEYRDEKEYR14: MOV KEYZ,#4LJMP KEYRDEKEYRD2: MOV KEYP,#0FFHANL KEYP,#11111101B ;检测第二行键NOPMOV A,KEYPJNB ACC.7,KEYR24JNB ACC.6,KEYR23JNB ACC.5,KEYR22JNB ACC.4,KEYR21LJMP KEYRD3KEYR21: MOV KEYZ,#5LJMP KEYRDEKEYR22: MOV KEYZ,#6LJMP KEYRDEKEYR23: MOV KEYZ,#7LJMP KEYRDEKEYR24: MOV KEYZ,#8LJMP KEYRDEKEYRD3: MOV KEYP,#0FFHANL KEYP,#11111011B ;检测第三行键NOPMOV A,KEYPJNB ACC.7,KEYR34JNB ACC.6,KEYR33JNB ACC.5,KEYR32JNB ACC.4,KEYR31LJMP KEYRD4KEYR31: MOV KEYZ,#9LJMP KEYRDEKEYR32: MOV KEYZ,#10LJMP KEYRDEKEYR33: MOV KEYZ,#11LJMP KEYRDEKEYR34: MOV KEYZ,#12LJMP KEYRDEKEYRD4: MOV KEYP,#0FFHANL KEYP,#11110111B ;检测第四行键NOPMOV A,KEYPJNB ACC.7,KEYR44JNB ACC.6,KEYR43JNB ACC.5,KEYR42JNB ACC.4,KEYR41LJMP KEYRD2KEYR41: MOV KEYZ,#13LJMP KEYRDEKEYR42: MOV KEYZ,#14LJMP KEYRDEKEYR43: MOV KEYZ,#15LJMP KEYRDEKEYR44: MOV KEYZ,#16LJMP KEYRDEKEYRDE: RETKC BIT 21H.0 ;处理键KD BIT 21H.1 ;去抖KT BIT 21H.2 ;抬键BIAOZ DATA 20H ;标志:.0定时到。
单片机实验3LDE数码管动态显示与按键去抖程序
1、MAIN.ASM;====变量定义段====CS0 BIT P2.0 ;个位位选CS1 BIT P2.1 ;十位位选CS2 BIT P2.2 ;百位位选CS3 BIT P2.3 ;千位位选CS4 BIT P2.4 ;LED灯位选DSW EQU 30H ;位选计数DSB0 EQU 31H ;显示缓冲单元个位DSB1 EQU 32H ;显示缓冲单元十位DSB2 EQU 33H ;显示缓冲单元百位DSB3 EQU 34H ;显示缓冲单元千位DSB4 EQU 20H ;显示缓冲单元指示灯状态LD1 BIT DSB4.0 ;指示灯LD1控制位LD2 BIT DSB4.1 ;指示灯LD2控制位LD3 BIT DSB4.2 ;指示灯LD3控制位LD4 BIT DSB4.3 ;指示灯LD4控制位LD5 BIT DSB4.4 ;指示灯LD5控制位LD6 BIT DSB4.5 ;指示灯LD6控制位LD7 BIT DSB4.6 ;指示灯LD7控制位LD8 BIT DSB4.7 ;指示灯LD8控制位KEY EQU 21H ;键状态字SW1 BIT KEY.6 ;SW1键SW2 BIT KEY.7 ;SW2键EKEY EQU 22H ;键前沿字ESW1 BIT EKEY.6 ;SW1键前沿ESW2 BIT EKEY.7 ;SW2键前沿KTMR EQU 35H ;键去抖延时器AJS1 EQU 40H ;每按一次SW1,(AJS2:AJS1)+1 AJS2 EQU 41H ;每按一次SW2,(AJS2:AJS1)-1 ;====常数定义段====;==================ORG 0000HLJMP MAINORG 0030HMAIN: INCLUDE "INITIAL.INC"MLOOP: LCALL DELAY ;延时5msLCALL RDKEY ;读键LCALL DISPJNB ESW1,M03 ;无SW1键转移MOV R6,#00HMOV R7,#01HSJMP M05M03: JB ESW2,M04 ;有SW2键转移LJMP MLOOPM04: MOV R6,#99HMOV R7,#99HM05: MOV A,AJS1 ;(AJS2:AJS1)十进制±1ADD A,R7DA AMOV AJS1,AMOV A,AJS2ADDC A,R6DA AMOV AJS2,AMOV A,AJS1 ;(AJS2:AJS1)送显示ANL A,#0FHMOV DSB0,AMOV A,AJS1SW AP AANL A,#0FHMOV DSB1,AMOV A,AJS2ANL A,#0FHMOV DSB2,AMOV A,AJS2SW AP AANL A,#0FHMOV DSB3,ALJMP MLOOP;====延时子程序(2*R7+3)*R6+5=5ms====DELAY: MOV R6,#0AHDL01: MOV R7,#0F8HDL02: DJNZ R7,DL02DJNZ R6,DL01RET;====通用子程序段====INCLUDE "RDKEY.ASM";添加读键状态及去抖处理子程序INCLUDE "DISP.ASM" ;添加数码管动态扫描显示子程序END2、INITIAL.INCMOV SP,#5FHMOV R0,#20HMOV R7,#60HCLR AM01: MOV @R0,A ;存储器20H-7FH清零INC R0DJNZ R7,M01MOV DSB0,#03HMOV DSB1,#01HMOV DSB2,#01HMOV DSB3,#07HMOV R4,#0C8HM02: LCALL DELAYLCALL DISP ;显示"7113"1秒DJNZ R4,M02CLR AMOV DSB0,AMOV DSB1,AMOV DSB2,AMOV DSB3,AEND3、RDKEY.ASM;====读独立按键子程序(延时去抖)==== RDKEY: ORL P1,#0C0H ;先置1,后读口MOV A,P1 ;读键ANL A,#0C0H ;接独立键盘的位保留XRL A,#0C0H ;求反转正逻辑MOV R7,A ;新的键状态暂存R7CJNE A,KEY,RDK0 ;键状态变化则转移MOV KTMR,#05H ;去抖延时器加载初值SJMP RDK1RDK0: MOV A,KTMR ;过了延时时间?JZ RDK1DEC KTMR ;延时未结束MOV R7,KEY ;放弃不稳定的键状态RDK1: MOV A,KEY ;键前沿提取XRL A,R7ANL A,R7MOV EKEY,AMOV KEY,R7 ;启用键的新状态RETEND4、DISP.ASM;====5位数码管扫描子程序====DISP: ORL P2,#1FH ;关闭数码显示器MOV A,DSW ;根据扫描循环变量转移ANL A,#07HRL AMOV DPTR,#DSTABJMP @A+DPTRDSTAB: AJMP DIS0AJMP DIS1AJMP DIS2AJMP DIS3AJMP DIS4AJMP DIS0AJMP DIS0AJMP DIS0DIS0: MOV A,DSB0 ;扫描个位数码管ANL A,#0FHMOV DPTR,#LED7 ;查显缓个位值的七段码表MOVC A,@A+DPTRMOV P0,A ;七段码送P0口CLR CS0 ;点亮个位数码管MOV DSW,#01H ;扫描指针指向下十位RETDIS1: MOV A,DSB1 ;扫描十位数码管ANL A,#0FHMOV DPTR,#LED7MOVC A,@A+DPTRMOV P0,ACLR CS1MOV DSW,#02HRETDIS2: MOV A,DSB2 ;扫描百位数码管ANL A,#0FHMOV DPTR,#LED7MOVC A,@A+DPTRMOV P0,ACLR CS2MOV DSW,#03HRETDIS3: MOV A,DSB3 ;扫描千位数码管ANL A,#0FHMOV DPTR,#LED7MOVC A,@A+DPTRMOV P0,ACLR CS3MOV DSW,#04HRETDIS4: MOV A,DSB4 ;扫描指示灯CPL AMOV P0,ACLR CS4MOV DSW,#00HRET;====LED段码表====LED7: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,86H,0A1H,86H,8EHEND。
单片机延时消抖
单片机延时消抖
单片机延时消抖是一种常见的解决按键抖动的方法。
按键抖动是由于按键接触不良,导致按键在短时间内多次开关状态的变化,通常会造成系统误操作。
为了解决这个问题,可以在按键输入信号的处理中加入一定的延时。
在单片机中,可以利用定时器的功能实现延时。
当按键按下时,可以启动一个定时器,并设置一个延时时间。
在延时结束后检测按键状态,如果按键状态稳定则进行相应的处理操作。
如果按键状态不稳定,则重新启动延时定时器进行等待。
通过延时消抖的方法,可以有效避免按键抖动带来的误操作。
但需要注意的是,延时时间不宜过长,以免影响系统的响应速度。
同时,也需要根据具体的应用场景选择合适的延时时间和定时器配置。
- 1 -。
按键消抖程序设计在单片机中的运用
按键消抖程序设计在单片机中的运用【摘要】按键开关在电子类的开发者中运用较多,但它却专有一个按键抖动的特性。
由于机械触点的弹性作用,按键开关断开或闭合时不会马上稳定地断开或接通,而是不断的抖动,即不断的闭合、断开。
这一连串的抖动给系统带来一些不稳定的因素,甚至是错误的结果,为了不产生这种现象而需采取相应消抖措施。
【关键词】按键抖动;消抖措施;单片机运用1.按键开关开发单片机系统的人都知道,按键开关共有四个引脚,分别是两个引脚短路作为一端,不分正负极,焊接时只需将短路一端焊接在电路的一个焊盘,将另外一个短路端口焊接在电路的另外一个焊盘即可,即为开关的两端。
在电路设计中或者是软件编写程序过程中如果遇到按键,则需要考虑按键的抖动情况。
因为按键开关是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,不会马上稳定地接通或者断开。
2.按键抖动及影响按键开关抖动时间的长短主要是由按键的机械特性决定的,一般时间为为5ms~10ms。
按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。
键抖动会引起一次按键被误读多次,即在按键的过程中被误认为是有多次的断开和闭合,为确保CPU对按键的一次闭合仅作一次处理,所以必须去除键抖动。
在按键闭合稳定时才读取键的状态,并且必须判别到键释放稳定后再作处理。
3.消抖措施为了消除按键抖动及其带来的不利影响,一般可以用以下两种措施。
3.1电路消抖可采用设计硬件电路方法消除按键的抖动。
最常用的就是用RS触发器。
设计原理是:利用两个“与非”门构成一个RS触发器。
当按键未按下时,输出为“1”;当键按下时,输出为“0”。
此时即使按键的机械性能,使按键因弹性抖动而产生瞬时断开,按键不返回原始状态,双稳态电路的状态不会改变,继而输出保持为“0”,这样就不会产生抖动的波形,消除抖动带来的影响。
3.2程序消抖若系统的按键较多,可采用编写程序的方法进行去抖,即软件消抖。
单片机按键去抖动程序设计思路
单片机按键去抖动程序设计思路徐丽红王佰营在单片机应用系统设计中,人机界面部分的友好程度,很大一部分取决于键盘处理程序。
在按键时按得快了没有反应,按慢了一连响应几次,总给人紧迫感或迟钝感,不能使人满意。
用以下思路设计的键处理程序取得了满意效果。
判断有没有键值:1.若有键值:判断是否为首次按下:A:若首次按下:判断是否与上次按下的键值相同a.若相同再判断:是否已经按下了300ms?1).若已经按下300ms则将此键做为连键处理。
2).若不是连键则判断:是否按下20ms?1>.若确认按下20ms,得到有效键值等待弹起2>. 若不是按下20ms直接结束处理(ret)。
b.若不相同则将标志清零结束处理(ret)。
B:若不是首次按下:将键值暂存起来,标志置位结束处理。
2.若无键值:判断是否有键值已被确认A.若有键已被确认:判断按键是否首次抬起a.若首次抬起:判断抬起延时时间(20ms)是否到达1>.若延时到则将标志处理结束处理。
2>.若延时未到直接结束处理(ret)。
b.若非首次抬起:直接结束处理(ret)。
B.若没有键被确认:直接结束处理(ret)。
具体程序实现流程图如下:(所有延时均为非阻塞式延时) Lcll scan_key----为调用键扫描程序;简单的按键处理程序见:简单、友好的按键处理程序设计简单、友好的按键处理程序设计王佰营徐丽红在嵌入程序设计中,键处理程序在一定程度上决定着人机对话界面的友好程度。
WINDOWS是公认的界面友好的典范,我们就借鉴WINDOWS的键处理的思想:1.当击键时WINDOWS立即作出响应;2.当按住键不放时,WINDOWS延迟一定时间来判断是否为连键;其间不作响应;3.当认为是连键时,会间隔一定时间重复作出响应;(可以打开记事本,敲个‘h’键试验:瞬时敲击,即可出现‘h’,再按着键不放,无‘h’出现,当延迟一定时间‘h’,就以较快速度出现;)在C8051F020和DSP编程中运用上述的思想所编的键处理程序非常简捷、高效和友好,以下为该程序的流程图:根据该流程的51系列单片机程序和DSP程序:1、C8051F020单片机程序如下:;================================================================= ;function:key_filter ;键盘去抖程序--徐丽红;input:a;output:?;usage:a,b?;================================================================= key_filter:;键盘去抖程序lcallscan_keyjz kf_no ;a=0?jb bfirst,kf_1th ;first down?mov b,amov a,k_dlyjnz kf_ret ;20ms到了吗?mov a,b ;20ms到cjne a, key_tmp,kf_no;a==k_tmp?mov k_dly,#10 ;a==k_tmpdec dly_kjnb bfast,kf_nofast;是连键吗?kf_is0: mov a,dly_k;是连键jnz kf_ret;300ms/160ms?mov dly_k,#12 ;fast OK!sjmp kf_ftokkf_nofast:mov a, dly_k;不是连键cjne a, #24,kf_is0;延时了1次吗?kf_ftok:?mov key,key_tmp ;first OK!setb bkey_dosetb bfastkf_ret: retkf_1th: movk_dly,#10 ;first downmov key_tmp,amov dly_k,#25clr bfirstclr bfastret2、LF2407型DSP程序如下:;----------------------------------------------------------; function: judge_key 键值判断; input: ---; output: ---; usege: ACC;----------------------------------------------------------judge_key: ;键值判断ldp #PEDATDIR>>7lacl PEDATDIRcmpland #00110110bldp #DP_B01sacl key_tmpbcnd k_down, NEQ ;CATCH KEYldp #DP_B01splk #00h, bknot1retk_down: lacl bknot1bcnd not_first, NEQ ;firstlacl key_tmpsacl key_oksplk #04, key_clksplk #50, key_dlysplk #11h, bknot1splk #00h, bksuresplk #00h, bcontinueretnot_first: lacl key_clk ;N times bcnd T_over, EQ ;12msretT_over: lacl key_ok ;12ms xor key_tmpbcnd Is_same, EQ ;same keysplk #00h, bknot1retIs_same: splk #4, key_clklacl bcontinuebcnd Is_fast, NEQ ;continueOK_key: splk #11h, bcontinuesplk #11h, bksureretIs_fast: lacl key_dly ;key_dly--sub #01hsacl key_dlybcnd tuch_set, EQ ;500/300msrettuch_set: s plk #25, key_dlyb OK_key该程序中:防抖时间是12ms;是否为连键延迟时间是500ms,连键重复处理时间是300ms;在实际中,根据具体情况调节时间,达到最佳效果。
按键消抖
end
else
cnt <= 0; end
always @(posedge clk or negedge nrst) begin
if(nrst == 0)
key_out <= 0;
else if(cnt == TIME_20MS - 1)
key_out <= key_in; endendmodule
方案3
// key down, bounce 19ms
repeat(951) @(negedge clk) key_in = ~key_in;
// last 60ms
repeat(3000) @(negedge clk);
cnt <= 0;
//
end always @(posedge clk or negedge nrst) begin
if(nrst == 0)
key_cnt
<= 0;
else if(key_cnt == 0 && key_in != key_out)
key_cnt <= 1;
else
if(cnt == TIME_20MS - 1)
// clock .key_out(key_out) );
initial begin
clk = 1;
forever #(T/2) clk
= ~clk; end
// reset initial begin
nrst = 1;
@(negedge clk) nrst = 0;
@(negedge clk) nrst
按键消抖
按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动 时间的长短和按键的机械特性有关,一般为5~10ms。通常我们手动按键然后释放,这个动作中稳定闭合的时间超过了 20ms。因此单片机在检测键盘是否按下时都要加上去抖动操作,有专用的去抖动电路,也有专门的去抖动芯片,但通常 我们采用软件延时的方法就可以解决抖动问题。
单片机按键去抖动程序设计思路
单片机按键去抖动程序设计思路
1.去抖动原理:按键在按下和松开的瞬间会产生震动,导致按键信号在短时间内出现多次转换,给程序带来困扰。
为了解决这个问题,需要对按键信号进行去抖动处理,即在按键按下和松开时,只记录一次按键状态变化。
2.软件去抖动方法:软件去抖动方法主要通过软件延时来判断按键信号是否稳定。
具体来说,可以通过以下步骤实现软件去抖动:-初始化按键引脚为输入模式,并使能内部上拉电阻;
-设定一个延时时间阈值t,用于判断按键是否稳定;
-读取按键引脚的电平,如果为低电平,说明按键按下;
-进入一个循环,每次循环读取一次按键引脚的电平,并与前一次读取的电平进行比较;
-如果连续读取到的电平与前一次相同,说明按键信号稳定;
-如果连续读取到的电平与前一次不同,则说明按键信号还在抖动,继续读取直到连续读取到的电平与前一次相同;
-当稳定的电平持续时间超过延时时间阈值t时,认为按键信号已稳定,可以进行相应的处理。
3. 硬件去抖动方法:硬件去抖动方法主要通过电路设计来实现。
常见的硬件去抖动电路包括RC滤波电路和Schmitt触发器电路。
其中,RC 滤波电路利用电容和电阻的特性,对按键信号进行平滑处理;Schmitt触发器电路则通过正反馈的方式,将不稳定的信号转换为稳定的信号。
这两种方法可以根据实际需求选择。
总结:
按键去抖动程序设计可以通过软件去抖动和硬件去抖动两种方式实现。
软件去抖动主要通过软件延时判断按键信号是否稳定,而硬件去抖动则通
过电路设计实现。
根据具体的应用场景和需求,可以选择适合的方法来设
计按键去抖动程序。
一种软件去除键抖动的方法
一种软件去除键抖动的方法一种软件去除键抖动的方法摘要:单片机控制系统中大多使用控制键来实现控制功能。
消除按键瞬间的抖动是设计者必须要考虑的问题。
本文介绍一种很实用的软件去抖动方法,它借助于单片机内的定时中断资源,只要运算一下逻辑表达就完成了去抖动。
这个方法效率高,不耗机时且易实现。
文中使用的逻辑表达式由简单卡诺图和真值表推出,使该方法的机理容易理解。
文中还提供用C51单片机编程语言编写的实用例程。
关键词:单片机键处理控制系统去抖动键盘概述在单片机控制系统中,通过按键实现控制功能是很常见的。
对按键处理的重要环节是去抖动,包括去除按下和抬起瞬间的抖动。
去抖动的方法有很多种,如使用R-S触发器的硬件方法、运用不同算法的各种软件方法等。
硬件方法会增加成本和体积,对于按键较多的矩阵式键盘,会用硬件方法;软件方法用的比较普遍,但有一种加固定延时的去抖动法效率最低,它以无谓地耗费机时来实现去抖动。
此处介绍的是一种软件方法。
简单说来是一种运算法,配合定时中断读取按键,通过运算逻辑表达式:Keradyn=Ktemp Kinput+Kreadyn-1 (Ktemp ⊙Kinput) (1)Ktemp=Kinput (2)可以获得消除抖动的按键消息。
这种方法效率高,不需耗时的循环等待,而且算法简单、使用方便。
一、基本原理由于按键的按下与抬起都会有10~20ms的抖动毛刺存在,因此,为了获取稳定的按键信息,须要避开这段抖动期。
设置3个变量Kready、Ktemp和Kinput,并设置定时中断周期为20ms。
在定时中断服务程序中读取按键,并把读取的数据存于变量Kinput中。
变量Kready中是所需要的稳定的按键信息;Ktemp是中间变量,它的值是上一次的Kinput。
根据当前按键的状态,考虑到Kready中是20ms抖动后的有效键信息,则Kready、Ktemp和Kinput之间,在不同时刻的状态关系如表1所列。
表1时刻KreadyKtempKinput100020013010400151[1] [2] [3] [4] [5] [6]。
按键消抖计数原理与测试说明
“按键消抖计数”程序测试与原理说明1程序运行效果说明按下KEY1,数码管上的示数加1。
按下KEY2,数码管上的示数减1。
2程序电路工作原理以及按键抖动原因按键电路示意图(三个按键分别是K1、K2、K3)当按键被按下的时候,电路导通接地,I/O口为低电平;当按键未被下时,电路断开,I/O口保持高电平的。
但一般的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,假如不加以处理,会导致按键被识别为按下多次。
为了不产生这种现象而作的措施就是按键消抖。
3消抖的方法按键消抖分为硬件消抖和软件消抖。
3.1硬件消抖在键数较少时可用硬件方法消除键抖动。
下图所示的RS触发器为常用的硬件去抖。
硬件消抖电路图图中两个“与非”门构成一个RS触发器。
当按键未按下时,输出为0;当键按下时,输出为1。
此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),只要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。
也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。
这一点通过分析RS触发器的工作过程很容易得到验证。
3.1软件消抖方法1:使用延时如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~10ms 的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。
当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。
方法2:检测多次可以设定一个检测周期,如果在一个检测周期内,按键被检测为被按下达到了一定次数,则确认为真正被按下。