当前位置:文档之家› 单片机按键去抖动程序设计思路

单片机按键去抖动程序设计思路

单片机按键去抖动程序设计思路
单片机按键去抖动程序设计思路

单片机按键去抖动程序设计思路

徐丽红王佰营

在单片机应用系统设计中,人机界面部分的友好程度,很大一部

分取决于键盘处理程序。在按键时按得快了没有反应,按慢了一连响应几次,总给人紧迫感或迟钝感,不能使人满意。

用以下思路设计的键处理程序取得了满意效果。

判断有没有键值:

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: ;键盘去抖程序

lcall scan_key

jz kf_no

;a=0?

jb bfirst, kf_1th ;fir st down?

mov b, a

mov a, k_dly

jnz kf_ret

;20ms到了吗?

mov a, b

;20ms到

cjne a, key_tmp,kf_no ;a==k_tm p?

a==k_tmp

dec dly_k

jnb bfast, kf_nofast ;是连键吗?

kf_is0: mov a, dly_k ;是连键

jnz kf_ret

;300ms/160ms?

mov dly_k, #12 ; fast OK!

sjmp kf_ftok

kf_nofast:

mov a, dly_k

;不是连键

cjne a, #24, kf_is0 ;延时了1次吗?

kf_ftok:

first OK!

setb bkey_do

setb bfast

kf_ret: ret

kf_1th: mov k_dly, #10 ;first down

mov key_tmp, a

mov dly_k, #25

clr bfirst

clr bfast

ret

2、LF2407型DSP程序如下:

;----------------------------------------------------------

; function: judge_key 键值判断

; input: ---

; output: ---

; usege: ACC

;----------------------------------------------------------

judge_key: ;键值判断

ldp #PEDATDIR>>7

lacl PEDATDIR

cmpl

and #00110110b

ldp #DP_B01

sacl key_tmp

bcnd k_down, NEQ ;CATCH KEY

ldp #DP_B01

splk #00h, bknot1

ret

k_down: lacl bknot1

bcnd not_first, NEQ ;first

lacl key_tmp

sacl key_ok

splk #04, key_clk

splk #50, key_dly

splk #11h, bknot1

splk #00h, bksure

splk #00h, bcontinue

ret

not_first: lacl key_clk ;N times bcnd T_over, EQ ;12ms

ret

T_over: lacl key_ok ;12ms xor key_tmp

bcnd Is_same, EQ ;same key

splk #00h, bknot1

ret

Is_same: splk #4, key_clk

lacl bcontinue

bcnd Is_fast, NEQ ;continue

OK_key: splk #11h, bcontinue splk #11h, bksure

ret

Is_fast: lacl key_dly ;key_dly--sub #01h

sacl key_dly

bcnd tuch_set, EQ ;500/300ms

ret

tuch_set: splk #25, key_dly

b OK_key

该程序中:防抖时间是12ms;是否为连键延迟时间是500ms,连键重复处理时间是300ms;在实际中,根据具体情况调节时间,达到最佳效果。

注:以上两个程序中的延时均为非阻塞式延时,没有原地绕圈子式的延时,不会对主程序造成大影响。

51单片机中断程序大全

//实例42 :用定时器T0 查询方式 P2 口8 位控制LED 闪烁 //#include单片机寄存器定义的头文件 51包含 /******************************************************* *******函数功能:主函数 ******************************************************** ******/void main(void){ // EA=1;开总中断// 中断允许T0 // 定时器// ET0=1; 1的模式TMOD=0x01;// 使用定时器T0 位赋初值定时器T0 的高8 TH0=(65536-46083)/256; // 位赋初值的高8 TL0=(65536-46083)%6; // 定时器T0 T0启动定时器TR0=1;// TF0=0;P2=0xff; 无限循环等待查询while(1)// {while(TF0==0); TF0=0;P2=~P2; 位赋初值的高8 定时器TH0=(65536-46083)/256; // T0 位赋初值T0 TL0=(65536-46083)%6; //

定时器的高8 }} 1KHzT1:用定时器43 实例// 音频查询方式控制单片机发出 #include 单片机寄存器定义的头文件51 // 包含sbit sound=P3^7;将// 引脚sound P3.7 位定义为 /********************************************************** **** 函数功能:主函数 ******************************************************** ******/void main(void){// EA=1;开总中断// 中断允许ET0=1;// // 定时器T0 1的模式使用定时器// T1 TMOD=0x10; 位赋初值// TH1=(65536-921)/256; T1 定时器的高8 TL1=(65536-921)%6; // 定时器T1 的高8 位赋初值 TR1=1;// 启动定时器T1TF1=0; while(1)// 无限循环等待查询{while(TF1==0); TF1=0;

键盘消抖电路的研究与分析

判断是否有键按下;简单硬件消抖则 是采用电容来平掉信号的毛刺。但是对稳定性要求比较高的应用则需要采用相对复杂的集成电路来实现。 1 简单键盘消抖方法 1.1 软件延时消抖 按键抖动时间的长短由按键的机械特性决定,一般为5ms~10ms,按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒,如图1所示。 利用软件延时消除键盘抖动所产生的毛刺信号时需设置一个定时器中断,每中断一次则读取键盘接口的信号数据,如果与上次读取的数据不一致,说明当前读取的是前沿抖动数据,将当前的数据保留,等待下次定时器中断。如果当前读取的数据和前次读取数据相同则说明读取的是稳定状态下的数据,则确认为真正有键按下。当检测到按键释放后,需要延时5ms~10ms的时间,待后沿抖动消失后才能转入该键的处理程序。 软件延时并不需要增加新的硬件,但采用这种方式来设计,一般通过软件指令或者定时器的方式来设定延时的时间,采用通用处理器,由于运行速度不一致,需要将软件做相应的修改,比较麻烦。 1.2 简单硬件消抖 采用简单的硬件延时消抖是在键盘数据线接入单片机的引脚的地方并入一小电容,利用电容的充放电原理来实现消除因键盘的抖动所产生的毛刺。如图2所示,键盘按键信号key通过由R2,C1构成的RC振荡电路,过滤到毛刺,到达MCU的引脚上。 基金项目:武汉科技大学校基金资助项目(2006XY26) 键盘消抖电路的研究与分析 邢远秀1 陈姚节2 1、武汉科技大学理学院 4300812、武汉科技大学计算机学院 430081 键盘是计算机和工业控制等领域不可缺少的输入设备,通过它可以实现人机对话,完成各种功能操作。但是,通常的按键所用开关为机械弹性开关,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,因而在闭合及断开的瞬间均伴随有一连串的抖动,键抖动会引起一次按键被误读多次,为了确保对按键的一次闭合仅作一次处理,必须去除按键抖动。常见的消抖方法采用软件或硬件来实现:软件消抖主要是采用延时多次读取键盘接口数据,通过比较前后两次读取键盘端口的数据来 RC振荡电路实现键盘消抖的成本相对较低,工作不是很稳定,可能出现差错(即产生抖动信号),这只适合对消除抖动要求不高的场合。 2 集成电路消抖 集成电路实现键盘消抖主要是采用双组可再触发单稳态多谐振荡器-74HC123,它可把按键所产生的小脉冲信号转换成大方波信号并送到处理器引脚进行计数。 2.1 74HC123工作原理 74HC123包括两个独立的单稳态触发 表1 74HC123功能表 图3 74HC123管脚与内部结构 图2 RC消抖电路原理图 图1 按键波形图

按键消抖与时间按键

按键消抖与时间按键 这篇文章写给正在学51单片机的或者刚入门51单片机准备进阶的的朋友,我们来着重讨论一下按键消抖和时间按键这两项。 我们常用的按键大多都是机械的,机械开关就会出现机械振动,这个由物理学或者实验可以推出来,抖动会在单片机上面出现重复扫描次数,次数多少与单片机的时钟晶振有关,时钟晶振越高单片机执行速度越快,重复次数就越多 整个按键数百ms 按下瞬间,抖动时间大概10ms 弹起瞬间,抖动大概10ms 按键一次出现的电平变化 (上面的时间都是老师说的和书上现成的,没有实际测试,而且不同的按键应该也会有差异,作为学习研究确实不应该,找个时间锅锅会测出这个时间供大家参考,嘿嘿) 由图我们可以看出,按下去瞬间会出现抖动,弹起来也会出现抖动,明显是个阻尼振动,按键扫描程序是按顺序执行的; 首先提出三个问题大家思考一下 1.为什么要消除抖动 2.如何消抖 3.是不是按键都要消抖,不是的话,哪些需要消抖,哪些不需要消抖 4.消抖的时间是不是必须10ms 5.按键消抖的方式是不是一定像书上的那样,如何消抖更节省CPU,且更简单 按键如果不消除抖动,那么单片机检测到的低电平的次数就不止一次,那我们按键一次,单片机会检测到多次,比如我们把按某个按键设置按一次成某个变量加1,结果按一次就加了很多次,这样我们就不能精确的通过按键来调整我们想要的参数,所以我们消除抖动的目的就是要实现按一次按键让单片机读出一次按键操作 消抖分硬件和软件消抖, 硬件消抖有《模拟电子技术》上提到用三态门实现,当然还有周立功那个7920(管理数码管和按键的芯片),当然还有很多硬件电路以及一些按键有自带消抖电路,但是如果要做产

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

51单片机中断程序大全

//实例42:用定时器T0查询方式P2口8位控制LED闪烁#include // 包含51单片机寄存器定义的头文件 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 } } //实例43:用定时器T1查询方式控制单片机发出1KHz音频#include // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值

按键消抖

一、按键消抖 1.1 计数器型消抖电路(一) 计数器型消抖电路(一)是设置一个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in='1',计数器加1,key_in='0' 时,计数器清零。当计数器值为2时,key_out 输出才为1,其他值为0时。计数器值为N时处于保持状态。因此按键key_in持续时间大于N个clk时钟周期时,计数器输出一个单脉冲,否则没有脉冲输出。如果按键开关抖动产生的毛刺宽度小于N个时钟周期,因而毛刺作用不可能使计数器有输出,防抖动目的得以实现。clk的时钟周期与N的值可以根据按键抖动时间由设计者自行设定。 主要程序结构如下: 图1是N为3的波形仿真图,当按键持续时间大于3个时钟周期,计数器输出一个单脉冲,其宽度为1个时钟周期,小于3个时钟周期的窄脉冲用作模拟抖动干扰,从图1可以看出,抖动不能干扰正常的单脉冲输出。 1 按键抖动产生原因分析 绝大多数按键都是机械式开关结构,由于机械式开关的核心部件为弹性金属簧片,因而在开关切换的瞬间会在接触点出现来回弹跳的现象。虽然只是进行了一次按键,结果在按键信号稳定的前后出现了多个脉冲,如图1所示。如果将这样的信号直接送给微处理器扫描采集的话,将可能把按键稳定前后出现的脉冲信号当作按键信号,这就出现人为的一次按键但微处理器以为多次按键现象。为了确保按键识别的准确

性,在按键信号抖动的情况下不能进入状态输入,为此就必须对按键进行消抖处理,消除抖动时不稳定、随机的电压信号。机械式按键的抖动次数、抖动时间、抖动波形都是随机的。不同类型的按键其最长抖动时间也有差别,抖动时间的长短和按键的机械特性有关,一般为5~10 ms,但是,有些按键的抖动时间可达到20 ms,甚至更长。所以,在具体设计中要具体分析,根据实际情况来调整设计。 2 按键消抖电路的设计 按键消抖一般采用硬件和软件消抖两种方法。硬件消抖是利用电路滤波的原理实现,软件消抖是通过按键延时来实现。在微机系统中一般都采用软件延时的消抖方法。在用可编程逻辑器件FPGA/CPLD设计数字系统中,也可以用VHDL语言设计相应的时序和逻辑电路,对按键信号进行处理,同样可以达到消抖目的。本文利用Altera公司的可编程逻辑器件CPLD和QuartusⅡ,设计性能可靠的按键消抖电路。 2.1 按键消抖电路设计原理 按键消抖的关键是提取稳定的低电平(或高电平)状态,滤除按键稳定前后的抖动脉冲。在用基于VHDL 语言的时序逻辑电路设计按键消抖电路时,可以用一个时钟脉冲信号对按键状态进行取样,当第一次采样到低电平时,启动延时电路,延时结束后,再对按键信号进行连续三次取样,如果三次取样都为低电平,则可以认为按键已经处在稳定状态,这时输出一个低电平的按键确认信号,如果连续三次的取样中,至少有一次是高电平,则认为按键仍处在抖动状态,此时不进行按键确认,按键输出信号为高电平。 2.2 按键消抖电路设计 该控制电路采用VHDL语言的有限状态机的设计方法来描述和实现,其状态转换图如图2所示。

按键消抖实验

基于verilog按键消抖设计 Aaron malone 关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了。然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的。这两篇博文都是ednchina的博客精华,并且在其blog 首页置顶多日,我想对大家会很有帮助的。 键盘的分类 键盘分编码键盘和非编码键盘。键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的称为非编码键盘。 在单片机组成的各种系统中,用的最多的是非编码键盘。也有用到编码键盘的。非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。 按键在闭合和断开时,触点会存在抖动现象:

从上面的图形我们知道,在按键按下或者是释放的时候都会出现一个不稳定的抖动时间的,那么如果不处理好这个抖动时间,我们就无法处理好按键编码,所以如何才能有效的消除按键抖动呢?让下面的两篇博文日志给你答案吧。 经典的verilog键盘扫描程序 从最基础的分频程序开始,但看到这个键盘扫描程序后,直呼经典,有相见恨晚的感觉,还想说一句:威百仕( VibesIC ),我很看好你!WHY?待我慢慢道来,这个程序的综合后是0error,0warning。想想自己编码的时候那个warning是满天飞,现在才明白HDL设计有那么讲究了,代码所设计的不仅仅是简单的逻辑以及时序的关系,更重要的是你要在代码中不仅要表现出每一个寄存器,甚至每一个走线。想想我写过的代码,只注意到了前者,从没有注意过后者,还洋洋自得以为自己也算是个高手了,现在想来,实在惭愧啊!学习学习在学习,这也重新激发了我对HDL设计的激情,威百仕给了我一个方向,那我可要开始努力喽! 废话说了一大堆,看程序吧:(本代码经过ise7.1i综合并下载到SP306板上验证通过)

按键开关消抖程序

按键开关消抖程序 实践中,单片机端口在连接开关器件时都要考虑消抖的问题,或在硬件上 增加延迟,或是增加软件延迟查询的功能模块。这里,我们考虑这样一个检测 电路:单片机连接一个开关和两个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 LED2 wait: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 wait c1_wait://Switch PIN high after debounce period so error in debouncingcpl led2ajmp wait debounce_delay://Subroutine for generating 20ms delaymov r7,#245l1_debounce_delay:mov r6,#40djnz r6,$djnz r7,l1_debounce_delayret END tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

第六课按键的硬件消抖

51单片机进阶篇 ---按键的硬件消抖 本文作者:Cepark 更新时间:2010/07/20 作者博客:https://www.doczj.com/doc/9c15326885.html,

按键的硬件消抖 在上一节课中,我们介绍了使用软件延时的方法来进行消抖从而进行按键的检测,软件延时的优点是硬件电路简单,但是程序相对来讲会复杂,而且一般的延时函数是使用计数延时,这会增加CPU的负担。硬件消抖电路可以简化程序的编写,但是需要额外的器件支持。两种方法各有利弊,在不同的情况下根据不同的情况来选择使用哪一种消抖方法,这一节课我们主要介绍一下常见的硬件消抖电路。 1、RS触发器构成的消抖电路的主要原理 用R-S触发器形成消抖电路时单片机外围电路设计中的常用手段,它可以减少单片机软件对按键动作的延时和计算。要使用R-S触发器形成的消抖电路,首先用了解R-S触发器的基本工作原理图和工作特点。 R-S触发器的基本构成如图所示,它是由两个与非门交叉耦合而成,S和R是信号的输 Q既表示触发器的状态,又是触发器的输出端。 入端,低电平有效,Q和 在启动过程中,S端一旦下降到开门电平,Q端电平就会上升,反馈到门B的输入端, Q端的电平下降,反馈到门A的输入端,进一步促使门A截止,促使B由截止转向导通, Q的电平进一步下降,这样的过程,是Q端电平进一步上升,Q端电平上升的结果又会使 的门A很快截止、门B很快导通,触发器在极短的时间内完成由截止到导通的转换。通过R 段的复位时也有类似的正反馈过程发生,从而完成按键开关的消抖功能。 典型的硬件消抖方法是在单片机和检测管脚之间加入由74LS02或者其他的门电路组成的R-S触发器消抖电路。如下所示。

使用硬件方式对按键进行消抖处理

按键电路:常用的非编码键盘,每个键都是一个常开开关电路。 按键消抖: 通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。 按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖

动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。按键的抖动,可用硬件或软件两种方法。 <1> 硬件消抖:在键数较少时可用硬件方法消除键抖动。下图所示的RS触发器为常用的硬件去抖。 图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当键按下时,输出为0。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B 点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。 <2> 软件消抖:如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。按键消抖

单片机与4x4键盘去抖松手检测程序

单片机与4x4键盘去抖松手检测程序 刚写的一个4*4 键盘,去抖 松手检测程序。项目中要用4*4 键盘,扫描的程序有。但是去抖,和松手检测的程序没有,那么为了提高效率,可靠性,以及更加合理化。到网上找了一些关于”状态机“的资料,按照它的思路写了一个,写了半天,写好一个,经过特发帖纪录一下。 //对按键扫描的值进行处理去抖松手检测 uint8_t key_scan(void) { static uint8_t key_state = 0; static uint8_t key_num_flag1=0; uint8_t temp_key_num=0; uint8_t return_key_num=0; temp_key_num=KeyMap();//读取4*4 键盘返回的按键值不要去抖 switch(key_state)//检测状态

case key_state_0: if(temp_key_num!=0) //如果按键返回不是0 说明有按键按下 { key_num_flag1=temp_key_num; //记录下第一次按键按下的值 key_state=key_state_1; //进入下一个状态去抖 } break; case key_state_1: if(temp_key_num!=0) //如果按键返回不是0 说明按键是按下的 { if(key_num_flag1==temp_key_num)//判断是否和上次记录按键值一样。 {

return_key_num=temp_key_num; // 按键仍按下,赋值给返回按键值 key_state = key_state_2; // 状态转换到键释放态 } else { key_state=key_state_0; //回到初始状态 } } else ///没有按键按下 {

按键消抖电路瞬态分析和设计

按键消抖电路瞬态分析和设计 按键是仪器仪表中普遍采用的人机输入接口电路。在按键电路中必须考虑对按键的抖动进行软件消抖和硬件消抖。软件消抖具有使用硬件数量少的优点,但也具有以下两个缺点:(1)在仪器键盘电路中,多个按键安装在仪器面板上,键盘的输出通过排线连接到主控板上,此时键盘导线寄生电感和寄生电容的存在,寄生电感寄生电容和排线电阻将组成二阶振荡系统,二阶振荡将形成负电平脉冲,而负电平脉冲很容易超出数字芯片的输入最大允许电平范围,导致数字芯片容易损坏。(2)按键闭合和断开时,电压信号下降沿非常陡峭,剧烈变化的电压信号将通过互容传递到相邻导线上。硬件消抖电路的设计主要是要考虑以下三个因素:(1)消除信号的抖动,确保按键电路输出信号的平整;(2)消除信号的下冲,因为下冲电平超出了后续数字芯片的最大输入电平范围;(3)降低信号变化的速度,避免在邻线上引起容性串扰;(4)不影响按键电路的正常功能。常见的硬件消抖电路包括电容滤波消抖和触发器消抖。电容滤波消抖采用电阻和电容组成低通滤波器,具有电路结构简单可靠的优点,因此本文将重点阐述该消抖电路。1 按键消抖电路结构与电路模型图1为某仪器按键电路原理图,按键安装在仪器面板上,通过导线连接到主控板上,按键的一端接上拉电阻并连接后续电路,按键的另一端接地,当按键没有按下时,按键输出高电平,当按键按下时,按键输出低电平。图2为加上滤波电容后的按键电路。 图1 某仪器按键电路 图2 按键消抖电路 图3为按键消抖电路的电路模型。图中R0为连接按键导线的电阻,L 为导线电感,C0为导线对地电容,C f为滤波电容,C p为按键后续电路的输入电容,R i为按键后续电路的输入阻抗,R 为上拉电阻,V CC为电源电压,U为按键消抖电路的输出电压。

51单片机中断程序大全

//实例42 :用定时器TO查询方式P2 口8位控制LED闪烁#include // 包含 51 单片机寄存器定义的头文件/************************************************************** 函数功能:主函数 void main(void) { // EA=1; // 开总中断 // ETO=1; // 定时器 TO 中断允许 TMOD=OxO1; // 使用定时器 TO 的模式 1 THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值 TLO=(65536-46O83)%256; // 定时器 TO 的高 8 位赋初值 TRO=1; // 启动定时器 TO TFO=O; P2=Oxff; while(1)// 无限循环等待查询 { while(TFO==O) TFO=O; P2=~P2; THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值

TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值 } // 实例43 :用定时器T1 查询方式控制单片机发出1KHz 音频#include // 包含 51 单片机寄存器定义的头文件 sbit sou nd=P3^7; // 将 sound 位定义为 P3.7 引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; // 开总中断 // ET0=1; // 定时器 T0 中断允许 TMOD=0x10; // 使用定时器 T1 的模式 1 TH1=(65536-921)/256; // 定时器 T1 的高 8 位赋初值 TL1=(65536-921)%256; // 定时器 T1 的高 8 位赋初值 TR1=1; // 启动定时器 T1 TF1=0; while(1)// 无限循环等待查询 {

关于单片机按键的抖动与消抖

关于单片机按键的抖动与消抖 在单片机的程序中,如果涉及到按键,一般都会看到几行注释着消抖 的代码。比如下面这一段:if((KeyV|0xc3)==0xff){//无键按下return 0; } mDelay(10);//延时,去键抖KeyV=P3; if((KeyV|0xc3)==0xff){//无键按下return 0; } 关于其作用与目的,有如下解释:按键在按下时会产生电平的变化,通常是由高电平变为低电平,而且这一过程也不是瞬间完成的,按键按下之后, 电平会有一段不稳定变化的时间。一般情况下,我们的程序读取这个电平变化 并做相关的动作。但由于机械按键的局限性,当系统受到外力而产生抖动或其 它动作时,也可能使系统内部产生电平变化(通常这种变化持续的时间非常短),这种现象称之为按键的抖动。这种抖动显然不是我们期望出现的,一旦程序中没有针对它进行特殊处理,这种隐患很可能导致系统执行我们不希望出现 的动作。进而可能酿成一场悲剧。避免按键抖动的操作就称之为消抖。目前,单片机的消抖主要分为软件消抖和硬件消抖。其中,软件消抖增加软件资源,但不增加硬件成本;硬件消抖反之。现在普遍采用的是软件消抖的方式。软件消抖具体的操作思路是:当监听到按键被按下时,不立刻执行相关的操作,而进行一定时间的延时(通常是50ms),之后再次检测按键是否被按下,如果 此时按键仍然被按下,则判定按键确实被按下了(因为不论是异常情况导致的 抖动还是正常情况下按键被按下产生的电平变化都会在这一段时间内过去,紧 接着的电平将会是稳定的),然后进行按键被按下之后所需要的操作,否则判 定按键未被按下,继续监听按键状态。实际上,以上所说的软件消抖的方法在 真正的软件中应用的不多,只是在练习的时候使用。真正的应用上,会在可能 产生抖动的那一段时间内等间隔多次监听按键状态(电流状态),等到数次 (可以是连续5 次)电流平稳了才确定按键被按下。按键被放开时采取同样操

按键去抖动程序

按键去抖动 一、实验目的 1、学习基于VHDL 描述状态机的方法; 2、学习 VHDL 语言的规范化编程,学习按键去抖动的原理方法。 二、实验平台 微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)、CPLD 学习板一块、5V 电源线一个、下载线一条。 三、设计要求 机械式轻触按键是常用的一种外围器件,由于机械原因导致的抖动会使得按键输入出现毛 刺。设计一个按键去抖动电路,并用按键作为时钟,结合计数器观察去抖动前后的效果有什么不同。 四设计方案 思路提示:按键去抖动通常采用延时判断的方法,去除按键过程中出现的毛刺。其实现过程是:当查询到按键按下时,延时一段时间再去判断按键是否仍然被按下,若是则此次按键有 效,否则看作是干扰。这可以利用状态机来实现, library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity qudou is port( clk, en: in std_logic; sp: out integer range 0 to 7); end qudou ; architecture behave of qudou is type state is (S0,s1,s2);

signal z: std_logic; signal q: integer range 0 to 2; signal a: integer range 0 to 7; signal s: state; begin p1:process(clk) begin if(clk'event and clk = '1') then if en='1' then if q=2 then q<=q; else q<=q+1; end if; else q<=0; end if; if q=2 then z<='1'; else z<='0'; end if; case s is when s0=> if (z = '0') then s<=s0;a<=a; else s<=s1;a<=a+1; end if; when s1=> if (z='0') then s<=s0;a<=a; else s<=s2;a<=a; end if; when s2=> if (z='0') then s<=s0;a<=a; else s<=s2;a<=a; end if; end case; sp<=a; end if; end process p1; end behave;

一种软件去除键抖动的方法

一种软件去除键抖动的方法 一种软件去除键抖动的方法 摘要:单片机控制系统中大多使用控制键来实现控制功能。消除按键瞬间的抖动是设计者必须要考虑的问题。本文介绍一种很实用的软件去抖动方法,它借助于单片机内的定时中断资源,只要运算一下逻辑表达就完成了去抖动。这个方法效率高,不耗机时且易实现。文中使用的逻辑表达式由简单卡诺图和真值表推出,使该方法的机理容易理解。文中还提供用C51单片机编程语言编写的实用例程。关键词:单片机键处理控制系统去抖动键盘概述在单片机控制系统中,通过按键实现控制功能是很常见的。对按键处理的重要环节是去抖动,包括去除按下和抬起瞬间的抖动。去抖动的方法有很多种,如使用R-S触发器的硬件方法、运用不同算法的各种软件方法等。硬件方法会增加成本和体积,对于按键较多的矩阵式键盘,会用硬件方法;软件方法用的比较普遍,但有一种加固定延时的去抖动法效率最低,它以无谓地耗费机时来实现去抖动。此处介绍的是一种软件方法。简单说来是一种运算法,配合定时中断读取按键,通过运算逻辑表达式:Keradyn=KtempKinput+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 时刻KreadyKtempKinput1000200130104001511161117110810191101000011000 时刻1为没有键按下的初始状态;时刻2的Kinput为1,但时刻3的Kinput又变为0,说明时刻2的Kinput为1并不是有键按下,可能只是干扰,所以Kreqdy为0;时刻4同时刻2的情况类似,但是时刻4和时刻5时Kinput都为1,说明有按键按下,在时刻5时Kready为1;虽然时刻7时Kinput为0,但时刻5、6、

实验05按键消抖

实验五按键消抖 一. 实验目的 1. 掌握QuartusII的硬件描述语言设计方法 2. 了解同步计数器的原理及应用 3. 设计一个带使能输入、进位输出及同步清零的增1四位N (N<16)进制同步计数器 二. 准备知识 在按键使用的过程中,常常遇到按键抖动的问题,开关在闭合(断开)的瞬间,不能一接触就一直保持导通(断开),因为开关的机械特性,重要经历接触-断开-再接触-再断开,最终稳定在接触位置,这就是开关的抖动,即虽然只是按下按键一次然后放掉,结果在按键信号稳定前后,竟出现了一些不该存在的噪声,这样就会引起电路的误动作。在很多应用按键的场合,要求具有消抖措施。按键抖动与开关的机械特性有关,其抖动期一般为5-10ms。 键按下 键稳定 前沿抖动后沿抖动 图5.1 按键电平抖动示意图 按键的消除抖动分为硬件消除抖动和软件消除抖动。硬件消除抖动一般采用滤波的方法,通常在按键两端并联一个1~10u左右的电容,有时这样也不能完全消除按键的抖动。软件消除抖动的方法有多种,常用的是延时扫描和定时器扫描。延时扫描其原理为:检测到按键操作后延时一端时间(如10ms)后,再检测是否为仍然为同样的按键操作状态,如果相同,就认为是进行了按键操作,然后对该操作进行相应的处理。定时器扫描的原理是:每隔一端时间(几毫秒)扫描一次键盘,如果连续两次(或3次)的所获得的按键状态相同,就输出按键状态,然后再对这种按键状态进行处理,这里的扫描时间间隔和连续判断按键状态的次数是有关系的,一般总时间要大于按键的抖动期。如果总时间太长,则感觉按键迟钝,太短可能不能完全消除抖动,要根据实际的情况合适的选择。 在实际电路设计中,经常采用的是软硬件相结合对按键进行消除抖动的处理方法。 本实验采用的方法:实验箱按键的硬件电路是共阳极电路,按下按键时输出到FPGA管脚的电平为低电平,松开按键时为高电平。我们采用5ms的定时器扫描FPGA管脚电平,如果连续3次为低电平时,存储连续按键状态的次数CNT的值加1,直到该计数值等于10(或再大一些),就不再累加(防止长按该值溢出而重新计数),此时认为按键已稳定,输出按键操作标志;在该过程中,一旦FPGA管脚电平为低电平就对CNT复位清零并同时对按键操作标志位复位,即一个异步复位。 本实验采用的方法:实验箱按键的硬件电路是共阳极电路,按下按键时输出到FPGA管脚的电平为低电平,松开按键时为高电平。我们采用5ms的定时器扫描采样FPGA管脚电平,如果连续3次为低电平时,可以认为此时按键已稳定,输出一个低电平按键信号;继续采样的过程中如果不能满足连续3次采样为低,则认为键稳定状态结束,这时输出变为高电平(连线3次采用信号相“或”),

第13讲51单片机按键电路

标题:键盘接口电路 教学目标与要求: 1.键盘去抖动和连接、控制方式 2.独立式按键及其接口电路 3.矩阵式键盘及其接口电路 授课时数:2 教学重点:.矩阵式键盘及其接口电路 教学内容及过程: 一、键盘接口概述 1、按键开关去抖动问题 机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图9-11所示,抖动时间的长短与开关的机械特性有关,一般为5 10 ms 在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施。这一点可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态触发器构成去抖动电路。图9-12是一种由R-S触发器构成的去抖动电路,当触发器一旦翻转,触点抖动不会对其产生任何影响。 软件上采取的措施是:在检测到有按键按下时,执行一个10 ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态。同理,在检测到该键释放后,也应采用相同的步 骤进行确认,从而可消除抖动的影响。

2.编制键盘程序 一个完善的键盘控制程序应具备以下功能: (1) 检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。 (2) 有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。 (3) 准确输出按键值(或键号),以满足跳转指令要求。 二、独立式按键 单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。 1. 独立式按键结构 独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图7.4所示。 独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。 2.矩阵式键盘 I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路。特点: ①占用I/O端线较少; ②软件结构教复杂。 适用于按键较多的场合。 3.键盘扫描控制方式 ⑴程序控制扫描方式 键处理程序固定在主程序的某个程序段。 特点:对CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。 ⑵定时控制扫描方式 利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描。 特点:与程序控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时/计数器定时控制。定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。 ⑶中断控制方式 中断控制方式是利用外部中断源,响应键输入信号。 特点:克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个宝贵的中断资源。 三、独立式按键及其接口电路 1、按键直接与I/O口连接

按键消抖

【012】按键消抖 点击数:919 发布日期:2006-6-23 19:29:00 【收藏】【评论】【打印】【编程爱好者论坛】【关闭】 参考: 《单片机原理及接口技术》(李朝青) 按键电路:常用的非编码键盘,每个键都是一个常开开关电路。 按键消抖: 通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。 按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次

处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。按键的抖动,可用硬件或软件两种方法。 <1> 硬件消抖:在键数较少时可用硬件方法消除键抖动。下图所示的RS触发器为常用的硬件去抖。 图中两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当键按下时,输出为0。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。 <2> 软件消抖:如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

51单片机中断程序大全

( //实例42:用定时器T0查询方式P2口8位控制LED闪烁 #include<> // 包含51单片机寄存器定义的头文件 void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 : TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; ] TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频 #include<> // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为引脚 void main(void) ( {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 — { while(TF1==0); TF1=0;

相关主题
文本预览
相关文档 最新文档