精巧的按键处理程序
按键扫描程序(4)
else if(key == D_key)
........//点亮B_LED,关闭A_LED和C_LED
else if(key == S_key)
key_time_1 = 0; // 第1次单击,不返回,到下个状态判断后面是否出现双击
key_m = key_state_1;
}
else
特别操作情况定义:
1。短按操作和长按操作间隔<0.5s,以及,长按操作和短按操作间隔<0.5s,均不产生双击事件
2。连续n次(n为奇数)短按操作,且间隔均<0.5s,产生(n-1)/2次双击事件+1次单击事件
3。连续n次(n为偶数)短按操作,且间隔均<0.5s,产生n/2次双击事件
题目:多功能按键设计。利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按。
============================================================================
用户基本操作定义:
1。短按操作:按键按下,按下时间<1s,属于一次短按操作
if (!key_press)
{
key_time = 0; //
key_state = key_state_2; // 按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。
VHDL入门:关于按键消抖的那个process
这学期的EDA课程设计有涉及到一个按键信号稳定的问题,虽然就算没有这块处理,最后成绩只会扣3分,但自己觉得像LED亮度变化,数字钟设置这些功能,如果没有加进一个稳定按键信号的模块,根本不能算是已实现的功能。
按键消抖的程序在网上有几种可供选择,但这里只讨论一种,本人觉得简单得来又比较强大的一种。
其实消抖的原理就是把一个按键周期内所输入的所有有效信号,包括那些毛刺,处理成一个脉冲输入。
能达到这点,就可以实现消抖功能了。
功能的源代码:代码中的 key 是按键输入,count 是自定义的计数器,N的值可以根据需要结合时钟频率设置,如果只是想达到按键一次输入一个脉冲的效果,建议 count 的时长设为 5ms,key_en 是处理完后输出的单个脉冲,至于有效信号是 '0' 还是'1' ,这要看板上的电路设计了。
此代码中是 '0' 为有效信号。
不要怀疑这段代码有错,理清逻辑后再套用,如果弄不明白什么原理,建议还是别用,用了可能会更糟糕。
要注意的是一个 process 中只能有一个时钟信号,否则很容易出错,就算编译通过,实际操作还是不行。
所以如果要对多个按键消抖,一定要在 "if clk'event and clk='1' then" 语句的内部增加,别重新设置一个 clk'event 。
还有就是按键的消抖功能块最好用单独的 process 运行,将 key_en 设置成新的按键输入信号,而实际的输入信号 key 只在按键消抖的process 中读入。
之所以说这种消抖方法简单得来又比较强大,是因为这方法不需要用到什么状态机、component 之类较高级点的东西,只需要多个 process 即可;另外这种方法还有其他的拓展用途,比如可以利用这个 count 延时周期设置一个短按键和长按键的识别,实现长按此键切换或者 reset 等等的功能,这里不详细解释。
单片机按键程序设计
单片机按键程序设计单片机按键的基本原理其实并不复杂。
通常,按键就是一个简单的开关,当按键按下时,电路接通,对应的引脚电平发生变化;当按键松开时,电路断开,引脚电平恢复到初始状态。
在程序设计中,我们需要不断检测引脚的电平变化,从而判断按键是否被按下。
在实际的按键程序设计中,有多种方式可以实现按键检测。
其中一种常见的方法是查询法。
这种方法是通过不断地读取按键对应的引脚状态来判断按键是否被按下。
以下是一个简单的查询法示例代码:```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void main(){while(1) //无限循环{if(key == 0) //如果按键按下,引脚为低电平{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;while(key == 0);//等待按键松开}}}```上述代码中,我们首先定义了按键连接的引脚`key`,然后在主函数的无限循环中不断检测按键引脚的状态。
当检测到按键按下时,执行相应的操作,并通过`while(key == 0)`等待按键松开。
除了查询法,还有中断法可以用于按键检测。
中断法的优点是能够及时响应按键动作,不会因为程序的其他操作而导致按键响应延迟。
```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void int0_init()//中断初始化函数{IT0 = 1; //下降沿触发中断EX0 = 1; //使能外部中断 0EA = 1; //开总中断}void int0() interrupt 0 //外部中断 0 服务函数{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;}void main(){int0_init();//初始化中断while(1);//无限循环,保持程序运行}```在上述代码中,我们首先在`int0_init` 函数中对中断进行了初始化设置,然后在`int0` 函数中编写了按键按下时的处理代码。
按键处理程序C语言单片机
按键处理程序C语言单片机分享一种按键处理程序(用C)//头文件定义:Ustruct KEY{Uchar Val;#define Key_Model_C 0 //按键1值#define Key_AddVal_C 1 //按键2值Uint ScanOnTime;Uchar LongKeyState;Uchar LongKeyRestState;Uchar SetInRn;Uchar Model; //按键状态(模式)#define Off_C 0 //之前未按下#define On_C 1 //现按下#define Delay_C 2 //按键处理后标志}Key;//----------------定义两个IO输入口为按键入口--------------------//#define KeyMo_Bin (GPIOB->IDR.Bit.B5)#define KeyAdd_Bin (GPIOB->IDR.Bit.B6)/*===================================== ==========================*/GPIO_Init(GPIO_Pin_5|GPIO_Pin_6,GPIO_Mode_In_PU_No_IT); //初始化为上拉输入无中断/*===================================== ==========================*///主程序大循环中每1毫秒扫描1次void KeyScan(void){if(Key.LongKeyRestState == 1) //长按键标志(复位处理长按键){if((KeyMo_Bin == 1) && (KeyAdd_Bin == 1)) //当两按键均抬起{if(++Key.ScanOnTime >= 130) //延时后复位{Key.LongKeyRestState=0;Key.Model=Delay_C;}}elseKey.ScanOnTime=0;return;}if(Key.Model == Off_C) //如果当前按键状态为未按下“Off_C”{if((KeyMo_Bin == 0) || (KeyAdd_Bin == 0))//按键1或按键2已按下(低有效){if(++Key.ScanOnTime >= 10) //当按下后自加1,加够10次即1ms*10=10ms去抖动{Key.ScanOnTime=0;if(KeyMo_Bin == 0) //如果按键1为0即按下{Key.Val=Key_Model_C; //付当键1值(看头文件定义)Key.Model=On_C; //置按键已按下标志}else if(KeyAdd_Bin == 0) //如果按键2为0即按下{Key.Val=Key_AddVal_C; //付当键2值(看头文件定义)Key.Model=On_C; //置按键已按下标志}BellOn(200); //蜂鸣器响}}elseKey.ScanOnTime=0; //清去抖延时计数值}else if(Key.Model == Delay_C) //如果当前按键状态为已按下且已处理“Delay_C”{if((KeyMo_Bin == 1) && (KeyAdd_Bin == 1))//如果两按键均抬起{if(++Key.ScanOnTime >= 100) //延时100ms后复位按键状态为“Off_C”{Key.SetInRn=0;Key.ScanOnTime=0;Key.Model=Off_C;}}else //如果按键没有被抬起,对应上面if{if(++Key.ScanOnTime >= 1000) //延时1000ms后再复位按键状态为“Off_C”(为长按处理){Key.ScanOnTime=0;Key.Model=Off_C;}}}}//===================================== ========================================= ========void LoadCheckKeyRest(void){Key.LongKeyRestState=1;Key.ScanOnTime=0;}//===================================== ========================================= ========//处理相应按键(可250ms才调用一次)长按if(Key.Model == On_C) //按键状态为已按下{if(Key.Val == Key_Model_C) //是键1按下(看头文件定义){if(++Key.SetInRn >= 3) //连计3次数3秒后为长按键(对应上面,如果按下未抬起的话会延时1000ms){Key.SetInRn=0;LoadCheckKeyRest(); //调清长按处理BellOn(600); //蜂鸣器响//-----------长按需处理的内容-----下-----------//WorkStateBit.Bit.SettingMo=1;SetOverTime=0;SetMoRn=0;SetBak[0]=Rtc_InitDate.RTC_Year;SetBak[1]=Rtc_InitDate.RTC_Month;SetBak[2]=Rtc_InitDate.RTC_Date;SetBak[3]=Rtc_InitDate.RTC_WeekDay;SetBak[4]=Rtc_InitTime.RTC_Hours;SetBak[5]=Rtc_InitTime.RTC_Minutes;//-----------长按需处理的内容------上----------//Key.Model=Delay_C; //置按键模式为:已处理按键(看头文件定义)return;}}elseKey.SetInRn=0;Key.Model=Delay_C;}。
gshock按键功能
gshock按键功能G-Shock按键功能是一款非常实用的功能齐全的手表。
它被广泛应用于各种户外运动和极限运动,凭借其耐冲击、防水、防磁等特点而备受青睐。
它不仅有时钟、计时器、秒表等常见功能,还具备一些独特的按键功能,下面我将为大家详细介绍一下:首先是G-Shock的调整按键功能。
通过这些按键,用户可以轻松地切换模式,调整时间和日期等基本设置。
手表上通常有四个按键,根据按键的不同组合方式可以进行不同的操作。
比如,通过同时按下两个按键,可以进入设置模式,并通过其他按键来调整时间和日期。
这使得调整时间和日期变得非常方便快捷。
其次是G-Shock的闹钟和定时器功能。
用户可以设置多个闹钟和定时器,可以在特定的时间提醒用户或计时。
通过按键,用户可以轻松地设置闹钟的时间和铃声。
同时,用户还可以在使用定时器时按下按键,以暂停或重置定时器。
这些功能对于生活和工作都非常有帮助,特别是在需要按时完成任务或者提醒自己的场合。
另外,G-Shock还具备倒计时和秒表功能。
倒计时功能可以帮助用户在特定时间内完成任务,用户可以通过按键轻松设置倒计时时间,并在倒计时结束时进行提示。
秒表功能可以对时间进行精确的计时,用户可以通过按键开始、停止和重置秒表。
这对于一些需要精确计时的运动或比赛来说尤为重要,比如游泳、跑步等运动项目。
此外,G-Shock还具备一些特殊的功能按键,如电子指南针、温度计和高度计等。
通过按键,用户可以轻松地切换这些功能,并进行相应的测量。
电子指南针可以帮助用户在户外环境中确定方向,温度计可以测量周围的气温,而高度计可以测量用户所处的海拔高度。
这些功能在登山、徒步等户外活动中非常有用,帮助用户更好地适应环境。
总而言之,G-Shock的按键功能非常丰富,能够满足用户在不同场合的需求。
无论是日常生活中的时间管理,还是户外运动中的环境适应,G-Shock都能提供便捷的操作和准确的测量。
这些按键功能使得G-Shock成为现代人不可或缺的时尚配饰和实用工具。
手机按键工艺介绍
案例分析 ---背印拉丝纹
工艺介绍: 用CNC铣出外型,然后背面丝印CD纹
优点:厚度可以做到很薄,PC片最薄可以使用0.13mm,
(一般取值0.4—0.5)
不足:丝印定位要求高,外观不良较高,外型靠 CNC铣出,所以局部尺寸受限制
案例分析 ---车铣拉丝纹
组装
表面处理:
1、喷涂+镭雕 2、凹坑点漆 3、背面丝印 4、IMD按键 5、水晶按键 6、电镀组合
普通P+R
案例分析 ---喷涂+镭雕
工艺介绍:注塑出来后,喷涂,镭雕、UV保护、组装 优点:最为常用的键盘工艺,成本优势,工艺很成熟 不足:中规中矩,无新意
普通P+R
案例分析 ---印刷按键
工艺介绍:注塑,印刷(多次)、(镭雕)、UV保护、组装 优点:工艺成熟 不足:不良高。字符不能做得太细,透光效果不好控制, 有的会有重影
案例分析 ---金属拉丝电镀后再电泳
工艺介绍: 0.2的铜片,蚀刻出外型,车铣CD纹,进行表面 第一次电镀,再进行电泳
优点:外观非常绚丽、醒目,很薄。
不足:成本很高,耐磨性差较差。
案例分析 ---UV转印按键
工艺介绍:
案例分析 ---IMD按键
工艺介绍: 在film上印出各种符号、图案,进行模内转印,注塑完成图案 优点:永久耐磨、可以达到丝印无法达到的效果,印出更多花样,
更多不同色彩,工序简单。 不足:成本较高,制造不良较高
案例分析 ---水晶按键
工艺介绍: 在注塑时添加特殊色母,荧光粉,用印 刷镜面油墨或蒸镀做背景,可以做出有 水晶效果的按键,具有较强的时尚感。
可编程键盘使用方法
可编程键盘使用方法当使用可编程键盘时,有许多方法和技巧可以帮助您更高效地利用它的功能。
以下是50条关于可编程键盘使用方法并展开详细描述:1. 定义自定义快捷键:使用可编程键盘的软件,您可以定义自己的快捷键,例如触发特定应用程序或执行特定功能。
2. 创建宏:通过可编程键盘软件,您可以创建宏,以便一键执行复杂的操作序列,例如输入一段代码、执行一系列操作或者发送一封预定义的电子邮件。
3. 分层编程:一些可编程键盘支持分层编程,即在不同的层次设置不同的功能,可以根据需要进行切换,从而提高按键的多功能性。
4. 键位调整:通过可编程键盘软件,您可以重新映射键位,使得您习惯的键位布局可以在不同键盘上使用。
5. 多设备切换:如果您使用多台电脑或设备,一些可编程键盘可以支持快速切换不同设备,方便您在不同工作环境间进行移动。
6. 文本扩展:通过可编程键盘软件,您可以定义文本缩写和扩展,方便您快速输入常用的短语和段落。
7. 游戏模式:一些可编程键盘有专门的游戏模式,可以通过一键切换来禁用Windows 键或其他会干扰游戏操作的按键。
8. 设置多重触发:一些高级的可编程键盘支持多重触发,即在一个键上设置多种功能,通过单击、双击、长按或其他方式进行不同的响应。
9. 配置LED灯光效果:一些可编程键盘配备了LED灯,可以通过软件对其进行配置,达到个性化的灯光效果。
10. 自定义屏幕显示:一些可编程键盘上配备了OLED屏幕,您可以自定义显示内容,实时显示信息,如CPU温度、系统负载等。
11. 设备管理:在使用多个可编程键盘时,一些软件可以帮助您管理多个设备的配置和设置。
12. 定义特定应用程序的功能:针对特定的软件应用程序,您可以通过可编程键盘软件为其定义特定的快捷功能,提高工作效率。
13. 脚本编程:通过可编程键盘软件支持脚本编程,您可以更加强大地定制键盘功能,并且支持更多复杂的操作。
14. 切换不同的配置文件:对于不同的工作场景,您可以在可编程键盘软件中创建不同的配置文件,并进行快速切换,以应对不同的工作需求。
最简洁的按键检测 原理算法 c语言
最简洁的按键检测原理算法 c语言按键检测是在电子设备中常见的操作,它可以实现对按键的状态进行监测和响应。
本文将介绍一种简洁的按键检测原理算法,并使用C语言进行实现。
在电子设备中,按键通常是一种开关,用于接通或断开电路。
按下按键时,电路闭合,产生一个信号,通过按键检测可以获取到这个信号,并进行相应的处理。
按键检测的原理算法如下:1. 初始化:首先需要对按键进行初始化设置,包括设置按键引脚的输入/输出状态和电平状态。
2. 检测按键状态:通过读取按键引脚的电平状态来检测按键的状态。
一般来说,按键引脚的电平为高电平(1)表示按键未按下,低电平(0)表示按键按下。
3. 延时:为了避免检测到按键的抖动(按键在按下和松开的瞬间会产生多次信号),可以在检测到按键状态改变后进行一个短暂的延时,一般为几毫秒。
4. 再次检测:在延时后,再次读取按键引脚的电平状态。
如果检测到的状态与之前不同,说明按键的状态发生了改变。
5. 处理按键事件:根据按键的状态改变来进行相应的处理,比如执行一段代码、发送一个信号等。
6. 循环检测:以上步骤需要放在一个循环中进行,以实现对按键状态的持续监测和响应。
下面是一个简单的按键检测的C语言示例代码:```c#include <stdio.h>#include <wiringPi.h>#define BUTTON_PIN 17int main(){if (wiringPiSetup() == -1) // 初始化wiringPi库{printf("wiringPi setup failed!\n");return -1;}pinMode(BUTTON_PIN, INPUT); // 设置按键引脚为输入模式int previousState = HIGH; // 初始状态为未按下while (1){int currentState = digitalRead(BUTTON_PIN); // 读取按键引脚的电平状态if (currentState != previousState) // 检测到按键状态改变{delay(50); // 延时50毫秒,避免按键抖动currentState = digitalRead(BUTTON_PIN); // 再次读取按键引脚的电平状态if (currentState != previousState) // 再次检测到按键状态改变{if (currentState == LOW) // 按键按下{printf("Button pressed!\n");// 其他处理代码...}else // 按键松开{printf("Button released!\n");// 其他处理代码...}}}previousState = currentState; // 更新前一个状态}return 0;}```以上代码使用了wiringPi库来进行GPIO的控制和读取,需要在编译时加上-lwiringPi选项。
按键模块工作原理
按键模块工作原理介绍按键模块是一种常见的电子元件,用于接受人体按下的输入信号,并将其转换成电路中的电信号,以便用于电子设备的控制和操作。
它广泛应用于各种电子设备、仪器和仪表中,如计算机键盘、手机键盘、遥控器等。
按键模块的组成按键模块通常由以下几个部分组成: 1. 外壳:用于保护按键模块内部结构和电路。
2. 按键:是按键模块的核心部件,用于接收用户的按下操作。
3. 弹簧:连接按键和电路板,起到恢复按键初始状态的作用。
4. 电路板:包含按键模块的电路,负责接受按键的输入并将其转换成电信号。
工作原理按键模块的工作原理可以分为以下几个步骤:步骤一:按键操作用户通过按下按键来触发按键模块,通常需要用手指或其它物体对按键施加一定的压力。
步骤二:触发动作当用户按下按键时,按键会向下移动,触发弹簧的压缩。
弹簧具有一定的弹性,因此会迅速恢复到初始位置。
步骤三:电路连接按键的下压操作会使得按键模块内的两个电极相互接触,从而形成电路的闭合。
步骤四:信号传输当电路闭合后,按键模块内的电路会产生一个电信号。
这个电信号可以通过连接在按键模块上的导线传输给电子设备的处理电路。
步骤五:信号处理电子设备的处理电路接收到按键模块传输过来的电信号后,会进行相应的处理。
例如,计算机键盘会将按键信息传输给计算机的主机,手机键盘会将按键信息传输给手机的处理器。
步骤六:执行动作最后,根据信号处理的结果,电子设备会执行相应的操作。
例如,计算机键盘会在屏幕上显示用户按下的按键字符,手机键盘会在屏幕上显示用户输入的字符。
按键模块的应用按键模块广泛应用于各种电子设备和仪器中,它可以方便地实现人机交互和设备控制。
以下是一些常见的应用场景:1. 电脑键盘电脑键盘是按键模块的典型应用之一。
它由多个按键模块组成,用于接收用户的按键输入,并将其转换成电信号发送给计算机的主机。
通过电脑键盘,用户可以方便地输入文字、执行命令和控制软件的操作。
2. 手机键盘手机键盘也是按键模块的常见应用之一。
51单片机按键消抖程序原理
51单片机按键消抖程序原理一、引言按键消抖是嵌入式系统编程中常见的问题之一,尤其是在使用51单片机时。
51单片机是一款常用的微控制器,广泛应用于各种嵌入式系统中。
按键作为常见的输入设备,在51单片机应用中经常被使用。
由于按键的机械特性,当按键按下或释放时,会产生机械抖动,给系统带来误操作。
因此,了解并编写按键消抖程序对于保证系统的正常运行至关重要。
二、消抖原理按键消抖,简单来说,就是通过一定的算法,消除按键产生的机械抖动,从而准确识别按键的状态。
其原理主要基于以下两点:1.机械抖动的特点:按键的机械抖动主要表现为按键触点之间的快速开关,产生一系列微小的电信号。
这些信号通常包含真实的按键输入信号和噪声信号。
2.消抖算法:通过分析这些信号,识别出真实的按键输入信号,并忽略噪声信号,从而达到消除机械抖动的目的。
常用的消抖算法有阈值比较法、防抖延时法、防抖滤波法等。
三、消抖程序实现下面以51单片机为例,介绍一种简单的阈值比较法消抖程序实现:```cvoidkey_debounce(intkey_pin){//定义按键引脚intdebounce_time=50;//消抖时间,单位毫秒intthreshold=5;//阈值,可以根据实际情况调整intkey_state=0;//按键状态,初始化为0(未按下)intlast_key_state=0;//上一次的按键状态while(1){//读取按键状态key_state=digitalRead(key_pin);last_key_state=key_state;//判断按键是否按下if(key_state==LOW){//按键按下,开始消抖if(millis()-last_key_state>=debounce_time){//经过一定时间,确定按键状态if(key_state==digitalRead(key_pin)){//检测到真实的按键输入信号//这里可以进行相应的操作,例如点亮LED灯等}else{//检测到噪声信号或其他干扰,忽略}}else{//消抖时间不足,忽略当前状态}}else{//按键释放,忽略当前状态}}}```上述程序中,通过设置一个阈值和消抖时间,来判断按键状态是否发生变化。
按键程序
作者:hexiaoxiao栏目:单片机
我用C51做的键盘程序,望大家批砖
该程序没有被仿真过,可能有一些错误.不过编译是;intrins.h>
#include<reg51.h>
#define uCHAR unsigned CHAR
if(state!=0x0F) //Óмü°´ÏÂ
{
SWITCH(state)
{
case 0x0E:
key=(0x4-i)*0x4+0x1;
break;
case 0x0D:
key=(0x4-i)*0x4+0x2;
break;
case 0x0B:
{
delayms();
if((P0&0x0f)!=0x0f) //确认有键按下
{
for(i=0;i<4;i++) //扫描4行
{
P0=m; //从P0.4=0(第一行)开始扫描
if(KEY_A==0) //列1有效
{
h=h+1; //算出列1键盘值
flag0=1;
while(KEY_A==0) //等待按键松开
11楼:>>参与讨论
作者:fushaobing于2005-4-15 17:32:00发布:
--------------------------------------------------------------------------------
TO xwj:
你的意思是不是这样:把键盘扫描放在定时中断子程序中(定时周期约10ms),可以用两次中断的时间间隔来去抖动,可以引入“键龄”的概念来实现连击的处理(在中断中使键龄减1)。例如,如果设“键龄=25”,则每25*10=250ms操作一次按键。
c语言按键防抖程序,按键防抖处理程序
c语⾔按键防抖程序,按键防抖处理程序按键防抖处理程序来源:--作者:--浏览:1628时间:2016-08-10 14:18标签:摘要:/***************************************************** 本程序的⽬标是这样的: 1:不使⽤INTn中断功能,按键接在普通IO上 2:由定时器T/C2每隔⼀段时间检测按键⼀次, 并具有防抖动功能 3:每点击按键⼀次,在按键松开后,变量A=A+1 4:如果按键按下后不放,则每隔 n/*****************************************************本程序的⽬标是这样的:1:不使⽤INTn中断功能,按键接在普通IO上2:由定时器T/C2每隔⼀段时间检测按键⼀次, 并具有防抖动功能3:每点击按键⼀次,在按键松开后,变量A=A+14:如果按键按下后不放,则每隔 n ms 就做A=A+1运算⼀次5:在按键按下期间,CPU除了处理按键外,还必须能正常运⾏主程序6:本程序的系统时钟是1MHz*****************************************************/ #include#include#include unsigned char A,B;unsigned char n;bit step1, step2, step3,step4; //使⽤⼏个位变量记忆按键状态//***************************************************interrupt [10] void TC2_OVF(void){if(n<255) n++;if(PIND.2==1 && n>8) step1=1; //按键松开⼀定时间后开始进⼊可⽤状态if(PIND.2==0 && step1) {step1=0; step2=1; n=0;} //按键由可⽤状态进⼊到按下状态if(PIND.2==1 && step2) {step2=0; step3=1; n=0;} //按键由按下状态进⼊到松开状态//-------------------------------------------------//按键按下后...if(step2){n++;if(n>60) //如果按下超过⼀定时间{A+=1;n=40;step4=1;}}//-------------------------------------------------if(step3) //按键松开后...{step3=0;if(step4) step4=0; else A+=1;}} //***************************************************//www。
按键消抖原理
按键消抖原理
按键消抖通俗来说就是在按下或松开按键时,由于机械性能的限制,会出现短时间内多次开关状态的变化,这种现象称为按键抖动。
对于需要按键精准响应的电子设备而言,按键抖动会给正常使用带来很大的干扰。
按键消抖的原理是通过软件算法实现。
一般来说,消抖分为两个阶段:第一阶段叫做消除抖动,第二阶段叫做确认有效。
具体做法是在按键按下时,先等待一段时间(一般为几毫秒),然后读取按键的状态。
如果读取到的状态与第一次读取到的状态相同,就确认按键是有效的;如果读取到的状态与第一次不同,则重新进行第一阶段的消抖处理。
按键消抖的实现方法有多种,其中比较常见的是基于中断处理的方法和基于定时器的方法。
基于中断处理的方法是指在按键按下时,通过中断函数来响应按键事件,并进行消抖处理;基于定时器的方法是指通过定时器设定一定时间,在这段时间内进行按键状态的检测和消抖处理。
无论采用哪种方法,按键消抖的原理都是一样的。
综上所述,按键消抖是通过软件算法实现的,可以有效地消除按键抖动对电子设备的干扰。
在实际应用中,需要根据实际情况选择合适的消抖方法和参数,以达到最佳的按键响应效果。
- 1 -。
单片机按键处理技巧及C语言编程方式
单片机按键处理技巧及编程方式在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。
输入可以分很多种情况,譬如有的系统支持PS2键盘的接口,有的系统输入是基于编码器,有的系统输入是基于串口或者USB或者其它输入通道等等。
在各种输入途径中,更常见的是,基于单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘)。
我们这一篇章主要讨论的对象就是基于单个按键的程序设计,以及矩阵键盘的程序编写。
按键检测的原理: 它们和我们的单片机系统的I/O口连接一般如下:对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。
简单分析一下按键检测的原理。
当按键没有按下的时候,单片机I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电平的时候,其值为0(低电平) 。
这样,按键的按下与否,就和与该按键相连的I/O的电平的变化相对应起来。
结论:我们在程序中通过检测到该I/O 口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。
一切看起来很美好,是这样的吗?在我们通过上面的按键检测原理得出上述的结论的时候,那就是现实中按键按下时候的电平变化状态。
我们的结论是基于理想的情况得出来的,而实际中,由于按键的弹片接触的时候,并不是一接触就紧紧的闭合,它还存在一定的抖动,尽管这个时间非常的短暂,但是对于我们执行时间以us为计算单位的微控制器来说,它太漫长了。
因而,实际的波形图应该如下面这幅示意图一样。
这样便存在这样一个问题。
假设我们的系统有这样功能需求:在检测到按键按下的时候,将某个I/O的状态取反。
由于这种抖动的存在,使得我们的微控制器误以为是多次按键的按下,从而将某个I/O的状态不断取反,这并不是我们想要的效果,假如该I/O控制着系统中某个重要的执行的部件,那结果更不是我们所期待的。
虚拟键盘工作原理
在近来剖析Fly Pen笔触式电脑的热潮中,让我们也把目光瞄准另一种设计巧妙的产品——iTech虚拟键盘(Virtual Keyboard),这种产品旨在解决手持设备所面临的文本输入困难问题。
它利用标准键盘(QWERTY)布局的投影来代替实际键盘,用户在敲击这种虚拟键盘时,键盘会自动读取“键击”位置,并转换为真实的输入。
至少就技术层面而言,这是一种相当精巧灵活的东西。
这种虚拟键盘的重量只有3盎司(约合85克)多一点,宽度和长度都仅为1英寸多(1英寸相当于2.54厘米),高度稍超过3.5英寸(约合8.89厘米)。
它直立发射激光光束,可在几乎任何平坦的表面上投影出一个梯形的全尺寸键盘虚拟图像。
制造商表示,这种虚拟键盘每分钟能够处理多达400次键击,电池充电每充满一次后,连续键击时间可达2小时。
这种键盘配有接口适配器线缆,适用于大多数流行PDA;其中一款键盘还支持蓝牙无线连接,从而免除了配备线缆之虞。
在我们进行的次数有限的测试中,该产品工作得出奇地好,其设计似乎考虑得非常全面。
那么,它到底是如何工作的呢?尽管我们的分析常常包含推测成份,但其核心工作原理似乎简单明了——将键盘布局进行投影,并捕获能够帮助确定“输入”内容的图像。
这种虚拟键盘的实现方案内包含一块电路板,电路板两端各配一个激光组件。
其中一个激光二极管(或称半导体激光器)插在电路板顶端,负责将键盘投影到一个平坦的表面上。
而要将复杂得多的QWERTY键盘投影,顶端的这个激光二极管的光束通过衍射光或全息光学原理进行投影,从而产生键盘图像。
个中的光学原理包括把激光二极管的点光源转换为精确的二维图像的显微模式。
新颖的激光指示器就常常利用类似的光学原理来投影一些更奇特的影像,比如心脏、文本消息和微笑的脸庞等,但原理是相同的。
对于设计来说,除了要考虑对图像进行投影,更重要的是要知道按键何时被“按下”。
在设计中,第二个激光器嵌入在到电路板的底端,也就是位于直立式设计方案的底部;它在投影表面上方几毫米处投影出一个隐形的平面。
嵌入式系统下按键操作的软件设计方法
嵌入式系统下按键操作的软件设计方法嵌入式系统键盘软件设计存在3方面问题:软件去抖动、等待按键抬起和连击处理。
1嵌入式系统键盘软件设计的3个问题1.1软件去抖动问题一次完整按键过程的时序波形如图1所示。
当按键未被按下时,单片机端口输入为通过上拉电阻获得的高电平;按下时,端口接至地,端口输入为低电平。
当机械触点断开、闭合时会有抖动,这种抖动对人来说是感觉不到的,但对计算机来说,则是完全可以感应到的。
计算机处理的速度是us级,而机械抖动的时间至少是ms级,对计算机而言,这已是漫长的时间了。
为使单片机能正确地读出端口的状态,对每一次按键只作一次响应,这就必须考虑如何去除抖动的问题。
嵌入式系统一般采用软件延时去除抖动。
软件延时去除抖动其实很简单,就是在单片机获得端口有按键动作时,不是立即认定按键开关已被按下,而是延时10 ms 或更长一段时间后再次检测端口,如果仍为动作电平,则说明按键开关的确按下了,这实际上是避开了按键按下时的抖动时间;而在检测到按键释放后(端口为高)再延时5~10 ms,消除后沿的抖动,然后再对键值处理。
当然,实际应用中对按键的要求也是千差万别,要根据不同的需要来编制处理程序,但以上是软件延时去除抖动的基本原则。
1.2等待按键抬起问题单片机在查询读取按键时,不断地扫描键盘,扫描到有键按下后,进行键值处理。
它并不等待键盘释放再退出键盘程序,而是直接退出键盘程序,返回主程序继续工作。
计算机系统执行速度快,很快又一次执行到键盘程序,并再次检测到键还处于按下的状态,单片机还会去执行键值处理程序。
这样周而复始,按一次按键系统会执行相应处理程序很多次。
而程序员的意图一般是只执行一次,这就是等待按键抬起问题。
通常的解决办法是,当按键抬起后再次按下才再次执行相应的处理程序,等待时间一般在几百ms以上。
通常在软件编程中,当执行完相应处理程序后,要加一个非常大的延时函数,再向下执行。
对于软件去抖动问题和等待按键抬起问题,若采用软件延时,会大大削弱系统的实时性;若采用中断方式延时,会占用定时器,耗费了系统资源,且软件的多任务编程会增大软件设计的复杂度。
macbookair键盘功能介绍全图
MacBook Air 键盘功能介绍全图基础功能介绍MacBook Air 是著名的苹果笔记本系列产品之一,其键盘设计精巧、功能齐全,给用户带来高效的操作体验。
以下是 MacBook Air 键盘常用功能的介绍:1. 字母键区•包含 A-Z 的英文字母键,用于输入文本信息。
2. 数字键区•包含 0-9 的数字键,方便进行数字输入和计算。
3. 功能键•包含Esc、Tab、Shift、Ctrl、Option、Command、Delete 等功能键,用于控制系统和应用程序的各种操作。
常用快捷键介绍MacBook Air 键盘还具有许多方便的快捷键,用户可以通过组合按键实现快速操作:1. 截屏•Command + Shift + 3:截取整个屏幕。
•Command + Shift + 4:截取选定区域。
2. 切换应用程序•Command + Tab:切换到下一个应用程序。
•Command + ~:在当前应用程序的各个窗口之间切换。
3. Spotlight 搜索•Command + 空格键:打开 Spotlight 搜索功能,方便快速查找文件和应用程序。
高级功能介绍除了基础功能和常用快捷键外,MacBook Air 的键盘还具有一些高级功能,提升用户的操作效率:1. 触控板手势•MacBook Air 的触控板支持多指手势操作,如双指滚动、三指拖拽等,可快速浏览网页和文件内容。
2. Touch ID•部分 MacBook Air 机型配备了 Touch ID 指纹识别传感器,用户可以通过指纹解锁、进行支付等操作。
3. 背光键盘•MacBook Air 键盘支持背光功能,用户可以在暗光环境下清晰看到键盘上的按键,提升使用体验。
4. 虚拟键盘•MacBook Air 还提供了虚拟键盘功能,适用于触摸屏幕的操作,方便用户在特定场景下进行输入。
总结综上所述,MacBook Air 键盘功能丰富多彩,不仅包含基础输入功能,还具有丰富的快捷键和高级功能,帮助用户更高效地完成各种操作。
手机按键表面处理工艺
手机按键表面处理工艺导言手机按键的表面处理工艺是指对手机按键外表面进行加工和涂层处理的一项工艺。
表面处理工艺旨在提升按键的滑动感、耐磨性,同时也可以起到美观、防污、防指纹等作用。
在手机设计中,按键是用户与手机之间最直接的接触点,因此其表面处理工艺的质量直接关系到用户体验的好坏。
本文将介绍手机按键表面处理工艺的常见方法和技术。
常见的手机按键表面处理工艺1. 电镀电镀是常见的手机按键表面处理方法之一。
通过将按键放置在含有金属离子的溶液中,并施加电流,金属离子会在按键表面沉积形成一层金属膜。
电镀可以增加按键的外观质感,提升其硬度和耐磨性,同时还可以起到防氧化、防腐蚀等作用。
常见的电镀方法有镍电镀、铬电镀、金电镀等。
2. 钻石切割钻石切割是一种常见的手机按键表面处理技术。
该方法使用以金刚石为主要切割工具,通过切割按键表面形成V形或串珠形状,以提高按键的手感和触摸感。
钻石切割能够使按键的表面规则化、均匀化,并且能够增加按键的防滑性能。
3. 喷砂喷砂是一种以高压喷射磨料颗粒对按键表面进行处理的方法。
通过喷砂,可以在按键表面形成一层细腻、均匀的磨砂质感。
喷砂能够增加按键的防滑性能,同时还能遮盖和修复一些表面缺陷。
4. 涂层涂层是一种常见的手机按键表面处理方式之一。
通过在按键表面涂覆一层特殊的涂料,可以改变按键的外观和手感。
常见的涂层材料有橡胶涂层、橡塑涂层、PU涂层等。
涂层可以提升按键的触感,增加摩擦力,防止污渍和指纹的附着。
5. 印刷印刷是一种常见的手机按键表面处理方法。
通过印刷,可以在按键表面打印图案和文字。
印刷可以对按键进行标识,美化按键的外观,增加其辨识度。
技术进展和挑战手机按键表面处理工艺在过去几年中有了许多技术进展,但也面临一些挑战。
1. 超薄设计如今手机设计趋势向超薄化发展,这给按键的表面处理工艺带来了挑战。
传统的表面处理方法可能导致按键增加厚度,因此需要开发更薄、更轻的表面处理技术。
2. 防指纹和防污由于触摸屏的广泛应用,手机按键容易受到指纹和污渍的污染。
单片机按键去抖动程序设计思路
单片机按键去抖动程序设计思路
1.去抖动原理:按键在按下和松开的瞬间会产生震动,导致按键信号在短时间内出现多次转换,给程序带来困扰。
为了解决这个问题,需要对按键信号进行去抖动处理,即在按键按下和松开时,只记录一次按键状态变化。
2.软件去抖动方法:软件去抖动方法主要通过软件延时来判断按键信号是否稳定。
具体来说,可以通过以下步骤实现软件去抖动:-初始化按键引脚为输入模式,并使能内部上拉电阻;
-设定一个延时时间阈值t,用于判断按键是否稳定;
-读取按键引脚的电平,如果为低电平,说明按键按下;
-进入一个循环,每次循环读取一次按键引脚的电平,并与前一次读取的电平进行比较;
-如果连续读取到的电平与前一次相同,说明按键信号稳定;
-如果连续读取到的电平与前一次不同,则说明按键信号还在抖动,继续读取直到连续读取到的电平与前一次相同;
-当稳定的电平持续时间超过延时时间阈值t时,认为按键信号已稳定,可以进行相应的处理。
3. 硬件去抖动方法:硬件去抖动方法主要通过电路设计来实现。
常见的硬件去抖动电路包括RC滤波电路和Schmitt触发器电路。
其中,RC 滤波电路利用电容和电阻的特性,对按键信号进行平滑处理;Schmitt触发器电路则通过正反馈的方式,将不稳定的信号转换为稳定的信号。
这两种方法可以根据实际需求选择。
总结:
按键去抖动程序设计可以通过软件去抖动和硬件去抖动两种方式实现。
软件去抖动主要通过软件延时判断按键信号是否稳定,而硬件去抖动则通
过电路设计实现。
根据具体的应用场景和需求,可以选择适合的方法来设
计按键去抖动程序。
按键处理的几种方法
新型的按键扫描程序核心算法:unsigned char Trg;unsigned char Release;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1 读键值Trg = ReadData & (ReadData ^ Cont); // 2 得到按下触发值Release=(ReadData^Trg^Cont); //3 得到释放触发值Cont = ReadData; //4 得到所有未释放的键值}下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
3:算法2,用来计算连续变量。
我们最常用的按键接法如下:A VR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。
那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。
下面就看看具体几种情况之下,这算法是怎么一回事。
(1)没有按键的时候端口为0xff,ReadData读端口并且取反,很显然,就是0x00 了。
Trg = ReadData & (ReadData ^ Cont); (初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。
Cont = ReadData; 保存Cont 其实就是等于ReadData,为0;结果就是:ReadData =0;Trg =0;Cont =0;(2)第一次PB0按下的情况端口数据为0xfe,ReadData读端口并且取反,很显然,就是0x01 了。
Trg = ReadData & (ReadData ^ Cont); 因为这是第一次按下,所以Cont是上次的值,应为为0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
新型的按键扫描程序不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。
我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。
因为这是实际项目中总结出来的经验,学校里面学不到的东西。
以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。
当然,我自己也是在多个项目用过,效果非常好的。
好了,工程人员的习惯,废话就应该少说,开始吧。
以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。
用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。
核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1 对变量PINB取反.一个数和1异或相当于取反和零异或不变Trg = ReadData & (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。
有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
3:算法2,用来计算连续变量。
看到这里,有种“知其然,不知其所以然”的感觉吧?代码很简单,但是它到底是怎么样实现我们的目的的呢?好,下面就让我们绕开云雾看青天吧。
我们最常用的按键接法如下:AVR是有内部上拉功能的,但是为了说明问题,我是特意用外部上拉电阻。
那么,按键没有按下的时候,读端口数据为1,如果按键按下,那么端口读到0。
下面就看看具体几种情况之下,这算法是怎么一回事。
(1)没有按键的时候端口为0xff,ReadData读端口并且取反,很显然,就是0x00 了。
Trg = ReadData & (ReadData ^ Cont); (初始状态下,Cont也是为0的)很简单的数学计算,因为ReadData为0,则它和任何数“相与”,结果也是为0的。
Cont = ReadData; 保存Cont 其实就是等于ReadData,为0;结果就是:ReadData =0;Trg =0;Cont =0;(2)第一次PB0按下的情况端口数据为0xfe,ReadData读端口并且取反,很显然,就是0x01 了。
Trg = ReadData & (ReadData ^ Cont); 因为这是第一次按下,所以Cont是上次的值,应为为0。
那么这个式子的值也不难算,也就是Trg = 0x01 & (0x01^0x00) = 0x01Cont = ReadData = 0x01;结果就是:ReadData =0x01;Trg =0x01;Trg只会在这个时候对应位的值为1,其它时候都为0Cont =0x01;(3)PB0按着不松(长按键)的情况端口数据为0xfe,ReadData读端口并且取反是0x01 了。
Trg = ReadData & (ReadData ^ Cont); 因为这是连续按下,所以Cont是上次的值,应为为0x01。
那么这个式子就变成了Trg = 0x01 & (0x01^0x01) = 0x00Cont = ReadData = 0x01;结果就是:ReadData =0x01;Trg =0x00;Cont =0x01;因为现在按键是长按着,所以MCU会每个一定时间(20ms左右)不断的执行这个函数,那么下次执行的时候情况会是怎么样的呢?ReadData =0x01;这个不会变,因为按键没有松开Trg =ReadData & (ReadData ^ Cont) =0x01 & (0x01 ^ 0x01) = 0 ,只要按键没有松开,这个Trg值永远为0Cont =0x01;只要按键没有松开,这个值永远是0x01!!(4)按键松开的情况端口数据为0xff,ReadData读端口并且取反是0x00 了。
Trg = ReadData & (ReadData ^ Cont) = 0x00 & (0x00^0x01) = 0x00Cont = ReadData = 0x00;结果就是:ReadData =0x00;Trg =0x00;Cont =0x00;很显然,这个回到了初始状态,也就是没有按键按下的状态。
总结一下,不知道想懂了没有?其实很简单,答案如下:Trg 表示的就是触发的意思,也就是跳变,只要有按键按下(电平从1到0的跳变),那么Trg在对应按键的位上面会置一,我们用了PB0则Trg的值为0x01,类似,如果我们PB7按下的话,Trg 的值就应该为0x80 ,这个很好理解,还有,最关键的地方,Trg 的值每次按下只会出现一次,然后立刻被清除,完全不需要人工去干预。
所以按键功能处理程序不会重复执行,省下了一大堆的条件判断,这个可是精粹哦!!Cont代表的是长按键,如果PB0按着不放,那么Cont的值就为0x01,相对应,PB7按着不放,那么Cont的值应该为0x80,同样很好理解。
如果还是想不懂的话,可以自己演算一下那两个表达式,应该不难理解的。
因为有了这个支持,那么按键处理就变得很爽了,下面看应用:应用一:一次触发的按键处理假设PB0为蜂鸣器按键,按一下,蜂鸣器beep的响一声。
这个很简单,但是大家以前是怎么做的呢?对比一下看谁的方便?#define KEY_BEEP 0x01void KeyProc(void){if (Trg & KEY_BEEP) // 如果按下的是KEY_BEEP{Beep(); // 执行蜂鸣器处理函数}}怎么样?够和谐不?记得前面解释说Trg的精粹是什么?精粹就是只会出现一次。
所以你按下按键的话,T rg & KEY_BEEP 为“真”的情况只会出现一次,所以处理起来非常的方便,蜂鸣器也不会没事乱叫,h oho~~~或者你会认为这个处理简单,没有问题,我们继续。
应用2:长按键的处理项目中经常会遇到一些要求,例如:一个按键如果短按一下执行功能A,如果长按2秒不放的话会执行功能B,又或者是要求3秒按着不放,计数连加什么什么的功能,很实际。
不知道大家以前是怎么做的呢?我承认以前做的很郁闷。
但是看我们这里怎么处理吧,或许你会大吃一惊,原来程序可以这么简单这里具个简单例子,为了只是说明原理,PB0是模式按键,短按则切换模式,PB1就是加,如果长按的话则连加(玩过电子表吧?没错,就是那个!)#define KEY_MODE 0x01 // 模式按键#define KEY_PLUS 0x02 // 加void KeyProc(void){if (Trg & KEY_MODE) // 如果按下的是KEY_MODE,而且你常按这按键也没有用,{ //它是不会执行第二次的哦,必须先松开再按下Mode++; // 模式寄存器加1,当然,这里只是演示,你可以执行你想// 执行的任何代码}if (Cont & KEY_PLUS) // 如果“加”按键被按着不放{cnt_plus++; // 计时if (cnt_plus > 100) // 20ms*100 = 2S 如果时间到{Func(); // 你需要的执行的程序}}}不知道各位感觉如何?我觉得还是挺简单的完成了任务,当然,作为演示用代码。
应用3:点触型按键和开关型按键的混合使用点触形按键估计用的最多,特别是单片机。
开关型其实也很常见,例如家里的电灯,那些按下就不松开,除非关。
这是两种按键形式的处理原理也没啥特别,但是你有没有想过,如果一个系统里面这两种按键是怎么处理的?我想起了我以前的处理,分开两个非常类似的处理程序,现在看起来真的是笨的不行了,但是也没有办法啊,结构决定了程序。
不过现在好了,用上面介绍的办法,很轻松就可以搞定。
原理么?可能你也会想到,对于点触开关,按照上面的办法处理一次按下和长按,对于开关型,我们只需要处理Cont就OK了,为什么?很简单嘛,把它当成是一个长按键,这样就找到了共同点,屏蔽了所有的细节。
程序就不给了,完全就是应用2的内容,在这里提为了就是说明原理~~好了,这个好用的按键处理算是说完了。
可能会有朋友会问,为什么不说延时消抖问题?哈哈,被看穿了。
果然不能偷懒。
下面谈谈这个问题,顺便也就非常简单的谈谈我自己用时间片轮办法,以及是如何消抖的。
延时消抖的办法是非常传统,也就是第一次判断有按键,延时一定的时间(一般习惯是20ms)再读端口,如果两次读到的数据一样,说明了是真正的按键,而不是抖动,则进入按键处理程序。
当然,不要跟我说你delay(20)那样去死循环去,真是那样的话,我衷心的建议你先放下手上所有的东西,好好的去了解一下操作系统的分时工作原理,大概知道思想就可以,不需要详细看原理,否则你永远逃不出“菜鸟”这个圈子。
当然我也是菜鸟。
我的意思是,真正的单片机入门,是从学会处理多任务开始的,这个也是学校程序跟公司程序的最大差别。
当然,本文不是专门说这个的,所以也不献丑了。
我的主程序架构是这样的:volatile unsigned char Intrcnt;void InterruptHandle() // 中断服务程序{Intrcnt++; // 1ms 中断1次,可变}void main(void){SysInit();while(1) // 每20ms 执行一次大循环{KeyRead(); // 将每个子程序都扫描一遍KeyProc();Func1();Funt2();……while(1){if (Intrcnt>20) // 一直在等,直到20ms时间到{Intrcnt="0";break; // 返回主循环}}}}貌似扯远了,回到我们刚才的问题,也就是怎么做按键消抖处理。