C51单片机矩阵键盘扫描去抖程序

合集下载

实验一 矩阵键盘检测

实验一  矩阵键盘检测

实验一矩阵键盘检测一、实验目的:1、学习非编码键盘的工作原理和键盘的扫描方式。

2、学习键盘的去抖方法和键盘应用程序的设计.二、实验设备:51/AVR实验板、USB连接线、电脑三、实验原理:键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。

我们可以通过键盘输入数据或命令来实现简单的人机通信。

1、按键的分类一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。

前者造价低,后者寿命长.目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。

按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。

编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别.全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。

非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成.由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。

2、按键的输入原理在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。

也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。

此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。

当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。

因此,键信息输入是与软件结构密切相关的过程。

对于一组键或一个键盘,通过接口电路与单片机相连.单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。

单片机矩阵键盘行列扫描程序学习资料

单片机矩阵键盘行列扫描程序学习资料
switch(key)
{
case 0x7e:P0=dofly[0];break;//0按下相应的键显示相对应的码值
case 0x7d:P0=dofly[1];break;//1
case 0x7b:P0=dofly[2];break;//2
case 0x77:P0=dofly[3];break;//3
case 0xbe:P0=dofly[4];break;//4
case 0xbd:P0=dofly[5];break;//5
case 0xbb:P0=dofly[6];break;//6
case 0xb7:P0=dofly[7];break;//7
case 0xde:P0=dofly[8];break;//8
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
uchar keyscan(void);
void delay(uint i);
void main()
{
uchar key;
P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符
while(1)
{
key=keyscan();//调用键盘扫描,
//行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍

51单片机矩阵键盘程序示例

51单片机矩阵键盘程序示例

;lab5_asm;vol1.0;zqy;2012/2/18;定义初始化LED_CHABIT PSW.5;数码管显示标志位,为1显示十位,为0显示个位;数字0-9ORG 00HJMP STARTORG 000BHJMP INT_T0;转到中断服务程序,更改数码管显示ORG 0100HLED_TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDHDB 0FDH,87H,0FFH,0EFH,0BFHDB 86H,0DBH,0CFH,0E6H,0EDH,0FDHLED_TAB2:DB 0BFH,0BFH,0BFH,0BFH,0BFHDB 0BFH,0BFH,0BFH,0BFH,0BFHDB 86H,86H,86H,86HDB 86H,86H,86HSTART:;工作寄存器和某些数据单元的初始化MOV R0,#0;数码管显示初始化SETB LED_CHAMOVDPTR, #8300H;位选地址赋给DPTR高八位P2口,选中U13锁存器MOVA,#0FEH;位选数据,选中个位数码管,置低为选中MOVX@DPTR, A;位选数据,对片外I/O口的外设芯片访问MOVDPTR,#8200H;段选地址MOVA,#0BFH;段选数据,个位显示0MOVX@DPTR, A;定时器初始化MOV IE,#82H;开启定时器T0中断MOV TMOD,#01H;设定定时器T0为模式1MOV TH0,#0D8HMOV TL0,#0F0H;装入初值,10MS延时12MHZSETB TR0 ;启动定时器T0KEY:;按键处理LCALL KEY_START;调用判断有无键按下子程序JZ KEY;无键按下,重新扫描LCALL KEY_DELAY;有键按下,延时去抖LCALL KEY_STARTJZ KEYLCALL KEY_NEXT;判断哪一个键被按下LCALL DECODE;键值译码LCALL KEY_END;判断按键释放LJMP KEYKEY_START:MOV DPTR, #8000H;键盘地址MOV A,#0F0HMOVX @DPTR,A;行全部输出0NOPNOPNOPMOVX A,@DPTR;扫描键盘CPL A;取正逻辑,1为按下ANL A,#0FHRETKEY_NEXT:MOV R1,#0;扫描行计数器MOV R2,#0;扫描列计数器MOV R3,#0FEH;首行扫描字送R3 MOV DPTR, #8000HMOV A,R3MOVX @DPTR,AMOVX A,@DPTRCPL AANL A,#0FHMOV R4,#4S0123: JNZ SKEY0;不为全0,有键按下;全为0,进行下一行扫描INC R1;行计数器加1MOV A,R3RL AMOV R3,AMOV DPTR,#8000HMOVX @DPTR,ANOPNOPNOPMOVX A,@DPTRCPL AANL A,#0FHDJNZ R4,S0123LJMP KEYEKEY:RETSKEY0:;列号译码JBACC.0,SKEY1JBACC.1,SKEY2JBACC.2,SKEY3JBACC.3,SKEY4SKEY1:MOV A,#00H;存列号0 MOV R2,AAJMP EKEYSKEY2:MOV A,#01H;存列号1 MOV R2,AAJMP EKEYSKEY3:MOV A,#02H;存列号2MOV R2,AAJMP EKEYSKEY4: MOV A,#03H;存列号3 MOV R2,AAJMP EKEYDECODE:;行号在R1,列号在R2;键值译码MOV A,R1MOV B,#04HMUL ABADD A,R2INC AMOV R0,ARETKEY_END:MOV DPTR,#8000H;键盘地址MOVX A,@DPTR;扫描键盘CPL A;取正逻辑,1为按下ANL A,#0FHJNZ KEY_ENDLCALL KEY_DELAYJNZ KEY_ENDRETKEY_DELAY:MOV R5,#10HDS1:MOV R6,#0FFHDS2:NOPDJNZ R6,DS2DJNZ R5,DS1RETINT_T0:;中断服务程序,更改数码管显示MOV R7,AJB LED_CHA,DISP_L;检查数码管显示标志位CPL LED_CHAMOVDPTR, #8200H;段选地址MOV A,#0MOVX @DPTR,AMOVDPTR,#8300H;位选地址赋给DPTR高八位P2口,选中U13锁存器MOVA, #0FEH;位选数据,选中个位数码管,置低为选中MOVX@DPTR, A;位选数据,对片外I/O口的外设芯片访问;判断需要显示的个位数字MOV A,R0NOPMOV DPTR,#LED_TAB1NOPNOPMOVC A,@A+DPTRMOVDPTR, #8200H;段选地址MOVX @DPTR,AJMP INT_EXITDISP_L:CPL LED_CHAMOVDPTR, #8200H;段选地址MOV A,#0MOVX @DPTR,AMOVDPTR,#8300H;位选地址赋给DPTR高八位P2口,选中U13锁存器MOVA, #0FDH;位选数据,选中十位数码管,置低为选中MOVX@DPTR, A;位选数据,对片外I/O口的外设芯片访问;判断需要显示的十位数字0或1MOV A,R0NOPMOV DPTR,#LED_TAB2MOVC A,@A+DPTRMOVDPTR, #8200H;段选地址MOVX @DPTR,AINT_EXIT:MOV IE,#82HMOV TH0,#0D8HMOV TL0,#0F0H;装入初值,10MS延时SETB TR0MOV A,R7MOV DPTR,#8000HRETIEND12MHZ。

51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法

51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法

51单片机矩阵键盘控制数码管显示过程中出现的问题及解决方法在使用51单片机控制矩阵键盘同时驱动数码管显示的过程中,可能会遇到一些常见的问题。

以下是一些可能的问题及相应的解决方法:按键无法正常响应:* 问题可能原因:接线错误、按键损坏、软件扫描不到按键信号。

* 解决方法:检查按键连接是否正确,确保按键没有损坏。

在软件中进行适当的按键扫描,确保能够正确检测到按键的状态。

数码管显示异常或不亮:* 问题可能原因:数码管接线问题、数码管损坏、数码管驱动程序错误。

* 解决方法:仔细检查数码管的接线是否正确,确保数码管没有损坏。

检查数码管的驱动程序,确保它按照正确的顺序和时序进行驱动。

按键重复响应或漏按现象:* 问题可能原因:按键抖动、软件扫描速度过快。

* 解决方法:在软件中增加适当的按键抖动延时,确保在按键按下或抬起时只响应一次。

调整软件扫描速度,避免扫描间隔过短导致的重复响应。

矩阵键盘的多个按键同时按下导致混乱:* 问题可能原因:矩阵键盘硬件连接错误、软件扫描算法问题。

* 解决方法:检查矩阵键盘的硬件连接,确保矩阵行和列没有短路或断路。

调整软件扫描算法,确保同时按下多个按键时能够正确识别。

数码管显示不正常的数字或乱码:* 问题可能原因:程序错误、数码管接线错误。

* 解决方法:仔细检查程序,确保数码管段选和位选的控制逻辑正确。

检查数码管的接线,确保每个数码管的连接都正确。

在解决问题时,建议逐步排除可能的原因,通过调试工具、逻辑分析仪或输出调试信息的方式来定位问题。

另外,仔细查阅51单片机的数据手册和相关文档,以确保硬件连接和软件设计都符合标准。

矩阵键盘扫描的C语言实例

矩阵键盘扫描的C语言实例

矩阵键盘扫描的C语言实例1、按键扫描(线反转)//-------------------------------- ------------------------------------------------------------------// 函数名称:program_SCANkey// 函数功能:程序扫描键盘,// 有键按下完成按键处理,无键按下直接返回//--------------------------------------------------------------------------------------------------void program_SCANkey(){unsigned char key_code;if(judge_hitkey()) //判断是否有键按下{delay(1000); //延时20ms左右,消除抖动干扰if(judge_hitkey()) //判断是否有效按键{key_code=scan_key();//获取键值while(judge_hitkey()); //等待按键释放{}key_manage(key_code); //键盘扫描、键盘散转、按键处理}}}//--------------------------------------------------------------------------------------------------// 函数名称:judge_hitkey// 函数功能://判断是否有键按下,有返回1,没有返回0// 列判断,还可以用行判断。

//--------------------------------------------------------------------------------------------------bit judge_hitkey() //判断是否有键按下,有返回1,没有返回0{unsigned char scancode,keycode;scancode=0x0F; //开始设定P1.0~P1.3输出全1(初值)即表明无键闭合KEY=scancode;keycode=KEY; //读取P1.0~P1.3的真实状态,从而确定有没有键被按下if(keycode==0x0F)return(0); //全1则无键闭合elsereturn(1); //否则有键闭合}//--------------------------------------------------------------------------------------------------// 函数名称:scan_key// 函数功能://扫描键盘,返回键值(高四位代表行,低四位代表列)// 说明:scancode 扫描码,keycode 键值,keycode_line 行,keycode_row 列// 过程:先扫描行,确定那行的按键被按下。

单片机矩阵键盘行列扫描程序

单片机矩阵键盘行列扫描程序

//行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍#include <>//包含头文件#define uchar unsigned char#define uint unsigned intunsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-Fuchar keyscan(void);void delay(uint i);void main(){uchar key;P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符while(1){key=keyscan();//调用键盘扫描,switch(key){case 0x7e:P0=dofly[0];break;//0 按下相应的键显示相对应的码值case 0x7d:P0=dofly[1];break;//1case 0x7b:P0=dofly[2];break;//2case 0x77:P0=dofly[3];break;//3case 0xbe:P0=dofly[4];break;//4case 0xbd:P0=dofly[5];break;//5case 0xbb:P0=dofly[6];break;//6case 0xb7:P0=dofly[7];break;//7case 0xde:P0=dofly[8];break;//8case 0xdd:P0=dofly[9];break;//9case 0xdb:P0=dofly[10];break;//acase 0xd7:P0=dofly[11];break;//bcase 0xee:P0=dofly[12];break;//ccase 0xed:P0=dofly[13];break;//dcase 0xeb:P0=dofly[14];break;//ecase 0xe7:P0=dofly[15];break;//f}}}uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法{uchar cord_h,cord_l;//行列值P3=0x0f; //行线输出全为0cord_h=P3&0x0f; //读入列线值if(cord_h!=0x0f) //先检测有无按键按下{delay(100); //去抖if(cord_h!=0x0f){cord_h=P3&0x0f; //读入列线值P3=cord_h|0xf0; //输出当前列线值cord_l=P3&0xf0; //读入行线值return(cord_h+cord_l);//键盘最后组合码值 }}return(0xff); //返回该值}void delay(uint i)//延时函数{while(i--);}。

C51键盘程序设计

软件消抖的软件原理:过了抖动区再检测,抖动区的时间:一般为10-20ms (2)需要循环扫描
(3)键盘扫描程序流程
一、
键盘扫描程序流程1
这种流程要求“其他任务”的处理时间不要太长(大于20ms),否则按键会有响应慢的问题。

二、
用定时中断的方式:
设置存储单元KEYV存放键值
(消抖用定时中断20ms,或用延时20ms)
设置标志KEY1ST记录第一次检测到按键按下的状态
参考流程2如下:
四、本次设计任务:
在已完成的单片机数字时钟的基础上,增加时间调整功能。

(1)动态显示或静态显示均可
(2)键盘的设置:
键1:进入调整,停止正常计时和显示,(使调整位闪烁) 键2:移动调整位
键3:数字加 键4:数字减
Yes。

(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法)


Delay1ms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; switch(temp) { case 0xde:num=9; break; case 0xdd:num=10; break; case 0xdb:num=11; break; case 0xd7:num=12; break; } } } else num=17; P3=0xef; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { Delay1ms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; switch(temp) { case 0xee:num=13; break; case 0xed:num=14; break; case 0xeb:num=15; break; case 0xe7:num=16; break; } }
case 0x7e:num=1; break; case 0x7d:num=2; break; case 0x7b:num=3; break; case 0x77:num=4; break; } } } else num=17; P3=0xbf; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { Delay1ms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; switch(temp) { case 0xbe:num=5; break; case 0xbd:num=6; break; case 0xbb:num=7; break; case 0xb7:num=8; break; } } } else num=17; P3=0xdf; temp=P3; temp=temp&0x0f; if(temp!=0x0f) {

键盘扫描去抖方法

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

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

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

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

算法流程图图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的编码作逻辑与,其结果作为键盘扫描码。

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

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

51单片机矩阵按键程序

51单片机矩阵按键程序下述为程序:#include <reg51.h>#define Keyvalue P1 //按下的键的代号#define Digvalue P0 //用宏定义来定义一下数码管的发送屈始数据端口typedef unsigned int ut;typedef unsigned char uc;ut k;sbit LSA=P2^2; //定义三八译码器泪亲的三个输入端口sbit LSB=P2^3;sbit LSC=P2^4;utsmgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //从0~15的十六进制编码void delay(ut i) //延时函数{ while(i) i--;}void anjian( //检测按键是否按下,若按键按下则给k附上按下的键的序号{ uta; Keyvalue=0x0f; if(Keyvalue!=0x0f) { delay(1000); if(Keyvalue!=0x0f) { Key value=0x0f; switch(Keyvalue) { case(0x07):k=0;break; case(0x0b):k=1;break ; case(0x0d):k=2;break; case(0x0e):k=3;break; } Keyvalue=0xf0; switch(Keyv alue) { case(0x70):k=k;break; case(0xb0):k=k+4;break; case(0xd0):k=k+8;br eak; case(0xe0):k=k+12;break; } } 劣蚊各} while((a<50)&&(Keyvalue!=0x0f)) { delay(1000); a++; }}voidmain({ LSA=0; //让第一个数码管显示数字 LSB=0; LSC=0; while(1) { anjian(; Digvalue=smgduan[k]; //显示数字 }}。

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

C51单片机矩阵键盘扫描去抖程序
最近有一个C51的项目,用的是新华龙的C51 F020单片机。

项目中要实现4*5的矩阵键盘。

矩阵电路图如下如示
其中,四条列线接在F020的P2~P5口线上,5条行线接在P5口线上(F020的P5口是不同于普通C51的扩展接口,不能位寻址)。

同时4条列线接在一四输入与非门(74LS20)上,门输出接F020的外中断1,这样,任何一键按下,都会产生中断,通知程序进行键盘扫描。

托一个新手给写了键盘的扫描程序,基本功能都能实现,但对于键盘的去抖处理总是做不好,表现是或者不能去抖,或者按键响应过慢,或者采集到错误键值。

看来新手对于矩阵键盘扫描原理掌握较好(网上资料多),但对于键盘去抖的知识却有所欠缺,基本都是按照书上说的延时一段时间再采集键值,实际应用中,这样的处理是远远不够的,过于简单。

实际去抖处理应该这样进行更合理一些,即连续采集键值,当采集到的键值在一段时间内是相同的,即认为按键状态已稳定,此键值为真实键值。

另外,按键释放时,也会有抖动,导致误采键值,因此在键释放时,也应进行去抖处理,处理方法同时是连续一段时间采集到无键按下状态,才认为按键被释放。

根据这个方法,我重写了新手的程序,实际应用中表现极好。

现将程序公布如下,供新手参考。

Key.h文件内容
#ifndef __key_H__
#define __key_H__
#define NULL_KEY 0x0000
#define S1 0x3801
#define S2 0x3401
#define S3 0x3802
#define S4 0x3402
#define S5 0x3804
#define S6 0x3404
#define S7 0x3808
#define S8 0x3408
#define S9 0x3810
#define S10 0x3410
#define S11 0x2C01
#define S12 0x1C01
#define S13 0x2C02
#define S14 0x1C02
#define S15 0x2C04
#define S16 0x1C04
#define S17 0x2C08
#define S18 0x1C08
#define S19 0x2C10
#define S20 0x1C10
#define KEY_DELAY 20
extern unsigned int Key_Value;
extern void Init_Key();
extern void Scan_Key();
extern bit Key_Pressed;
extern bit Key_Released;
extern unsigned int idata Keypress_Count;
extern unsigned int idata Keyrelease_Count;
#endif
key.c 文件内容
#include <string.h>
#include "key.h"
bit Key_Down; //是否有键按下的标志unsigned int idata Keypress_Count;
sbit Col_Key0 = P2^2;
sbit Col_Key1 = P2^3;
sbit Col_Key2 = P2^4;
sbit Col_Key3 = P2^5;
bit Key_Pressed;
bit Key_Released;
unsigned int Key_Value;
bit Key_Down; //是否有键按下的标志unsigned int idata Keypress_Count; //一毫秒增加一次的变量unsigned int idata Keyrelease_Count; //一毫秒增加一次的变量//矩阵键盘使用中断1作为键盘中断
void Init_Key()
{
P5 = 0; //行线全部置为0
EX1 = 1; // 允许外部时钟秒中断
IT1 = 1; // 外部时钟中断设置为边沿触发}
void Key_Int() interrupt 2
{
Key_Pressed = 1;
EX1 = 0;
}
void Scan_Key()
{
unsigned char temp,rowvalue;
unsigned int key;
int i;
temp = P2;
temp &= 0x3C;
if(temp == 0x3C)
{
Key_Released = 0;
Key_Pressed = 0;
key = NULL_KEY;
EX1 = 1;
}
else
{
key = temp;
key = key<<8;
rowvalue = 0x01;
for(i=0;i<5;i++)
{
P5 = rowvalue<<i;
DelayMs(1);
temp = P2;
temp &= 0x3C;
if(temp == 0x3c)
{
rowvalue = rowvalue<<i;
key = key | rowvalue;
P5 = 0x00;
break;
}
}
P5 = 0x00;
DelayMs(1);
}
if(key!=NULL_KEY) //如果有键按下
{
if(key==Key_Value) //如果按下的是相同的键{
if(Keypress_Count>=KEY_DELAY)
{
Key_Down = 1;
}
}
else if(Key_Down != 1)
{
Keypress_Count=0;
Keyrelease_Count = 0;
Key_Value=key;
}
}
else //如果无键按下
{
if(Key_Down) //如果当前是键释放,返回键值
{
if(Keyrelease_Count >= KEY_DELAY)
{
Key_Down=0;
Keypress_Count=0;
Keyrelease_Count=0;
Key_Released = 1;
EX1 = 1;
return;
}
}
else
{
Keypress_Count=0;
Keyrelease_Count=0;
Key_Value = NULL_KEY;
EX1 = 1;
return;
}
}
}
在main.c中的调用方法为
if(Key_Pressed == 1)
{
//Key_Pressed = 0;
Scan_Key();
}
if(Key_Released == 1)
{
Key_Released = 0;
Ack_Key();
}
其中Ack_Key()函数为具体的键盘响应程序,就不列出了。

我在另外使用Arm9的项目中,linux底层扫描键盘的驱动中,也使用了这种去抖方法,同样表现良好。

相关文档
最新文档