独立按键连按和长按处理技巧
第十一节:同一个按键短按与长按的区别触发

第十一节:同一个按键短按与长按的区别触发开场白:上一节讲了类似电脑键盘组合按键触发的功能,这节要教会大家一个知识点:如何在上一节的基础上,略作修改,就可以实现同一个按键短按与长按的区别触发。
具体内容,请看源代码讲解。
(1)硬件平台:基于朱兆祺51单片机学习板。
用矩阵键盘中的S1和S5号键作为独立按键,记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。
(2)实现功能:两个独立按键S1和S5,按住其中一个按键,在短时间内松手,则认为是短按,触发蜂鸣器短鸣一声。
如果一直按住这个按键不松手,那么超过规定的长时间内,则认为是长按,触发蜂鸣器长鸣一声。
(3)源代码讲解如下:#include "REG52.H"#define const_voice_short 20 //蜂鸣器短叫的持续时间#define const_voice_long 140 //蜂鸣器长叫的持续时间/* 注释一:* 调整抖动时间阀值的大小,可以更改按键的触发灵敏度。
* 去抖动的时间本质上等于累计定时中断次数的时间。
*/#define const_key_time_short1 20 //短按的按键去抖动延时的时间#define const_key_time_long1 400 //长按的按键去抖动延时的时间#define const_key_time_short2 20 //短按的按键去抖动延时的时间#define const_key_time_long2 400 //长按的按键去抖动延时的时间void initial_myself();void initial_peripheral();void delay_long(unsigned int uiDelaylong);void T0_time(); //定时中断函数void key_service(); //按键服务的应用程序void key_scan(); //按键扫描函数放在定时中断里sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平sbit beep_dr=P2^7; //蜂鸣器的驱动IO口unsigned char ucKeySec=0; //被触发的按键编号unsigned int uiKeyTimeCnt1=0; //按键去抖动延时计数器unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志unsigned char ucShortTouchFlag1=0; //短按的触发标志unsigned int uiKeyTimeCnt2=0; //按键去抖动延时计数器unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志unsigned char ucShortTouchFlag2=0; //短按的触发标志unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时间计数器void main(){initial_myself();delay_long(100);initial_peripheral();while(1){key_service(); //按键服务的应用程序}}void key_scan()//按键扫描函数放在定时中断里{/* 注释二:* 长按与短按的按键扫描的详细过程:* 第一步:平时只要按键没有被按下时,按键的自锁标志,去抖动延时计数器一直被清零。
单片机按键连按长按汇编程序

单片机按键连按长按汇编程序;=============================================================== ;程序编写人:兰建文;编写地点:51hei培训机构;时间:6月7日下午星期日;功能:本程序实现P0口的对2个数码管显示0到99,一个按键实现一次;按键只递加1次,到99回到0,按着不动不影响数码管动态显示;任何时;刻,任何一个按键,若按键连续按键3次,每次间隔时间不大于1秒,循;环显示0到9回到0。
若间隔时间大于1秒,显示加1,低电平亮;P2口实现对数码管的片选功能;=============================================================== ;==========================系统程序============================= ;=========================开始初始化============================ SHUCHU EQU P0 ;定义P0口为输出口PIANXUAN EQU P2 ;定义P2口为片选口SHUZI EQU 30H ;设置处理数据存放地址JIANBIT0 BIT 20H.0 ;设置按键标志位XIAN0 BIT 20H.2 ;显示标志位T_BIT BIT 21H.0 ;设置中断定时器0标志位LIANAN BIT 20H.1 ;设置连按标志位BIT4 BIT 20H.2MODE EQU 01HSHU EQU 40H;========================程序开始==============================ORG 00H ;程序开始LJMP START ;跳到STARTORG 0BH ;中断定时器0入口地址JMP T0_1 ;跳到定时器0服务程序ORG 0030H ;入口地址;=========================主程序=============================== START:MOV SP,#60H ;移开指针MOV SHUZI,#00 ;数据初始化MOV DPTR,#TAB ;查表初始化MOV P1,#0F8H ;设置P1.0口为输入CALL INIT ;开中断CLR JIANBIT0 ;按键标志位清0CLR LIANAN ;连按标志位清0CLR BIT4SETB T_BIT ;中断标志位置1MOV SHU,#0MOV R2,#0MOV R3,#0MOV R4,#0MOV R5,#200MAIN:JNB T_BIT,MAIN ;等待中断CLR T_BIT ;中断标志位清0JB BIT4,VVINC R3CJNE R3,#25,XXMOV R3,#00MOV R2,#0JMP DDXX:CJNE R2,#3,VVSETB LIANANMOV R2,#00DD:CLR BIT4VV:JB LIANAN,XUNHUAN ;判断是否有连按CC:CALL JISUAN ;计算分离十位和个位CALL DISPLAY ;显示个位和十位JNB JIANBIT0,PANDUAN;按键标志位=1判断P1.3口,若为0则判断按键是否抬起JNB P1.3,XIANSHI0 ;若没抬起(P1.3=0)则调到XIANSHI0 SETB BIT4INC R2MOV R3,#0CLR JIANBIT0 ;按键标志位清0CLR XIAN0 ;显示标志位清0JMP MAIN ;返回MAINPANDUAN:JB P1.3,MAIN ;若按键抬起则返回MAIN,若没有抬起按键标志位清0 SETB JIANBIT0JMP MAINXIANSHI0:JB XIAN0,MAINSETB XIAN0 ;显示标志位清0CALL JIACHULI ;加处理JMP MAINXUNHUAN:MOV A,SHUCJNE A,#10,KKKMOV SHU,#0CLR LIANANMOV A,SHUKKK: MOVC A,@A+DPTR ;查表MOV SHUCHU,AMOV PIANXUAN,#05INC R4CJNE R4,#50,OUTTINC SHUMOV R4,#0OUTT:JMP MAIN;====================定时中断0服务子程序======================== ;输入:无;输出:无;实现的功能:实现定时20MS,影响标志位T_BIT;=============================================================== T0_1:MOV TMOD,#MODE ;定时器1工作方式1MOV TL0,#0E0H ;设置定时初值MOV TH0,#0B1HSETB T_BIT ;定时标志位清0RETI;========================中断设置子程序========================= ;输入:无;输出:无;实现的功能:初始化设置定时器,设置初值;===============================================================INIT:MOV TMOD,#MODE ;定时器0工作方式1MOV TL0,#0E0HMOV TH0,#0B1HMOV IE,#82H ;开定时器中断0SETB TR0 ;开定时器0RET;========================计算子程序============================= ;输入:30H;输出:"A和B";实现的功能:把30H的数据的十位和个位分离出来;=============================================================== JISUAN:MOV A,SHUZI ;数据放在A中MOV B,#10 ;除数放在B中DIV AB ;商放在A中,余数放在B中RET;========================显示子程序============================= ;输入:"A";输出:"P0口";实现的功能:把A的数输出到P0口显示,十位和个位分开显示;=============================================================== DISPLAY:MOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示十位MOV PIANXUAN,#04H ;片选CALL DELAY ;查表MOV SHUCHU,#0FFH ;关闭数码管MOV A,BMOVC A,@A+DPTR ;查表MOV SHUCHU,A ;显示个位MOV PIANXUAN,#05H ;片选CALL DELAY ;延时MOV SHUCHU,#0FFH ;关闭数码管RET;======================加处理子程序============================= ;输入:无;输出:无;实现的功能:把30H地址加1;=============================================================== JIACHULI:MOV A,SHUZICJNE A,#99,L0 ;若A不等于9,则跳到LL MOV A,#00JMP L1L0:INC A ;自加一L1:MOV SHUZI,ARET;========================延时程序===============================;输入;无;输出: 无;实现的功能:延时一段时间;=============================================================== DELAY:MOV R6,#80L7:MOV R7,#80L8:DJNZ R7,L8DJNZ R6,L7RET;=====================共阳查表数据============================== TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;=======================程序结束================================ END一个按键控制一个灯,要求按一下按键,灯亮一直亮,再按一下按键灯灭,要带按键的去抖程序。
电脑单手键盘使用技巧

电脑单手键盘使用技巧现代人的工作和生活中离不开电脑,而电脑键盘是我们使用电脑的主要工具之一。
很多人习惯使用两手操作键盘,但有些情况下我们可能需要用单手操作键盘,比如一只手受伤或被占用,这时候掌握一些单手键盘使用技巧就变得很有必要了。
下面我将介绍一些常用的单手键盘使用技巧。
首先,我们需要了解电脑键盘的布局。
大部分电脑键盘的布局基本相同,由字母键、数字键、功能键、光标键等组成。
学会掌握键盘布局是使用单手键盘的基础。
其次,我们需要熟悉一些单手键盘的操作方式。
通常来说,我们可以使用大拇指操作空格键、小拇指操作Ctrl键,其余的字母、数字和功能键可以使用其他手指操作。
通过这种方式,我们可以实现用一只手完成绝大部分操作。
接下来介绍一些常用的单手键盘使用技巧:1. 使用Shift键:在单手操作键盘时,我们通常需要使用Shift键来进行大写字母、标点符号、特殊字符等的输入。
我们可以使用大拇指操作Shift键,然后使用其他手指操作需要输入的字符,这样就可以实现单手打字。
2. 使用组合键:在单手操作键盘时,我们可以使用组合键来实现一些常用的快捷键。
比如,Ctrl+C复制、Ctrl+V粘贴、Ctrl+Z撤销等。
我们可以使用小拇指操作Ctrl键,然后使用其他手指操作需要的键,从而实现这些快捷键的使用。
3. 使用辅助工具:还有一些辅助工具可以帮助我们更方便地使用单手键盘。
比如,可以使用单手键盘软件来重新映射键盘布局,将常用的按键集中在一个手指容易操作的位置。
另外,一些特殊设计的单手键盘也可以提供更好的单手操作体验。
最后,特别提醒大家,在学习使用单手键盘技巧的同时,一定要保持正确的坐姿和手部动作,避免出现手部疲劳和损伤。
使用单手键盘虽然可以解决一些特殊情况下的需要,但长期使用单手键盘可能会给身体带来一定的负担,因此还是要适量使用,避免过度依赖。
总之,掌握一些单手键盘使用技巧对于我们应对特殊情况下的需要是非常有帮助的。
通过熟悉键盘布局、学会使用组合键和辅助工具,我们可以轻松地用一只手完成电脑操作。
51单片机独立按键工作原理

51单片机独立按键工作原理
51单片机独立按键是单片机常用的一种输入方式,其工作原理主要包
括按键输入、按键扫描和按键判断三个部分。
一、按键输入
在51单片机独立按键的输入中,按键一般都是使用电子开关实现的。
当按下按键时,电子开关会闭合,形成一条通路。
通路中的电流会使
得连接在单片机输入引脚上的电容充电,使得电容电压迅速上升。
二、按键扫描
在51单片机独立按键的输入过程中,按键的状态需要被单片机不断地
进行扫描。
为了使得扫描的速度变快,通常会将扫描的引脚定义为优
先级较高的中断引脚。
因此,当按键按下的时候,单片机会处理中断
请求,并在相应的寄存器中保存按键的状态。
三、按键判断
在51单片机独立按键输入的最后一步,就是根据按键的状态来判断其
具体的操作。
这个判断过程需要我们设置一个合适的延迟时间,以保
证扫描程序不会出现错误。
总之,51单片机独立按键的工作原理包括按键输入、按键扫描和按键
判断三个部分。
这个过程中,电子开关的闭合和断开会形成一条通路,将电容充电,引脚定义为中断引脚,优先级较高。
最后,根据按键的
状态进行相应的判断来完成各种不同的操作。
win10系统键盘长按变连击怎么办?键盘长按变成连点的解决办法

5、找到使用筛选键。 6、将其按钮关闭即可。
7、如果还是无效,可能是键盘损坏导致。 以上就是键盘长按变连击问题的原因分析以及解决办法,希望大家喜欢,请继续关注。
有的朋友们可能还不会下面小编就给大家带来win10笔记本电脑开启关闭键盘背光灯的方法一起来看看吧
win10系 统 键 盘 长 按 变 连 击 怎 么 办 ? 键 盘 长 按 变 成 连 点 的 解 决 办 法
键盘长按一个键,然而却连击其实是开启了筛选键,该怎么设置呢?下面我们就来看看详细的教程。
1、点击左下角的开始按钮。
iphone(各种组合键)使用技巧

虽然表面上iPhone按键只有一个HOME键,大部分操作都依赖触摸屏。
但是挡不住各种组合:Power键+Home键的组合,短按、长按、按住并保持、双击、下拉、向左向右滑动、点击顶部状态条等等,不全的地方欢迎大家补充…一、开关机关机:在iPhone开机状态下,按Power键3秒出现关机滑块,滑动关机.开机:在iPhone关机状态下,按Power键1秒出现苹果LOGO,开始启动.自动关机:在iPhone开机状态下,同时按Power键+Home键保持7秒(期间会出现关机滑块的),自动关机.唤醒:在待机锁定黑屏状态下,按一下Power键或Home键,都可唤醒iPhone而来到锁屏状态.二、屏幕截图开机状态下,同时按Power键+Home键,然后同时松开,屏幕白了一下并听到照相的“喀嚓”声,这时你iPhone当前的屏幕已经被快照到照片库中.你可以打开iPhone的图片程序查看了.也可以连接电脑在资源管理器中出现的iPhone相机中拷贝出来或删除.三、退出软件退出运行的软件:在软件运行状态下(未锁屏时),按一下Home键,回到桌面.强制退出运行的软件:在软件运行状态下(未锁屏时),按Home键8秒,回到桌面.此法可用在软件死掉的时候.四、音乐播放在锁屏状态下连按Home键,会出现iPod的简单控制(播放、停止、上一首和下一首).在未锁屏状态下连按Home键,会进入电话个人收藏或者是iPod,可以在设置→通用→主屏幕按钮中进行设置.晃动iPhone随机播放音乐.原装的耳机上,按一下暂停,两下连按快进,三下连按后退倒歌.按住不动是同一首歌里前进快退五、电话拒接来电:电话来时双击电话顶部POWER键即可拒接来电静音处理:按一下音量键或按一下POWER键,来电会继续,但铃声变静音了.锁屏状态下长按Home键打开语音控制,可以语音拨号或者播放歌曲等;线控接听:原装的耳机上,按下中央按钮一次以接听来电。
再次按下中央按钮以结束通话;线控挂断:按住中央按钮大约两秒钟,然后松开。
多个按键实现短按+双击+长按

DUTY-=9;
}else
//单击
{
if(Key.Trg)//产生下降沿
DUTY--;//变量进行一次++
}
Key.IdleCnt=0;//不管是否为双击都要把空闲计数器清掉
stState=2;
{
Key.PressCnt=CNT_MAX;
DUTY++;
}
//双击
if(stState==1&&Key.IdleCnt<IDLE_CNT_MAX&&Key.IdleCnt>0)//上次按下的是这个键,这次按下的还是这个键,而且按下的时间间歇时间很短
break;
case KEY2://减
{
Key.PressCnt++;
if(Key.PressCnt>=CNT_MAX)
{
Key.PressCnt=CNT_MAX;
DUTY--;
}
if(stState==2&&Key.IdleCnt<IDLE_CNT_MAX&&Key.IdleCnt>0)//上次按下的是这个键,这次按下的还是这个键,而且按下的时间间歇时间很短
Key.State = Key.Read;
switch(Key.State)
{
case KEY1:
{
Key.PressCnt++; //下降沿之后进行累加计数
//长按
if(Key.PressCnt>=CNT_MAX )//一直按下,变量一直累加
typedef struct
按键处理的几种方法

新型的按键扫描程序核心算法: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,用来计算连续变量。
我们最常用的按键接法如下: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 了。
单片机按键单击双击长按功能实现

单片机按键单击双击长按功能实现在很多嵌入式系统中,都需要对按键进行检测和处理,以实现不同的功能。
常见的按键功能包括单击、双击和长按。
在这篇文章中,我们将介绍如何使用单片机实现这些按键功能。
首先,我们需要连接一个按键到单片机的I/O口。
按键通常是一个开关,有两个接触点。
当按键按下时,两个接触点会闭合,导致I/O口的电平发生变化。
我们可以利用这个变化来检测按键的状态。
为了实现按键功能,我们需要编写一段程序来监测按键的状态。
以下是一个简单的流程:1.初始化I/O口:将按键连接到I/O口上,并将I/O口设置为输入模式。
2.监测按键状态:定时读取I/O口的电平状态,以检测按键是否按下。
如果I/O口电平发生变化,则按键被按下或松开。
3.单击功能:当按键被按下时,记录当前时间,并等待一段时间,如果超过这段时间,说明按键已松开,则触发单击功能。
4.双击功能:如果在两次按键之间的时间间隔内再次检测到按键按下,则触发双击功能。
5.长按功能:当按键被按下一段较长的时间后,触发长按功能。
下面我们来具体介绍如何实现这些功能。
首先,我们需要初始化单片机的I/O口。
这个过程可以通过配置相应的寄存器实现。
具体的方法和步骤依赖于你使用的单片机型号和开发环境。
在这里,我们不具体展开,而是假设我们已经成功初始化了I/O口。
接下来,我们需要设置一个计时器用于定时检测按键的状态。
计时器的定时周期决定了我们可以检测的最短按键时间间隔。
通常,我们使用一个定时器来实现单击和双击功能,使用另一个定时器来检测长按功能。
一旦我们完成了计时器的配置,我们就可以开启定时器中断,并启动计时器。
每当定时器溢出时,中断函数会被触发,我们可以在这个函数中检测按键的状态。
在中断函数中,我们读取I/O口的电平状态,并根据当前的按键状态做出相应的处理。
首先,我们需要检测按键是否按下。
为了防止按键的抖动和误触发,我们使用一个状态机来确定按键的状态。
状态机的状态可以分为按下和松开两种。
单片机独立按键实验报告总结

单片机独立按键实验报告总结本次实验我们使用了单片机进行了独立按键实验,通过学习掌握了单片机输入输出口的基本使用方法以及独立按键的使用方法和技巧。
以下是本次实验的总结:一、实验内容本次实验的主要内容是独立按键的使用方法和技巧。
通过学习,我们掌握了独立按键的接法原理和基本应用方法。
在实验中,我们首先通过理论学习了按键的工作原理,了解了按键在电路中的应用和接法方法,然后实际动手进行了按键电路的搭建和单片机程序的编写,最后进行了按键测试和实验结果分析。
二、实验步骤1.理论学习:首先,我们学习了独立按键的工作原理和接法原理,了解按键在电路中的应用和接法方法,掌握了按键接口的输入输出方式,并对具体实现过程和技巧进行了分析和探讨。
2.电路搭建:根据学习到的按键接法原理和电路图,我们使用面包板和导线搭建了独立按键电路,将按键连接到单片机的输入端口上,并设置相应的电阻来保护电路和单片机芯片。
3.程序编写:通过阅读单片机说明书和参考其他资料,我们学习了单片机输入输出口的基本使用方法和指令,编写了程序代码,实现了独立按键操作的功能。
我们实现了多种按键操作方式,包括单击、长按等方式,并添加了相应的提示和保护措施,以确保程序的可靠性和稳定性。
4.测试实验:最后,我们进行了独立按键测试实验,通过按键操作,观察测试实验结果,进行了数据分析和结论汇总。
实验结果表明,我们的按键电路和程序代码都实现了预期的功能和效果,证明了我们在实验中掌握的独立按键技巧和方法是正确和有效的。
三、实验结论通过本次实验,我们掌握了单片机输入输出口的基本使用方法和独立按键的使用方法和技巧,了解了按键在电路中的应用和接法方法,探索了独立按键实现的多种方式和技巧,提高了我们的电路设计能力和程序设计能力。
同时,本次实验还加强了我们的实验动手操作能力,增强了我们的实际应用能力和创新思维能力,为我们以后的学习和工作打下了坚实的基础。
单片机按键单击、双击、长按功能实现

单片机按键单击、双击、长按功能实现由于项目产品的需要,只能设置一个按键,但是需要实现短按(即单击)切换工作模式、长按开关机、双击暂停等复用功能。
下图是三种情况下的按键波形。
按键未按下时是高电平,按下去是低电平。
按键单击时,判断时间门槛设置为50~2000ms;长按门槛为持续按下2000ms。
双击可以视为时间间隔很短的俩次有效单击,从第一次单击上升沿到第二次单击上升沿延时门槛为100~500ms。
按键单击按键长按按键双击在STM8单片机上面实现代码为://按键按下去会出现下降沿,设置按键IO口GPIOB4所在的外部端口B下降沿触发中断void exit_init(void){EXTI_DeInit();EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB,EXTI_SENSITIVITY_FALL_ONLY);}//按键按下中断服务程序INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4){if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//是按键下降沿{key_fall_flag = 1;//生成按键按下标志}}//周期1ms的定时器中断服务程序INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23){if(key_fall_flag==1)//发生按键按下事件{if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//按键持续按下{if(key_holdon_ms <= 2000){key_holdon_ms++;}else //按键按下到2000ms就判断长按时间成立,生成长按标志{key_holdon_ms = 0;short_key_flag=0;//清短按键标志key_long_down = 1;//长按键标志置位key_fall_flag = 0;//清按键按下标志}}else //按键抬起{if(key_holdon_ms>50)//按下时间大于50ms,生成单击标志{key_holdon_ms=0;short_key_flag=1;key_long_down =0;key_fall_flag=0;//距离上次单击时间在100~500ms之间,则认为发生连击事件if(keyupCnt>100 && keyupCnt<500){doubleClick = TRUE;short_key_flag=0;}keyUpFlag = TRUE;//单击抬起按键后,生成按键抬起标志}else //按键持续时间小于50ms,忽略{key_holdon_ms=0;short_key_flag=0;long_key_flag=0;key_fall_flag=0;}}}if(keyUpFlag)//单击抬起后,启动计数,计数到500ms keyupCnt++;if(keyupCnt>500){keyupCnt = 0;keyUpFlag = FALSE;}}。
独立按键

软件消抖
if(k1==0) //检测按键K1是否按下 { delay(1000); //消除抖动 一般大约10ms if(k1==0) //再次判断按键是否按下 { 语句; }
软件编程
下载程序后按下K1按键可以对D1小灯状态取反。 #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; sbit k1=P3^1; //定义P31口是k1 sbit led=P2^0; //定义P20口是led void delay(u16 i) { while(i--); }
按键处理函数 void keypros() { if(k1==0) //检测按键K1是否按下 { delay(1000); //消除抖动 一般大约10ms if(k1==0) //再次判断按键是否按下 { led=~led; //led状态取反 } while(!k1); //检测按键是否松开 } }
独立按键原理
(2)矩阵按键
为了减少I/O口的占用,通常将按键排列成矩阵 形式,即每条水平和垂直直线在交叉处不直接连通, 而是通过一个按键加以连接。
2. 独立按键原理
按键在闭合和断开时,触点会存在抖动现象。由 于机械触点的弹性作用,一个按键在闭合时不会马上 稳定地接通,断开时不会立即断开。
为了避免这种现象而做的措施就是按键消抖。消抖方法 分为:硬件消抖、软件消抖。
独立按键实验
1.按键介绍
2.独立按键原理 3.编写独立按键控制程序
工程图示按键
键盘的分类
键盘分为编码键盘和非编码键盘。键盘上闭合键的识别由专用源自硬件编码器实现,如计算机键盘。靠软件编
程来识别称为非编码键盘。单片机组成的各系统中,用
一、独立按键检测长按短按

⼀、独⽴按键检测长按短按//长按开关机,短按切换功能//开机状态下,短接按才有效//长按时间到,不需松⼿就动作,便开观察开关机,短按松⼿动作//按键去抖动//关机状态下,5S内⾃动睡眠,按键唤醒bit B_1ms=0;u16 T_5s=0;#define Const_Key_Jitter 40 //抖动计数#define Const_Key_Long 1000 //长按1秒u16 INT1_Cnt=0;bit Short_Click=0;bit Long_Click=0;bit INT1_Lock=0;bit Power_On=0;/*******************************************************当短按有效时,继续计数,满⾜长按条件⾃锁松⼿解锁短按为松⼿后判断长按不需要松⼿就有效*******************************************************/void Key_Scan(){if(INT1==1){INT1_Cnt=0; //按下计数清0if(INT1_Lock==1) //长按锁标志{INT1_Lock=0;}else if (Short_Click==1&&(Power_On==1)) //短按标志且电源开启{Short_Click=0;BLUE=~BLUE;}}else if(INT1_Lock==0) //有键按下,且⾃锁标志为0,即第⼀次按下{INT1_Cnt++;if(INT1_Cnt>=Const_Key_Jitter){Short_Click=1; //短按有效标志}if(INT1_Cnt>=Const_Key_Long) //说明是长按,开⾃锁{INT1_Lock=1; //长按锁住//INT1_Cnt=0;Short_Click=0;Power_On=~Power_On;RED=~RED;}}}void main( ){delay_ms(10);GPIO_Inilize();Timer0_Inilize();Exti_Inilize();TR0=1;EA=1;while(1){if(B_1ms==1){B_1ms=0;if(++T_5s>=5000){T_5s=0;if(INT1&&(Power_On==0)){TR0=0;BLUE=0;RED=0;INT1_Clear(); //清标志IE1=0INT1_Enable(); //使能按键中断EX1=1,⽤于唤醒MCU_POWER_DOWN(); //进⼊睡眠NOP7();}}Key_Scan();}}}/********************* Timer0中断函数定时1ms************************/ void timer0_int (void) interrupt TIMER0_VECTOR{TF0=0;B_1ms=1;}void Ext_INT1 (void) interrupt INT1_VECTOR //进中断时已经清除标志{INT1_Disable(); //关闭按键中断使能TR0=1;}。
键盘操作技巧与快捷键介绍

键盘操作技巧与快捷键介绍在现代社会,计算机已经成为人们生活中不可或缺的一部分。
而在使用计算机的过程中,键盘是我们最常接触的工具之一。
然而,很多人对键盘的使用仍然停留在最基本的层面上,没有发掘出键盘操作的更多潜力。
本文将介绍一些常用的键盘操作技巧和快捷键,帮助读者更高效地使用键盘。
一、基本的键盘操作技巧1.正确的手指位置:键盘上有一些凸起的小点,它们通常出现在F和J键上。
这些小点的作用是帮助你找到正确的手指位置。
当你使用键盘时,应该将双手的食指放在F和J键上,这样可以更快地找到其他键位。
2.使用正确的手指:当你输入文字时,应该尽量使用正确的手指按键。
比如,按下字母键A时,应该使用左手的小指。
这样可以减少手指的移动,提高输入速度。
3.练习触摸打字:触摸打字是指不需要看键盘就能够准确输入文字。
这需要一些练习,但是一旦掌握了这个技巧,你将能够更快地输入文字,而不需要时刻盯着键盘。
二、常用的快捷键介绍1.复制、剪切和粘贴:复制、剪切和粘贴是我们在处理文字时经常使用的操作。
复制是指将选定的内容复制到剪贴板上,剪切是指将选定的内容从原位置剪切到剪贴板上,粘贴是指将剪贴板上的内容粘贴到指定位置。
这些操作可以通过组合使用Ctrl键和C、X、V键来完成。
2.撤销和重做:当我们在编辑文档时,有时会犯一些错误。
撤销操作可以撤销上一步的操作,而重做操作可以恢复上一步被撤销的操作。
在Windows系统中,可以使用Ctrl+Z来撤销操作,使用Ctrl+Y来重做操作。
3.切换窗口:当我们同时打开多个窗口时,切换窗口是一项非常有用的操作。
在Windows系统中,可以使用Alt+Tab来切换窗口。
按住Alt键不放,然后按Tab 键,就可以在不同的窗口之间进行切换。
4.截屏:截屏是指将屏幕上的内容保存为图片。
在Windows系统中,可以使用Print Screen键来进行全屏截图,使用Alt+Print Screen键来进行当前窗口的截图。
独立按键工作原理

独立按键工作原理独立按键是一种称之为“单按键”或“独立按键”的物理按键,它通常是一个小型键盘或电脑键盘上的键,它可以用于激活特定的硬件或软件功能。
独立按键最常用于控制电脑音量,调整电脑屏幕亮度,管理Wi-Fi连接,调节音量,激活键盘静音,切换到模式等。
标题二>独立按键的作用独立按键的最大优点是它可以让用户在操作电脑时快速方便地控制电脑的各个功能,而不用来回切换和点击太多次。
此外,独立按键还可以节省电脑处理器的负担,从而提高电脑的性能。
有了独立按键,用户可以立即做出反应,无需打开任何软件程序或鼠标操作,这就大大提高了用户的操作效率。
标题三>独立按键的工作原理独立按键的工作原理就是将按键的信号转换成电脑可以理解的信号,并且传输给电脑处理器,这是通过一块叫做“键盘控制器”的小电路板来完成的。
当按键被按下时,独立按键控制器立即向电脑发出信号,并识别按键并将其解码,从而传输出电脑可以理解的信号。
一旦电脑接收到了信号,它就会立即执行相应的操作,从而完成用户请求的功能。
标题四>独立按键的种类独立按键有很多种,最常见的有以下几种:键盘按键、鼠标按键、手柄按键、操纵杆按键、触控板按键、触控板按键、滑动开关按键等。
每一种按键都有自己的功能和实现方式,例如,键盘按键可以激活特定的软件程序,鼠标按键可以在屏幕上移动指针,手柄按键则可以控制电脑游戏中的操作,操纵杆按键可以控制电脑操作等。
标题五>独立按键的应用随着科技的进步,独立按键越来越受欢迎,它已经不仅仅用于控制电脑,而且还用于控制各种家用电器,如电视、空调和冰箱等。
它们不仅可以提供多种功能,而且还可以提供便捷的操作方式,让用户更容易使用家用电器。
此外,独立按键还可以应用在许多汽车中,比如可以用于操纵汽车的方向盘,从而让驾驶者更容易控制汽车。
结>以上就是有关独立按键工作原理的介绍,独立按键可以提高电脑的操作效率,节省电脑处理器的负担,同时也可以应用在家用电器和汽车操纵系统中,为生活带来更多的便利。
多功能按键(单击 + 双击 + 长按)

}
break;
}
return key_return;
}
下面,根据程序分析按键事件的反映时间:
1。对于长键,按下超过1s马上响应,反映最快
2。对于双键,第2次按键释放后马上得到反映。
key_m = key_state_0;
}
else
{ // 这里500ms内肯定读到的都是无键事件,因为长键>1000ms,在1s前低层返回的都是无键
........//点亮A_LED,关闭B_LED和C_LED
else if(key == D_key)
........//点亮B_LED,关闭A_LED和C_LED
else if(key == S_key)
特别操作情况定义:
1。短按操作和长按操作间隔<0.5s,以及,长按操作和短按操作间隔<0.5s,均不产生双击事件
2。连续n次(n为奇数)短按操作,且间隔均<0.5s,产生(n-1)/2次双击事件+1次单击事件
3。连续n次(n为偶数)短按操作,且间隔均<0.5s,产生n/2次双击事件
break;
}
return key_return;
}
/*=============
中间层按键处理函数,调用低层函数一次,处理双击事件的判断,返回上层正确的无键、单键、双键、长键4个按键事件。
本函数由上层循环调用,间隔10ms
===============*/
key_state = key_state_3; // 转换到等待按键释放状态
}
break;
case key_state_3: // 等待按键释放状态,此状态只返回无按键事件
独立按键工作原理

独立按键工作原理
独立按键是计算机硬件中一种常见的输入装置,用于向计算机输入信号。
它通常由多个按键组成,每个按键对应一个特定的字符或功能。
独立按键的工作原理比较简单,当按键被按下时,按键上的按钮会和键盘电路发生接触。
这时,电路中会产生一个电流信号,通过电线传输到计算机的主板上。
主板上有一个称为键盘编码器的芯片,它会检测到接收到的电流信号。
根据每个按键的特定编码方式,键盘编码器会将接收到的电流信号转换成对应的字符或功能码。
转换完成后,计算机的操作系统会根据接收到的字符或功能码进行对应的处理。
如果是字符,操作系统会将其传输给应用程序,如文本编辑器,以显示在屏幕上。
如果是功能码,计算机会执行对应的操作,如打开新窗口、关闭程序等。
需要注意的是,独立按键的工作原理和键盘的工作原理有些不同。
键盘通常是以矩阵的形式进行布局,而独立按键则是每个按键都有独立的回路和电路。
这使得独立按键在灵敏度和反应速度上更加优秀,可以满足对输入精度要求较高的用户需求。
总的来说,独立按键的工作原理是通过按键和电路的接触,产生电流信号并传输到计算机主板上,再经过编码器转换成字符或功能码,最终由操作系统进行处理和执行相应的操作。
这样,用户就可以通过独立按键快速、准确地向计算机输入信息。
单片机按键 长按 短按

switch(key_num){
case 1:key_ret = 5;break;
case 2:key_ret = 6;break;
case 3:key_ret = 7;break;
case 4:key_ret = 8;break;
}
}
else{/*短按有效*/
}
ห้องสมุดไป่ตู้}
}
return key_ret;
}
if(key_flag){/*松手*/
key_flag = 0;
switch(key_num){
case 1:key_ret = 1;break;
case 2:key_ret = 2;break;
case 3:key_ret = 3;break;
case 4:key_ret = 4;break;
static bit key_flag = 0;
if((!SET)||(!KUP)||(!KDN)||(!KOK)){/*判断是否有键按下*/
if(++del_count==5){/*计数消抖*/
del_count = 0;
if(++tim_count>4){/*长按识别*/
key_flag = 0;/*短按无效*/
key_flag = 1;/*短按标志位*/
if(!SET)key_num = 1;/*一下用于识别按键*/
if(!KUP)key_num = 2;
if(!KDN)key_num = 3;
if(!KOK)key_num = 4;
单片机按键-长按-短按-连发-双击-抬起-按下

/* 每次定义按键都给出按键编号, 用和按键状态码组成键值 */ /*按键编号定义*/ #define KEY_NUM_ZERO #define KEY_NUM_POWER
((unsigned char)(0x01)) ((unsigned char)(0x02))
/* 按键可以简单分成以下五种状态, 状态和按键编号组合成每个按键 不同状态下的按键值 */ /*按键状态码定义*/ #define KEY_NULL #define SHORT_CLICK #define LONG_CLICK #define DOUBLE_CLICK #define KEY_DOWN #define KEY_UP
(SHORT_CLICK | KEY_NUM_ZERO<<8) (LONG_CLICK | KEY_NUM_ZERO<<8) (DOUBLE_CLICK | KEY_NUM_ZERO<<8) (KEY_DOWN | KEY_NUM_ZERO<<8) (KEY_UP | KEY_NUM_ZERO<<8)
/* 每个按键都包括自己的属性 */ /*按键属性定义*/
typedef struct {
StatEnum_TypeDefstat; unsigned char KeyNum; unsigned short CountMs; unsigned short ShakeTimeMs; unsigned short LongClickTimeMs; unsigned short ContinueSendTimeMs; unsigned short DoubleClickTimeMs; unsigned char (*GetKeyStat)(void); }KeyAttribute_TypeDef;
单片机按键处理技巧及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控制着系统中某个重要的执行的部件,那结果更不是我们所期待的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机按键处理技巧及编程方式2010-10-23 15:01从这一章开始,我们步入按键程序设计的殿堂。
在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。
输入可以分很多种情况,譬如有的系统支持PS2键盘的接口,有的系统输入是基于编码器,有的系统输入是基于串口或者USB或者其它输入通道等等。
在各种输入途径中,更常见的是,基于单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘)。
我们这一篇章主要讨论的对象就是基于单个按键的程序设计,以及矩阵键盘的程序编写。
◎按键检测的原理常见的独立按键的外观如下,相信大家并不陌生,各种常见的开发板学习板上随处可以看到他们的身影。
(原文件名:1.jpg)引用图片总共有四个引脚,一般情况下,处于同一边的两个引脚内部是连接在一起的,如何分辨两个引脚是否处在同一边呢?可以将按键翻转过来,处于同一边的两个引脚,有一条突起的线将他们连接一起,以标示它们俩是相连的。
如果无法观察得到,用数字万用表的二极管挡位检测一下即可。
搞清楚这点非常重要,对于我们画PCB的时候的封装很有益。
它们和我们的单片机系统的I/O口连接一般如下:(原文件名:2.jpg)引用图片对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。
简单分析一下按键检测的原理。
当按键没有按下的时候,单片机I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O 的电平的时候,其值为0(低电平) 。
这样,按键的按下与否,就和与该按键相连的I/O的电平的变化相对应起来。
结论:我们在程序中通过检测到该I/O口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。
一切看起来很美好,是这样的吗?◎现实并非理想在我们通过上面的按键检测原理得出上述的结论的时候,其实忽略了一个重要的问题,那就是现实中按键按下时候的电平变化状态。
我们的结论是基于理想的情况得出来的,就如同下面这幅按键按下时候对应电平变化的波形图一样:(原文件名:3.jpg)引用图片而实际中,由于按键的弹片接触的时候,并不是一接触就紧紧的闭合,它还存在一定的抖动,尽管这个时间非常的短暂,但是对于我们执行时间以us 为计算单位的微控制器来说,它太漫长了。
因而,实际的波形图应该如下面这幅示意图一样。
(原文件名:4.jpg)引用图片这样便存在这样一个问题。
假设我们的系统有这样功能需求:在检测到按键按下的时候,将某个I/O的状态取反。
由于这种抖动的存在,使得我们的微控制器误以为是多次按键的按下,从而将某个I/O的状态不断取反,这并不是我们想要的效果,假如该I/O控制着系统中某个重要的执行的部件,那结果更不是我们所期待的。
于是乎有人便提出了软件消除抖动的思想,道理很简单:抖动的时间长度是一定的,只要我们避开这段抖动时期,检测稳定的时候的电平不久可以了吗?听起来确实不错,而且实际应用起来效果也还可以。
于是,各种各样的书籍中,在提到按键检测的时候,总也不忘说道软件消抖。
就像下面的伪代码所描述的一样。
(假设按键按下时候,低电平有效)If(0 == io_KeyEnter) //如果有键按下了{Delayms(20) ; //先延时20ms避开抖动时期If(0 == io_KeyEnter) //然后再检测,如果还是检测到有键按下{return KeyValue ; //是真的按下了,返回键值}else{return KEY_NULL //是抖动,返回空的键值}while(0 == io_KeyEnter) ; //等待按键释放}乍看上去,确实挺不错,实际中呢?在实际的系统中,一般是不允许这么样做的。
为什么呢?首先,这里的Delayms(20) , 让微控制器在这里白白等待了20 ms 的时间,啥也没干,考虑我在《学会释放CPU》一章中所提及的几点,这是不可取的。
其次while(0 == io_KeyEnter) 所以合理的分配好微控制的处理时间,是编写按键程序的基础。
;更是程序设计中的大忌(极少的特殊情况例外)。
任何非极端情况下,都不要使用这样语句来堵塞微控制器的执行进程。
原本是等待按键释放,结果CPU就一直死死的盯住该按键,其它事情都不管了,那其它事情不干了吗?你同意别人可不会同意◎消除抖动有必要吗?的确,软件上的消抖确实可以保证按键的有效检测。
但是,这种消抖确实有必要吗?有人提出了这样的疑问。
抖动是按键按下的过程中产生的,如果按键没有按下,抖动会产生吗?如果没有按键按下,抖动也会在I/O上出现,我会立刻把这个微控制器锤了,永远不用这样一款微控制器。
所以抖动的出现即意味着按键已经按下,尽管这个电平还没有稳定。
所以只要我们检测到按键按下,即可以返回键值,问题的关键是,在你执行完其它任务的时候,再次执行我们的按键任务的时候,抖动过程还没有结束,这样便有可能造成重复检测。
所以,如何在返回键值后,避免重复检测,或者在按键一按下就执行功能函数,当功能函数的执行时间小于抖动时间时候,如何避免再次执行功能函数,就成为我们要考虑的问题了。
这是一个仁者见仁,智者见智的问题,就留给大家去思考吧。
所以消除抖动的目的是:防止按键一次按下,多次响应。
“从单片机初学者迈向单片机工程师”之KEY主题讨论基于状态转移的独立按键程序设计本章所描述的按键程序要达到的目的:检测按键按下,短按,长按,释放。
即通过按键的返回值我们可以获取到如下的信息:按键按下(短按),按键长按,按键连_发,按键释放。
不知道大家还记得小时候玩过的电子钟没有,就是外形类似于CALL 机(CALL )的那种,有一个小液晶屏,还有四个按键,功能是时钟,闹钟以及秒表。
在调整时间的时候,短按+键每次调整值加一,长按的时候调整值连续增加。
小的时候很好奇,这样的功能到底是如何实现的呢,今天就让我们来剖析它的原理吧。
机,好像是很古老的东西了状态在生活中随处可见。
譬如早上的时候,闹钟把你叫醒了,这个时候,你便处于清醒的状态,马上你就穿衣起床洗漱吃早餐,这一系列事情就是你在这个状态做的事情。
做完这些后你会去等车或者开车去上班,这个时候你就处在上班途中的状态…..中午下班时间到了,你就处于中午下班的状态,诸如此类等等,在每一个状态我们都会做一些不同的事情,而总会有外界条件促使我们转换到另外一种状态,譬如闹钟叫醒我们了,下班时间到了等等。
对于状态的定义出发点不同,考虑的方向不同,或者会有些许细节上面的差异,但是大的状态总是相同的。
生活中的事物同样遵循同样的规律,譬如,用一个智能充电器给你的手机电池充电,刚开始,它是处于快速充电状态,随着电量的增加,电压的升高,当达到规定的电压时候,它会转换到恒压充电。
总而言之,细心观察,你会发现生活中的总总都可以归结为一个个的状态,而状态的变换或者转移总是由某些条件引起同时伴随着一些动作的发生。
我们的按键亦遵循同样的规律,下面让我们来简单的描绘一下它的状态流程转移图。
(原文件名:1.jpg)引用图片下面对上面的流程图进行简要的分析。
首先按键程序进入初始状态S1,在这个状态下,检测按键是否按下,如果有按下,则进入按键消抖状态2,在下一次执行按键程序时候,直接由按键消抖状态进入按键按下状态3,在此状态下检测按键是否按下,如果没有按键按下,则返回初始状态S1,如果有则可以返回键值,同时进入长按状态S4,在长按状态下每次进入按键程序时候对按键时间计数,当计数值超过设定阈值时候,则表明长按事件发生,同时进入按键连_发状态S5。
如果按键键值为空键,则返回按键释放状态S6,否则继续停留在本状态。
在按键连_发状态下,如果按键键值为空键则返回按键释放状态S6,如果按键时间计数超过连_发阈值,则返回连_发按键值,清零时间计数后继续停留在本状态。
看了这么多,也许你已经有一个模糊的概念了,下面让我们趁热打铁,一起来动手编写按键驱动程序吧。
下面是我使用的硬件的连接图。
(原文件名:2.jpg)引用图片硬件连接很简单,四个独立按键分别接在P3^0------P3^3四个I/O上面。
因为51单片机I/O口内部结构的限制,在读取外部引脚状态的时候,需要向端口写1.在51单片机复位后,不需要进行此操作也可以进行读取外部引脚的操作。
因此,在按键的端口没有复用的情况下,可以省略此步骤。
而对于其它一些真正双向I/O口的单片机来说,将引脚设置成输入状态,是必不可少的一个步骤。
下面的程序代码初始化引脚为输入。
void KeyInit(void){io_key_1 = 1 ;io_key_2 = 1 ;io_key_3 = 1 ;io_key_4 = 1 ;}根据按键硬件连接定义按键键值#define KEY_VALUE_1 0x0e#define KEY_VALUE_2 0x0d#define KEY_VALUE_3 0x0b#define KEY_VALUE_4 0x07#define KEY_NULL 0x0f下面我们来编写按键的硬件驱动程序。
根据第一章所描述的按键检测原理,我们可以很容易的得出如下的代码:static uint8 KeyScan(void){if(io_key_1 == 0)return KEY_VALUE_1 ;if(io_key_2 == 0)return KEY_VALUE_2 ;if(io_key_3 == 0)return KEY_VALUE_3 ;if(io_key_4 == 0)return KEY_VALUE_4 ;return KEY_NULL ;}其中io_key_1等是我们按键端口的定义,如下所示:sbit io_key_1 = P3^0 ;sbit io_key_2 = P3^1 ;sbit io_key_3 = P3^2 ;sbit io_key_4 = P3^3 ;KeyScan()作为底层按键的驱动程序,为上层按键扫描提供一个接口,这样我们编写的上层按键扫描函数可以几乎不用修改就可以拿到我们的其它程序中去使用,使得程序复用性大大提高。
同时,通过有意识的将与底层硬件连接紧密的程序和与硬件无关的代码分开写,使得程序结构层次清晰,可移植性也更好。
对于单片机类的程序而言,能够做到函数级别的代码重用已经足够了。
在编写我们的上层按键扫描函数之前,需要先完成一些宏定义。
//定义长按键的TICK数,以及连_发间隔的TICK数#define KEY_LONG_PERIOD 100#define KEY_CONTINUE_PERIOD 25//定义按键返回值状态(按下,长按,连_发,释放)#define KEY_DOWN 0x80#define KEY_LONG 0x40#define KEY_CONTINUE 0x20#define KEY_UP 0x10//定义按键状态#define KEY_STATE_INIT 0#define KEY_STATE_WOBBLE 1#define KEY_STATE_PRESS 2#define KEY_STATE_LONG 3#define KEY_STATE_CONTINUE 4#define KEY_STATE_RELEASE 5接着我们开始编写完整的上层按键扫描函数,按键的短按,长按,连按,释放等等状态的判断均是在此函数中完成。