键盘软件去抖示例

合集下载

按键消抖实验

按键消抖实验

基于verilog按键消抖设计Aaron malone关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了。

然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的。

这两篇博文都是ednchina的博客精华,并且在其blog 首页置顶多日,我想对大家会很有帮助的。

键盘的分类键盘分编码键盘和非编码键盘。

键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。

而靠软件编程来识别的称为非编码键盘。

在单片机组成的各种系统中,用的最多的是非编码键盘。

也有用到编码键盘的。

非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。

按键在闭合和断开时,触点会存在抖动现象:从上面的图形我们知道,在按键按下或者是释放的时候都会出现一个不稳定的抖动时间的,那么如果不处理好这个抖动时间,我们就无法处理好按键编码,所以如何才能有效的消除按键抖动呢?让下面的两篇博文日志给你答案吧。

经典的verilog键盘扫描程序从最基础的分频程序开始,但看到这个键盘扫描程序后,直呼经典,有相见恨晚的感觉,还想说一句:威百仕( VibesIC ),我很看好你!WHY?待我慢慢道来,这个程序的综合后是0error,0warning。

想想自己编码的时候那个warning是满天飞,现在才明白HDL设计有那么讲究了,代码所设计的不仅仅是简单的逻辑以及时序的关系,更重要的是你要在代码中不仅要表现出每一个寄存器,甚至每一个走线。

想想我写过的代码,只注意到了前者,从没有注意过后者,还洋洋自得以为自己也算是个高手了,现在想来,实在惭愧啊!学习学习在学习,这也重新激发了我对HDL设计的激情,威百仕给了我一个方向,那我可要开始努力喽!废话说了一大堆,看程序吧:(本代码经过ise7.1i综合并下载到SP306板上验证通过)//当三个独立按键的某一个被按下后,相应的LED被点亮;再次按下后,LED 熄灭,按键控制LED亮灭经过一次20ms的采样后判定为键盘按下。

vhdl按键消抖程序

vhdl按键消抖程序

1.vhdl按键消抖程序一:延时性消抖在本例子中,input是按键的输入,output是消抖之后的按键输出是clk经历8个上升沿之后就让output输出一个CLK周期的高电平library ieee;use ieee.std_logic_1164.all;entity PWlock isport(clk:in std_logic;input:in std_logic;output:out std_logic);end PWlock;architecture one of PWlock issignal a:std_logic;signal count:integer range 0 to 9;beginprocess(clk)beginif input=‘0’ thencount<=0;elsif (clk‘event and clk=’1‘)thenif count=9 thencount<=count;elsecount<=count+1;end if;end if; -if count=8 thena<=’0‘;elsea<=’1‘;end if;end process;output<=a;end one;2.vhdl按键消抖程序二一般按键延时在20ms左右,根据时钟频率决定你的计数范围。

程序非常简单,但经常用到,对于FPGA初学者要好好学习这部分。

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity reseter isport(clk,reset_in:in std_logic; --按键按下时为0reset_out:out std_logic:=‘0’);end reseter;architecture behav of reseter isbeginPROCESS(clk,reset_in)VARIABLE COUNT1 :INTEGER RANGE 0 TO 100000;BEGINIF reset_in=‘0’ THENIF RISING_EDGE(clk)THENIF COUNT1<10000 THEN COUNT1:=COUNT1+1;ELSE COUNT1:=COUNT1; END IF;IF COUNT1<=9999 THEN reset_out<=‘1’;ELSE reset_out<=‘0’; END IF;END IF;ELSE COUNT1:=0;reset_out<=‘1’;END IF;END PROCESS ;end behav;3.vhdl按键消抖程序三:计数器型消抖电路(一)计数器型消抖电路是设置一个模值为(N+1)的控制计数器,clk在上升沿时,如果按键开关key_in=‘1’,计数器加1,key_in=‘0’时,计数器清零。

按键去抖动程序

按键去抖动程序

按键去抖动一、实验目的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 isport(clk, en: in std_logic;sp: out integer range 0 to 7);end qudou ;architecture behave of qudou istype 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;beginp1:process(clk)beginif(clk'event and clk = '1') thenif en='1' thenif q=2 thenq<=q;else q<=q+1;end if;else q<=0;end if;if q=2 thenz<='1';else z<='0';end if;case s iswhen s0=>if (z = '0') thens<=s0;a<=a;elses<=s1;a<=a+1;end if;when s1=>if (z='0') thens<=s0;a<=a;elses<=s2;a<=a;end if;when s2=>if (z='0') thens<=s0;a<=a;elses<=s2;a<=a;end if;end case;sp<=a;end if;end process p1;end behave;五.实验结果:。

按键消抖

按键消抖

按键消抖
1.按键抖动
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。

由于机械触点的弹性作用, 一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。

因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。

抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。

这是一个很重要的时间参数,在很多场合都要用到。

2.软件消抖
如果按键较多,常用软件方法去抖,即检测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。

当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序
3.硬件消抖
在键数较少时可用硬件方法消除键抖动。

下图所示的RS触发器为常用的硬件去抖。

也可以加入RC滤波电路,进行消抖
利用电容的放电延时,采用并联电容法,也可以实现硬件消抖:消抖电路如下:。

开关抖动及消除

开关抖动及消除

开关抖动及消除当按下和释放微动按键时,会由短时间的抖动现象才会到达想要的状态。

如下图所示:在这里插入图片描述从上图可知。

按键抖动时间大概为150us。

在一些对按键抖动敏感的情况下需要进行消抖设计,目前常见的消抖设计如下:滤波电容关于去抖硬件最简单的方式并联一颗100nF陶瓷电容,进行滤波处理。

在这里插入图片描述RC滤波+施密特触发器要想更严谨设计消抖电路,会增加施密特触发器,更大程度的保证后端不受按键抖动影响,电路如下:在这里插入图片描述分别来看按键闭合断开时电路状态:在这里插入图片描述开关打开时:电容C1通过R1 D1回路充电,Vb电压=Vcc-0.7为高电平,后通过反向施密特触发器使Vout输出为低。

开关闭合时:电容C1通过R2进行放电,最后Vb电压变为0,通过反向施密特触发器使Vout输出为高。

当按下按键出现快速抖动现象时,通过电容会使Vb点电压快速变成Vcc或GND。

在抖动过程时对电容会有轻微的充电或放电,但后端的施密特触发器有迟滞效果不会导致Vout 发现抖动现象。

此电路中D1的使用使为了限制R1 R2一起给C1供电,增加充电时间影响效果。

如果减小R1的值会使电流增加,功耗较高。

专用消抖芯片一些厂家会提供专用芯片,避免自搭电路的不稳定性,如美信-Max6816:在这里插入图片描述软件滤波软件消除抖动也是很常见的方式,一般形式是延时查询按键状态或者中断形式来消除抖动。

下面是Arduino的软件消抖代码:/* SoftwareDebounce** At each transition from LOW to HIGH or from HIGH to LOW * the input signal is debounced by sampling across* multiple reads over several milli seconds. The input* is not considered HIGH or LOW until the input signal* has been sampled for at least "debounce_count" (10)* milliseconds in the new state.** Notes:* Adjust debounce_count to reflect the timescale* over which the input signal may bounce before* becoming steady state** Based on:* /en/Tutorial/Debounce** Jon Schlueter* 30 December 2008** /Learning/SoftwareDebounce */int inPin = 7; // the number of the input pinint outPin = 13; // the number of the output pinint counter = 0; // how many times we have seen new valueint reading; // the current value read from the input pinint current_state = LOW; // the debounced input value// the following variable is a long because the time, measured in milliseconds,// will quickly become a bigger number than can be stored in an int.long time = 0; // the last time the output pin was sampledint debounce_count = 10; // number of millis/samples to consider before declaring a debounced inputvoid setup(){pinMode(inPin, INPUT);pinMode(outPin, OUTPUT);digitalWrite(outPin, current_state); // setup the Output LED for initial state}void loop(){// If we have gone on to the next millisecondif(millis() != time){reading = digitalRead(inPin);if(reading == current_state && counter > 0){counter--;}if(reading != current_state){counter++;}// If the Input has shown the same value for long enough let's switch itif(counter >= debounce_count){counter = 0;current_state = reading;digitalWrite(outPin, current_state);}time = millis();}}版权声明:本文为CSDN博主「sternlycore」的原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

键盘消抖原理代码说明(Verilog)

键盘消抖原理代码说明(Verilog)

笔记2 键盘消抖(别人的笔记)老实说,这个实验的开始之前和之后,都给我蛋疼了。

时钟了解不到源码的思路,边看源码边睡着。

醒来的时候既然“惊”一下,相通了......module lesson02(CLK, RST,SW0, SW1, SW2,LED0, LED1, LED2);input CLK;input RST;input SW0, SW1, SW2;output LED0, LED1, LED2;//---------------------------------------------------------------------------//Detect the switch pressingreg [2:0] Press0;reg [2:0] Press1;wire [2:0] isPress;always @ (posedge CLK or negedge RST)if(!RST)Press0 <= 3'b111;elsePress0 <= {SW0, SW1, SW2}; //read the pin result;always @ (posedge CLK or negedge RST)if(!RST)Press1 <= 3'b111;elsePress1 <= Press0; //read the previous Press0 resultassign isPress=Press1 & (~Press0); //detect the logic with bit is changed from logic 1 to 0 //---------------------------------------------------------------------------//if pressing, counter start counting for 20msreg [19:0] Counter; //计数寄存器always @ (posedge CLK or negedge RST)if(!RST)Counter <= 20'd0;else if(isPress)Counter <= 20'd0;elseCounter <= Counter + 1'b1; //increment for counter//------------------------------------------------------------------------//After 20ms read the key pin resultreg [2:0] Press2;reg [2:0] Press3;wire [2:0] Result;always @ (posedge CLK or negedge RST)if(!RST)beginPress2 <= 3'b111;Press3 <= 3'b111;endelse if(Counter == 20'hfffff)Press2 <= {SW0, SW1, SW2}; //read the pin result after 20mselsealways @ (posedge CLK or negedge RST)if(!RST)elsePress3 <= Press2; //read the previous pin resultassign Result = Press3 & (~Press2); //detect the changing bit from logic 1 to 0//------------------------------------------------------------------------//turn on led with pin resultreg D1;reg D2;reg D3;always @ (posedge CLK or negedge RST)if(!RST)beginD1 <= 1'b0;D2 <= 1'b0;D3 <= 1'b0;endelsebeginif( Result[0] ) D1 <= ~D1;if( Result[1] ) D2 <= ~D2;if( Result[2] ) D3 <= ~D3;endassign LED0 = D1 ? 1'b1 : 1'b0;assign LED1 = D2 ? 1'b1 : 1'b0;assign LED2 = D3 ? 1'b1 : 1'b0;endmodule这个实验主要有计数器和边缘检查来实现按键消抖,按键功能。

PC机按键防抖动技术word精品文档4页

PC机按键防抖动技术word精品文档4页

PC机按键防抖动技术前言:按键开关是电子设备实现人机对话的重要器件之一。

由于大部分按键是机械触点,由于机械触点的弹性及电压突跳等原因,在触点闭合和断开的瞬间会出现电压抖动,抖动的时间长短取决于开关元件的机械特性。

为避免抖动引起误动作造成系统的不稳定,就要求消除按键的抖动,确保按键每按一次只做一次响应。

随着可编程逻辑器件的综合性能的不断提高,它已经广泛应用在各种数字逻辑领域。

一. 按键抖动产生原因及分析按键抖动如图1所示。

如果将这样的信号直接送给微处理器扫描采集的话,将可能把按键稳定前后出现的脉冲信号当作按键信号,这就出现人为的一次按键但微处理器以为多次按键现象。

为了确保按键识别的准确性,在按键信号抖动的情况下不能进入状态输入,为此就必须对按键进行消抖处理,消除抖动时不稳定、随机的电压信号。

不同类型的按键其最长抖动时间也有差别,抖动时间的长短和按键的机械特性有关。

二. 按键消抖技术按键消抖一般采用硬件和软件消抖两种方法。

硬件消抖是利用电路滤波的原理实现,软件消抖是通过按键延时来实现。

在微机系统中一般都采用软件延时的消抖方法。

1.硬件消抖对于单个按键或按钮可以采用RC滤波器或RS双稳态触发器(如下图)来抑制开关输出逻辑信号的抖动,当开关从A端打向B端时,无法避免的在Q’输入一个近似于图示的脉冲序列,利用RS双稳态触发器连续的“置0”和“保持”功能,可以使输出端Q保持翻转为低电平, 维持高电平。

该方法比较复杂,如果系统按键输入较多,则因附加电路太多而不用这种方法。

对于系统按键输入较多的系统,我们可以采用INTEL8279可编程键盘/显示器作为接口芯片,它能够自动消除开关抖动并能对多键同时按下提供保护。

除此之外,可选用由4块CMOS集成芯片和若干电阻、电容组成的电路。

其中555定时器组成多谐振荡器用来给计数器提供时钟脉冲;1块CC40161型四位同步二进制计数器用来设定消抖动电路输出信号Y 的延迟脉冲个数。

c语言按键消抖常用方法

c语言按键消抖常用方法

在C语言中,按键消抖是指处理物理按键在按下或释放时可能产生的抖动或不稳定信号的问题。

常用的方法包括软件延时消抖和状态机消抖。

1. 软件延时消抖:- 当检测到按键按下或释放时,可以通过在代码中添加一个短暂的延时来过滤掉按键可能产生的抖动信号。

例如,在按键检测到变化后,延时几毫秒以确保按键信号稳定后再进行状态读取。

```cvoid delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 300; j++);}// 在按键检测中使用延时if (button_pressed && !last_button_state) {delay(10); // 等待10毫秒if (button_pressed) {// 执行按键按下后的操作last_button_state = button_pressed;}}```这种方法简单易行,但需要根据具体硬件和按键特性调整延时时间,且可能会造成按键响应速度变慢。

2. 状态机消抖:- 利用状态机来跟踪按键状态变化,并在一定持续时间内保持一致的状态才认定为有效按键按下或释放。

这可以通过一个状态变量和定时器结合实现。

```cenum ButtonState {IDLE, PRESSED, RELEASED};enum ButtonState current_state = IDLE;unsigned int debounce_timer = 0;// 在按键检测中使用状态机void button_check() {switch (current_state) {case IDLE:if (button_pressed) {current_state = PRESSED;debounce_timer = 10; // 设定10毫秒的延时}break;case PRESSED:if (!button_pressed) {current_state = RELEASED;debounce_timer = 10; // 设定10毫秒的延时}break;case RELEASED:if (button_pressed) {current_state = PRESSED;debounce_timer = 10; // 设定10毫秒的延时}break;}if (debounce_timer > 0) {debounce_timer--;} else {if (current_state == PRESSED) {// 执行按键按下后的操作} else if (current_state == RELEASED) {// 执行按键释放后的操作}current_state = IDLE; // 处理完毕后返回IDLE状态 }}```这种方法相对于延时消抖更加灵活,可以根据具体需求设置不同的延时时间,并且不会影响整体的按键响应速度。

单片机按键去抖

单片机按键去抖

单片机按键去抖
我们首先要清楚为什么要按键去抖。

先看先按键按下的波形图
通过这个图形就很清楚为什么要按键去抖了,要是不去抖的话,当按下按键的时候就会在0~5ms 内出现抖动,相当于在不停地按下按键而就不是只按了一次了。

稳定闭合时间大约是10ms,松手抖动的时间和按下抖动的时间差不多。

去抖的方法有硬件去抖和软件去抖
我们常用牺牲CPU 的时间来软件去抖,就是按下按键后延时5~10ms 时间后再来检查是否有按键按下,松手检测也一样。

硬件去抖的方法如图所示
独立按键的去抖方法很简单,就是在按下和松手后分别加一小段延时再来判断。

例:
sbit key=P1;
........................
.......................
if(!key) //如果有按键按下
{
delay(10); //延时一小段时间
if(!key) //真有按键按下
{。

// 执行按键按下后的操作
}
while(!key); // 松手检测,要是没有松手的话就一直执行while 循环。

按键消抖与时间按键

按键消抖与时间按键
第4个问题了,从物理上我们可以知道,既然是阻尼振动,必定到振动到某个时候肯定是和稳定的状态一致的,所以肯定不是必须10ms的延时的,比如按下去假设10ms振动后机械才稳定,但是电平上当触点挨得很近振动的时候就算触点不是挨着,还是显示低电平
第5个问题实际上前面已经说了,有硬件消抖肯定对CPU占用最少,软件消抖当然就是尽量不要用些没用的语句,分配好时序
用写好的其他函数作为延时时间控制时序,执行一次扫描后执行其他函数占用100ms左右
这个历程因为有其他函数,只有在编程序的时候才来考虑了用些什么函数语句,这里就不列了哈
第一种方法是大多数情况都能用,这种方法是利用CPU效率比较高的一种(说不定谁做出更牛的,所以就不说最牛的了,当然希望大家能做出更高效率的程序了,哈哈),因为CPU没有执行空语句之类的一些没用的语句,但是必须控制后面所执行的程序是百ms级的所以不是每个程序都能用
(上面的时间都是老师说的和书上现成的,没有实际测试,而且不同的按键应该也会有差异,作为学习研究确实不应该,找个时间锅锅会测出这个时间供大家参考,嘿嘿)
由图我们可以看出,按下去瞬间会出现抖动,弹起来也会出现抖动,明显是个阻尼振动,按键扫描程序是按顺序执行的;
首先提出三个问题大家思考一下
1.为什么要消除抖动
default:return 0;break;
}
}
}
}
定时器函数
void timer0 ()interrupt1
{
TH0=(66636-1000)/256;//对应12M晶振是1ms
TL0=(66636-1000)%256;
T++;
}
改变T的限制或者定时器的初值,即划红线的地方可以改变按键的速度,目前是100ms执行一次

输入法振动效果代码

输入法振动效果代码

输入法振动效果代码输入法振动效果是指在使用手机或其他设备的输入法时,当用户点击键盘上的按键时,设备会通过振动来反馈用户的操作。

这种振动效果可以提高用户的输入体验,使其感受到按键的实际触感,从而减少误触和提高输入速度。

在Android平台上,实现输入法振动效果可以通过使用Vibrator类来实现。

Vibrator类是Android系统提供的一个用于控制设备振动功能的类。

下面将介绍如何编写代码来实现输入法振动效果。

1. 添加权限:在AndroidManifest.xml文件中添加以下权限:```xml<uses-permission android:name="android.permission.VIBRATE" />```这个权限是用于控制设备振动功能的权限。

2. 获取Vibrator对象:在代码中获取Vibrator对象,并进行初始化:```javaVibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);```这里使用了getSystemService()方法来获取系统服务,参数传入Context.VIBRATOR_SERVICE表示获取振动功能。

3. 实现振动效果:接下来,我们可以根据需要实现不同的振动效果。

Android提供了两种方式来实现不同类型的振动:a. 使用vibrate(long milliseconds)方法:该方法用于指定振动持续时间(单位为毫秒),例如:```javavibrator.vibrate(100); // 持续振动100毫秒```b. 使用vibrate(long[] pattern, int repeat)方法:该方法用于指定振动模式和重复次数,其中pattern是一个long类型的数组,用于指定振动和静止的时间(单位为毫秒),repeat表示重复的次数。

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

一种软件去除键抖动的方法
在实际应用中,1个比特表示1个键。C51中的字符变量可以处理8个键,如果系统需要更多的键,可选用整型变量、长整型变量或数组。如果系统的按键数量过多,则会占用较多单片机宝贵的内部寄存器,这是该方法的不足之处。
三.应用程序实例
为了进一步理解上述方法如何在编程中得以实现,在此提供了1个用C51单片机编程语言编制的8个按键的键处理程序,以供参考。该程序在KEIL C51 V6.02/uVsion2 demo编译环境下编译通过。
关键词:单片机 键处理 控制系统 去抖动 键盘
概述
在单片机控制系统中,通过按键实现控制功能是很常见的。对按键处理的重要环节是去抖动,包括去除按下和抬起瞬间的抖动。去抖动的方法有很多种,如使用R-S触发器的硬件方法、运用不同算法的各种软件方法等。硬件方法会增加成本和体积,对于按键较多的矩阵式键盘,会用硬件方法;软件方法用的比较普遍,但有一种加固定延时的去抖动法效率最低,它以无谓地耗费机时来实现去抖动。
Kstore=Kready;
if (Koutput ! =0)/*如果有键按下,置标志准备获取键值*/
getkey=1;
}
}
void get_key_value(void)
{
if(getkey)
{
unsigned char temp;
unsigned char j;
getkey=0;/*清标志*/
for(j=0;j<8;j++)
TL0=0xe0;
TH0=0xb1;
TR0=1;
ET0=1;
EA=1;
/*……*/
while(1)/*循环*/
{
debounce();/*调用去除键抖动函数*/
get_key_value();/*调用获取键值函数*/

键盘扫描去抖方法

键盘扫描去抖方法

实现简洁高效的键盘处理对于提高单片机系统的可靠性及速度有重要意义。

键盘处理的重要环节是扫描和去抖,不少书籍在介绍这些内容时往往只介绍查询和循环延迟的方法,这使初学者比较容易理解,但在实际中通常不会使用这些方法,因为那样的话效率太低了。

这里我们介绍一种采用定时扫描和计数去抖的键盘处理方法,它不仅使程序非常简单高效,而且便于灵活扩展实现处理更复杂的键盘要求。

本文先介绍它的基本算法。

算法流程图图1位该算法的流程图,它用到下面的变量和常数。

变量KscnaBuf:键盘扫描码缓存KScan:键盘扫描码KCount:去抖计数器KReady:按键有效标志常量KD_val:去抖计数长度算法的基本过程如下:CPU以一定时间间隔周期地执行此键盘扫描处理程序。

先是对键盘作扫描,获得反映键盘状态的键盘扫描码;然后对扫描码进行前后对比和定时计数,实现去抖;去抖后置位KReady标志,通知键盘分析程序已检测到有效按键。

关于键盘扫描码键盘扫描码反映读取键盘时刻的键盘动作状态。

对键盘扫描码的基本要求是它要能对每一个单键作唯一编码,如果要使用多键组合则要能对每一种组合进行唯一编码。

通常能做到对任意单键或双键作唯一编码即能满足大多数场合的要求。

具体键盘扫描码的编码方法随采用电路的不同而不同,这里以图2中的4 X 4键盘为例说明。

在该电路中,D4 – D7是输出,D0 – D3是输入。

在读取键盘时程序分别将D4,D5,D6和D7单独地置成低电平,然后依次读取D0 – D3,即可获得所有按键的状态。

我们可以将D0 – D3与D4 – D7合在一起,作为按键的编码。

例如,当A键按下时,得到的编码是10111110;当B键按下时,得到的编码是01110111。

为了反映整个键盘的状态,可以将D0 –D3不全为1的编码作逻辑与,其结果作为键盘扫描码。

可以验证,这样设计的扫描码能够唯一地标识任意单键或双键的动作状态。

去抖的实现我们知道,当一个按键按下和释放时,对应信号线电平的变化有一个不稳定期,即所谓“抖动”,这是因为多数开关的闭合和断开都有一个过程,并不是即刻实现的。

实验05按键消抖

实验05按键消抖

实验5 按键消抖1. 实验目的1. 掌握QuartusII的硬件描述语言设计方法2. 了解同步计数器的原理及应用3. 设计一个带使能输入、进位输出及同步清零的增1四位N (N<16)进制同步计数器2. 准备知识在按键使用的过程中,常常遇到按键抖动的问题,开关在闭合(断开)的瞬间,不能一接触就一直保持导通(断开),因为开关的机械特性,重要经历接触-断开-再接触-再断开,最终稳定在接触位置,这就是开关的抖动,即虽然只是按下按键一次然后放掉,结果在按键信号稳定前后,竟出现了一些不该存在的噪声,这样就会引起电路的误动作。

在很多应用按键的场合,要求具有消抖措施。

按键抖动与开关的机械特性有关,其抖动期一般为5-10ms。

图5.1 按键电平抖动示意图按键的消除抖动分为硬件消除抖动和软件消除抖动。

硬件消除抖动一般采用滤波的方法,通常在按键两端并联一个1~10u左右的电容,有时这样也不能完全消除按键的抖动。

软件消除抖动的方法有多种,常用的是延时扫描和定时器扫描。

延时扫描其原理为:检测到按键操作后延时一端时间(如10ms)后,再检测是否为仍然为同样的按键操作状态,如果相同,就认为是进行了按键操作,然后对该操作进行相应的处理。

定时器扫描的原理是:每隔一端时间(几毫秒)扫描一次键盘,如果连续两次(或3次)的所获得的按键状态相同,就输出按键状态,然后再对这种按键状态进行处理,这里的扫描时间间隔和连续判断按键状态的次数是有关系的,一般总时间要大于按键的抖动期。

如果总时间太长,则感觉按键迟钝,太短可能不能完全消除抖动,要根据实际的情况合适的选择。

在实际电路设计中,经常采用的是软硬件相结合对按键进行消除抖动的处理方法。

本实验采用的方法:实验箱按键的硬件电路是共阳极电路,按下按键时输出到FPGA管脚的电平为低电平,松开按键时为高电平。

我们采用5ms的定时器扫描FPGA管脚电平,如果连续3次为低电平时,存储连续按键状态的次数CNT的值加1,直到该计数值等于10(或再大一些),就不再累加(防止长按该值溢出而重新计数),此时认为按键已稳定,输出按键操作标志;在该过程中,一旦FPGA管脚电平为低电平就对CNT复位清零并同时对按键操作标志位复位,即一个异步复位。

实验2:按键消抖

实验2:按键消抖

基于verilog按键消抖设计关于键盘的基础知识,我就以下面的一点资料带过,因为这个实在是再基础不过的东西了。

然后我引两篇我自己的博文,都是关于按键消抖的,代码也正是同目录下project里的。

这两篇博文都是ednchina的博客精华,并且在其blog 首页置顶多日,我想对大家会很有帮助的。

键盘的分类键盘分编码键盘和非编码键盘。

键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。

而靠软件编程来识别的称为非编码键盘。

在单片机组成的各种系统中,用的最多的是非编码键盘。

也有用到编码键盘的。

非编码键盘有分为:独立键盘和行列式(又称为矩阵式)键盘。

按键在闭合和断开时,触点会存在抖动现象:从上面的图形我们知道,在按键按下或者是释放的时候都会出现一个不稳定的抖动时间的,那么如果不处理好这个抖动时间,我们就无法处理好按键编码,所以如何才能有效的消除按键抖动呢?让下面的两篇博文日志给你答案吧。

经典的verilog键盘扫描程序拿到威百仕( VibesIC )的板子后就迫不及待的开始我的学习计划,从最基础的分频程序开始,但看到这个键盘扫描程序后,直呼经典,有相见恨晚的感觉,还想说一句:威百仕( VibesIC ),我很看好你!WHY?待我慢慢道来,这个程序的综合后是0error,0warning。

想想自己编码的时候那个warning是满天飞,现在才明白HDL设计有那么讲究了,代码所设计的不仅仅是简单的逻辑以及时序的关系,更重要的是你要在代码中不仅要表现出每一个寄存器,甚至每一个走线。

想想我写过的代码,只注意到了前者,从没有注意过后者,还洋洋自得以为自己也算是个高手了,现在想来,实在惭愧啊!学习学习在学习,这也重新激发了我对HDL设计的激情,威百仕给了我一个方向,那我可要开始努力喽!废话说了一大堆,看程序吧:(本代码经过ise7.1i综合并下载到SP306板上验证通过)//当三个独立按键的某一个被按下后,相应的LED被点亮;再次按下后,LED 熄灭,按键控制LED亮灭`TImescale 1ns/1nsmodule keyscan(clk,rst_n,sw1_n,sw2_n,sw3_n,//outputled_d3,led_d4,led_d5);input clk; //主时钟信号,48MHzinput rst_n; //复位信号,低有效input sw1_n,sw2_n,sw3_n; //三个独立按键,低表示按下output led_d3,led_d4,led_d5; //发光二极管,分别由按键控制// ---------------------------------------------------------------------------reg [19:0] cnt; //计数寄存器always @ (posedge clk or negedge rst_n)if (!rst_n) //异步复位cnt <= 20'd0;elsecnt <= cnt + 1'b1;reg [2:0] low_sw;always @(posedge clk or negedge rst_n)if (!rst_n)low_sw <= 3'b111;else if (cnt == 20'hfffff) //满20ms,将按键值锁存到寄存器low_sw中low_sw <= {sw3_n,sw2_n,sw1_n};// ---------------------------------------------------------------------------reg [2:0] low_sw_r; //每个时钟周期的上升沿将low_sw信号锁存到lo w_sw_r中always @ ( posedge clk or negedge rst_n )if (!rst_n)low_sw_r <= 3'b111;elselow_sw_r <= low_sw;//当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期wire [2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]);reg d1;reg d2;reg d3;always @ (posedge clk or negedge rst_n)if (!rst_n)begind1 <= 1'b0;d2 <= 1'b0;d3 <= 1'b0;endelsebegin //某个按键值变化时,LED将做亮灭翻转if ( led_ctrl[0] ) d1 <= ~d1;if ( led_ctrl[1] ) d2 <= ~d2;if ( led_ctrl[2] ) d3 <= ~d3;endassign led_d5 = d1 ? 1'b1 : 1'b0; //LED翻转输出assign led_d3 = d2 ? 1'b1 : 1'b0;assign led_d4 = d3 ? 1'b1 : 1'b0;endmodule也许初看起来这段代码似乎有点吃力,好多的always好多的wire啊,而我们通常用得最多的判断转移好像不是主流。

嵌入式系统下按键操作的软件设计方法

嵌入式系统下按键操作的软件设计方法

嵌入式系统下按键操作的软件设计方法嵌入式系统键盘软件设计存在3方面问题:软件去抖动、等待按键抬起和连击处理。

1嵌入式系统键盘软件设计的3个问题1.1软件去抖动问题一次完整按键过程的时序波形如图1所示。

当按键未被按下时,单片机端口输入为通过上拉电阻获得的高电平;按下时,端口接至地,端口输入为低电平。

当机械触点断开、闭合时会有抖动,这种抖动对人来说是感觉不到的,但对计算机来说,则是完全可以感应到的。

计算机处理的速度是us级,而机械抖动的时间至少是ms级,对计算机而言,这已是漫长的时间了。

为使单片机能正确地读出端口的状态,对每一次按键只作一次响应,这就必须考虑如何去除抖动的问题。

嵌入式系统一般采用软件延时去除抖动。

软件延时去除抖动其实很简单,就是在单片机获得端口有按键动作时,不是立即认定按键开关已被按下,而是延时10 ms 或更长一段时间后再次检测端口,如果仍为动作电平,则说明按键开关的确按下了,这实际上是避开了按键按下时的抖动时间;而在检测到按键释放后(端口为高)再延时5~10 ms,消除后沿的抖动,然后再对键值处理。

当然,实际应用中对按键的要求也是千差万别,要根据不同的需要来编制处理程序,但以上是软件延时去除抖动的基本原则。

1.2等待按键抬起问题单片机在查询读取按键时,不断地扫描键盘,扫描到有键按下后,进行键值处理。

它并不等待键盘释放再退出键盘程序,而是直接退出键盘程序,返回主程序继续工作。

计算机系统执行速度快,很快又一次执行到键盘程序,并再次检测到键还处于按下的状态,单片机还会去执行键值处理程序。

这样周而复始,按一次按键系统会执行相应处理程序很多次。

而程序员的意图一般是只执行一次,这就是等待按键抬起问题。

通常的解决办法是,当按键抬起后再次按下才再次执行相应的处理程序,等待时间一般在几百ms以上。

通常在软件编程中,当执行完相应处理程序后,要加一个非常大的延时函数,再向下执行。

对于软件去抖动问题和等待按键抬起问题,若采用软件延时,会大大削弱系统的实时性;若采用中断方式延时,会占用定时器,耗费了系统资源,且软件的多任务编程会增大软件设计的复杂度。

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

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

---------------------------------------------------------------最新资料推荐------------------------------------------------------一种软件去除键抖动的方法一种软件去除键抖动的方法概述在单片机控制系统中,通过按键实现控制功能是很常见的。

对按键处理的重要环节是去抖动,包括去除按下和抬起瞬间的抖动。

去抖动的方法有很多种,如使用 R-S 触发器的硬件方法、运用不同算法的各种软件方法等。

硬件方法会增加成本和体积,对于按键较多的矩阵式键盘,会用硬件方法;软件方法用的比较普遍,但有一种加固定延时的去抖动法效率最低,它以无谓地耗费机时来实现去抖动。

此处介绍的是一种软件方法。

简单说来是一种运算法,配合定时中断读取按键,通过运算逻辑表达式:Keradyn=Ktemp Kinput+Kreadyn-1 (Ktemp ⊙Kinput) (1) Ktemp=Kinput (2) 可以获得消除抖动的按键消息。

这种方法效率高,不需耗时的循环等待,而且算法简单、使用方便。

一、基本原理由于按键的按下与抬起都会有 10~20ms 的抖动毛刺存在,因此,为了获取稳定的按键信息,须要避开这段抖动期。

设置 3 个变量 Kready、 Ktemp 和 Kinput,并设置定时中断1 / 6周期为 20ms。

在定时中断服务程序中读取按键,并把读取的数据存于变量Kinput 中。

变量 Kready中是所需要的稳定的按键信息; Ktemp 是中间变量,它的值是上一次的 Kinput。

根据当前按键的状态,考虑到 Kready 中是 20ms 抖动后的有效键信息,则Kready、 Ktemp 和 Kinput 之间,在不同时刻的状态关系如表 1 所列。

表 1 时刻 Kready Ktemp Kinput 1 0 0 0 2 0 0 1 3 0 1 0 4 0 0 1 5 1 1 1 6 1 1 1 7 1 1 0 8 1 0 1 9 1 1 0 10 0 0 0 11 0 0 0 时刻 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、8 时 Kinput 都为 1,说明按键一直按下,只不过有干扰, Kready 保持为 1;时刻9、 10 连续两个时刻 Kinput 为 0,表示按键抬起,时刻 10 时 Kready 为 0。

按键消抖

按键消抖

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。因此单片机在检测键盘是否按下时都要加上去抖动操作,有专用的去抖动电路,也有专门的去抖动芯片,但通常 我们采用软件延时的方法就可以解决抖动问题。

苹果手机中的文字键盘还能这么玩?抖一抖就可以直接删除,涨知识

苹果手机中的文字键盘还能这么玩?抖一抖就可以直接删除,涨知识

苹果手机中的文字键盘还能这么玩?抖一抖就可以直接删除,
涨知识
手机现在对于我们来说基本上是人手一部的标配,其实我们使用的比较多的还是其中的APP,一些手机中的功能其实很少去发掘使用,导致很多有趣又实用的小技巧都不知道,今天就给大家分享几个苹果手机“抖动”一下就能解决问题的小技巧!
1.抖动撤销文字
我们在和朋友使用文字聊天的时候,打出一段话,但是总觉得这样发不出不好,无法让人准确理解,想要删除文字,还在一个字一个字的删除?其实只要抖动一下,页面上就会出现“撤销正在键入”的字样,然后点击下面的“撤销”,输入框中的文字就会全部消失!
2.抖动还原文字
在上面将文字进行撤销后,有想要还原这些文字,其实这样也是很简单的,还是抖动一下手机,出现“重做真在键入”,点击右下角的“重做”,文字就会全部出现!
当然我们也可以使用“录音转文字助手”,直接使用录音功能,然后可以将录制的音频文件直接转换成文字,可以用来会议记录、语音备忘录、通话录音或语记听写,也可以实现中英文音频文件互译!3.抖动拍摄
在使用苹果手机刷抖音的时候,只要抖动一下,页面就会自动跳转到拍摄页面,我们可以直接拍摄视频进行上传,非常的方便!
你还知道哪些苹果手机小技巧,一起来分享!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

键盘接口与编程
键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。

一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。

1. 按键开关的抖动问题
组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的。

在下图中,当开
关S 未被按下时,P1。

0输入为高电平,S 闭合后,P1。

0输入为低电平。

由于按键是机械触点,当机械触点断开、闭合时,会有抖动动,P1。

0输入端的波形如图2所示。

这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全可以感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。

前面我们讲到中断时曾有个问题,就是说按键有时灵,有时不灵,其实就是这个原因,你只按了一次按键,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。

为使CPU 能正确地读出P1口的状态,对每一次按键只作一次响应,就必须考虑如何去除抖动,常用的去抖动的方法有两种:硬件方法和软件方法。

单片机中常用软件法,因此,对于硬件方法我们不介绍。

软件法其实很简单,就是在单片机获得P1。

0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。

0口,如果仍为低,说明S1的确按下了,这实际上是避开了按键按下时的抖动时间。

而在检测到按键释放后(P1。

0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。

不过一般情况下,我们通常不对按键释放的后沿进行处理,实践证明,也能满足一定的要求。

当然,实际应用中,对按键的要求也是千差万别,要根据不同的需要来编制处理程序,但以上是消除键抖动的原则。

2. 键盘与单片机的连接

1

4
图3
1、通过1/0口连接。

将每个按键的一端接到单片机的I/O口,另一端接地,这是最简单的方法,如图3所示是实验板上按键的接法,四个按键分别接到P3.2 、P3.3、P3.4和P3.5。

对于这种键各程序可以采用不断查询的方法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键处理。

下面给出一个例程。

其功能很简单,四个键定义如下:
P3.2:开始,按此键则灯开始流动(由上而下)
P3.3:停止,按此键则停止流动,所有灯为暗
P3.4:上,按此键则灯由上向下流动
P3.5:下,按此键则灯由下向上流动
UpDown EQU 00H ;上下行标志
StartEnd EQU 01H ;起动及停止标志
LAMPCODE EQU 21H ;存放流动的数据代码
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
CLR UpDown ;启动时处于向上的状态
CLR StartEnd ;启动时处于停止状态
MOV LAMPCODE,#0FEH ;单灯流动的代码
LOOP:
ACALL KEY ;调用键盘程序
JNB F0,LNEXT ;如果无键按下,则继续
ACALL KEYPROC ;否则调用键盘处理程序
LNEXT:
ACALL LAMP ;调用灯显示程序
AJMP LOOP ;反复循环,主程序到此结束
;---------------------------------------
DELAY:
MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;----------------------------------------延时程序,键盘处理中调用
KEYPROC:
MOV A,B ;从B寄存器中获取键值
JB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反) JB ACC.3,KeyOver
JB ACC.4,KeyUp
JB ACC.5,KeyDown
AJMP KEY_RET
KeyStart:
SETB StartEnd ;第一个键按下后的处理
AJMP KEY_RET
KeyOver:
CLR StartEnd ;第二个键按下后的处理
AJMP KEY_RET
KeyUp: SETB UpDown ;第三个键按下后的处理
AJMP KEY_RET
KeyDown:
CLR UpDown ;第四个键按下后的处理
KEY_RET:RET
KEY:
CLR F0 ;清F0,表示无键按下。

ORL P3,#00111100B ;将P3口的接有键的四位置1
MOV A,P3 ;取P3的值
ORL A,#11000011B ;将其余4位置1
CPL A ;取反
JZ K_RET ;如果为0则一定无键按下
ACALL DELAY ;否则延时去键抖
ORL P3,#00111100B
MOV A,P3
ORL A,#11000011B
CPL A
JZ K_RET
MOV B,A ;确实有键按下,将键值存入B中
SETB F0 ;设置有键按下的标志
K_RET:
ORL P3,#00111100B ;此处循环等待键的释放
MOV A,P3
ORL A,#11000011B
CPL A
JZ K_RET1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回 AJMP K_RET
K_RET1:
RET
;-----------------------------------
D500MS: ;流水灯的延迟时间
PUSH PSW
SETB RS0
MOV R7,#200
D51: MOV R6,#250
D52: NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
POP PSW
RET
;-----------------------------------
LAMP:
JB StartEnd,LampStart ;如果StartEnd=1,则启动 MOV P1,#0FFH
AJMP LAMPRET ;否则关闭所有显示,返回LampStart:
JB UpDown,LAMPUP ;如果UpDown=1,则向上流动 MOV A,LAMPCODE
RL A ;实际就是左移位而已
MOV LAMPCODE,A
MOV P1,A
LCALL D500MS
AJMP LAMPRET
LAMPUP:
MOV A,LAMPCODE
RR A ;向下流动实际就是右移
MOV LAMPCODE,A
MOV P1,A
LCALL D500MS
LAMPRET:
RET
END
以上程序功能很简单,但它演示了一个键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按键反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家可以仔细考虑一下这些问题,再想想有什么好的解决办法。

2、采用中断方式:如图4所示。

各个按键都接到一个与非上,当有任何一个按键按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中不断地循环查询,如果有键按下,单片机再去做相应的处理。

相关文档
最新文档