单片机系统的按键处理

合集下载

单片机按键模块设计

单片机按键模块设计

单片机按键模块设计一、硬件设计1、按键的类型选择按键的类型有很多种,常见的有机械按键和触摸按键。

机械按键通过金属触点的闭合和断开来产生电信号,具有成本低、可靠性高的优点,但寿命相对较短,容易产生抖动。

触摸按键则通过电容感应或电阻感应来检测触摸动作,寿命长、外观美观,但成本相对较高,且容易受到外界干扰。

在一般的单片机应用中,机械按键通常是更经济实用的选择。

2、按键的连接方式按键可以采用独立式连接或矩阵式连接。

独立式连接适用于按键数量较少的情况,每个按键单独连接到单片机的一个 I/O 口上,这种方式简单直观,但占用的 I/O 口资源较多。

矩阵式连接则适用于按键数量较多的情况,通过将按键排列成矩阵形式,利用行线和列线的交叉点来识别按键,大大节省了 I/O 口资源,但编程相对复杂。

以 4×4 矩阵按键为例,我们需要 8 个 I/O 口,其中 4 个作为行线,4 个作为列线。

当某个按键被按下时,对应的行线和列线会接通,通过扫描行线和列线的状态,就可以确定被按下的按键。

3、上拉电阻的使用为了保证单片机能够正确检测按键的状态,通常需要在按键连接的I/O 口上加上拉电阻。

上拉电阻将I/O 口的电平拉高,当按键未按下时,I/O 口处于高电平;当按键按下时,I/O 口被拉低为低电平。

上拉电阻的阻值一般在10KΩ 左右。

4、消抖处理由于机械按键在按下和释放的瞬间,触点会产生抖动,导致单片机检测到的电平不稳定。

为了消除这种抖动,通常采用软件消抖或硬件消抖的方法。

软件消抖是在检测到按键状态变化后,延迟一段时间(一般为10ms 20ms),再次检测按键状态,如果状态保持不变,则认为按键有效。

这种方法简单易行,但会增加程序的执行时间。

硬件消抖则是通过在按键两端并联电容或使用专用的消抖芯片来实现。

电容可以吸收触点抖动产生的尖峰脉冲,使电平稳定。

但硬件消抖会增加硬件成本和电路复杂度。

二、软件编程1、按键扫描程序在软件编程中,需要编写按键扫描程序来检测按键的状态。

51单片机矩阵键盘原理

51单片机矩阵键盘原理

51单片机矩阵键盘原理51单片机矩阵键盘原理矩阵键盘是一种常用的输入设备,可以通过少量的I/O口控制多个按键。

51单片机作为嵌入式系统中常用的控制器,也可以通过控制矩阵键盘来实现输入功能。

1. 矩阵键盘的结构矩阵键盘由多个按键组成,每个按键都有一个引脚与其他按键共用,形成了一个按键矩阵。

例如,4x4的矩阵键盘有16个按键,其中每行和每列各有4个引脚。

2. 矩阵键盘的工作原理当用户按下某一个按键时,该按键所在行和列之间会形成一个电路通路。

这时,51单片机可以通过扫描所有行和列的电路状态来检测到用户所按下的具体按键。

具体实现过程如下:(1)将每一行引脚设置为输出状态,并将其输出高电平;(2)将每一列引脚设置为输入状态,并开启上拉电阻;(3)逐一扫描每一行引脚,当发现某一行被拉低时,则表示该行对应的某一个按键被按下;(4)记录下该行号,并将该行引脚设置为输入状态,其余行引脚设置为输出状态;(5)逐一扫描每一列引脚,当发现某一列被拉低时,则表示该列对应的是刚才所记录下的行号及其对应的按键;(6)通过行号和列号确定具体按键,并进行相应的处理。

3. 代码实现下面是一个简单的51单片机矩阵键盘扫描程序:```c#include <reg52.h> //头文件sbit row1 = P1^0; //定义引脚sbit row2 = P1^1;sbit row3 = P1^2;sbit row4 = P1^3;sbit col1 = P1^4;sbit col2 = P1^5;sbit col3 = P1^6;sbit col4 = P1^7;unsigned char keyscan(void) //函数定义{unsigned char keyvalue; //定义变量while(1) //循环扫描{row1=0;row2=row3=row4=1; //设置行状态 if(col1==0){keyvalue='7';break;} //读取按键值 if(col2==0){keyvalue='8';break;}if(col3==0){keyvalue='9';break;}if(col4==0){keyvalue='/';break;}row2=0;row1=row3=row4=1;if(col1==0){keyvalue='4';break;}if(col2==0){keyvalue='5';break;}if(col3==0){keyvalue='6';break;} if(col4==0){keyvalue='*';break;}row3=0;row1=row2=row4=1; if(col1==0){keyvalue='1';break;} if(col2==0){keyvalue='2';break;} if(col3==0){keyvalue='3';break;} if(col4==0){keyvalue='-';break;}row4=0;row1=row2=row3=1; if(col1==0){keyvalue='C';break;} if(col2==0){keyvalue='0';break;} if(col3==0){keyvalue='=';break;} if(col4==0){keyvalue='+';break;}}return keyvalue; //返回按键值}void main() //主函数{unsigned char key;while(1) //循环读取{key = keyscan(); //调用函数}}```以上代码实现了一个简单的矩阵键盘扫描程序,可以通过调用`keyscan()`函数来获取用户所按下的具体按键值。

单片机按键电容消抖电路

单片机按键电容消抖电路

单片机按键电容消抖电路1.引言1.1 概述概述部分的内容:在许多电子设备中,按键电路常常被使用来实现用户与设备之间的交互。

然而,由于按键的物理特性,如机械弹性和触点接触的不稳定性,会导致按键的震荡现象,即按键在按下或释放时会产生多次跳变。

这种跳变会导致单片机误读按键的信号,可能引发系统错误操作或不稳定的现象。

因此,为了保证按键信号的可靠性和稳定性,需要对按键进行消抖处理。

本篇文章将详细介绍单片机按键电容消抖电路的设计和实现原理。

通过在按键电路中引入电容元件,可以达到消抖的效果。

电容元件具有快速充放电的特性,可以有效地过滤掉按键震荡带来的干扰信号,确保单片机正确读取按键状态。

文章将首先介绍单片机按键的工作原理,包括按键的接口电路和输入电平变化的检测方式。

接着,将深入探讨按键消抖的必要性,分析不进行消抖处理所带来的潜在问题。

在这之后,将详细介绍按键电容消抖电路的设计原理,包括电容的连接方式和参数的选择。

最后,将给出经过实际测试的电路实现结果和相关性能指标的评估。

通过本文的阅读,读者将能够了解单片机按键的基本原理和消抖处理的必要性,掌握按键电容消抖电路的设计和实现方法,以及了解该电路的性能表现。

这对于开发单片机应用的工程师和爱好者来说,具有一定的指导意义和实践价值。

文章结构部分的内容是对整篇文章的组织和布局进行描述。

它向读者展示了文章的章节和主题,并指导读者理解和阅读文章的内容。

在本文中,文章结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 单片机按键原理2.2 按键消抖的必要性3. 结论3.1 按键电容消抖电路的设计原理3.2 电路实现与测试结果文章的结构分为引言、正文和结论三个主要部分。

在引言部分,概述简要介绍了单片机按键电容消抖电路的背景和重要性;文章结构部分指出了本文的章节组成和布局,为读者提供了阅读指南;目的阐明了文章的目标和意图。

正文部分主要包括单片机按键原理和按键消抖的必要性。

单片机按键程序的编写

单片机按键程序的编写
下面我们来看看多个按键的情况 吧
一般情况下,如果多个按键每个都直接接在单片机的 I/O 上的话会占用很多的 I/O 资源。比 较合理的一种做法是,按照行列接成矩阵的形式。按键接在每一个的行列的相交处。这样对 于 m 行 n 列的矩阵,可以接的按键总数是 m*n。这里我们以常见的 4*4 矩阵键盘来讲解矩阵 键盘的编程。
/******************************************
* 此模块所需相关支持库
*
******************************************/
#include"regx52.h"
#define uint8 unsigned char
#define uint16 unsigned int
bit bdata StartScan = 0 ;//此变量需放在定时中断中置位
else
{
//SHOW_ICON
}
}
}
每次执行读键盘函数时,只是对一些标志进行判断,然后退出。因此能够充分的利用 CPU 的资源。同时可以处理连发按键。此按键扫描按键函数可以直接放在主函数中。如果感觉按 键太过灵敏或者迟钝则改一下相关消抖动的宏定义即可。此函数也可以通过中断标志位进行 定时的扫描。此时,需要添加一个定时标志位,并将相关消抖动的和连击时间的宏定义改小 即可。然后在主程序类似下面这样写即可
这个流程是好多教科书上的做法。可惜,误导了好多人。为什么呢。因为它根本就没有考虑 实际情况。我们根据这幅流程图来写它的代码看看。
unsigned char v_ReadKey_f( void )
{
unsigned char KeyPress ;

C51中对按键的处理方法

C51中对按键的处理方法

2007 年 11 月 第 4 期吉林师范大学学报 (自然科学版)Journal of J ilin Normal University ( Nat ural Science Edition)№. 4 Nov. 2007C51 中对按键的处理方法王春武1 ,李 岩2 ,孟祥英3 ,尹冬梅4(1. 吉林师范大学 信息技术学院 ,吉林 四平 136000 ;2. 山东临邑第一中学 ,山东 临邑 251500 ; 3. 四平德科电子有限公司 ,吉林 四平 136000 ;4. 东北师范大学 物理学院 ,吉林 长春 130024 ;)摘 要 :单片机控制系统中大多使用按键来实现控制功能 . 非编码键盘中如何消除按键瞬间的抖动和响应按键操作是设计者必须要考虑的问题 . 本文通过软件消除了按键抖动 ,并讨论如何实现响应一次键操作 . 文中还提供C51 单片机的按键识别的实用例程 .关键词 :单片机 ;按键 ;响应 ;抖动中图分类号 : TP368 文献标识码 :A 文章编号 :1000 - 1840 - (2007) 04 - 0086 - 02 在单片机控制系统中 ,通过按键实现控制功能是 M Hz ,编程软件为 Keil uVision2 [ 5 ] . 很常用的. 对按键处理[1 ]的重要环节是去抖动[2 ] ,即除 按下和抬起瞬间的抖动. 而消除抖动后面临的更大问 题就是解决按键的响应问题 ,包括按键的一次响应 ,一 键多功能等. 下面从两个方面来进行相应的讨论.1 按键去抖问题1. 1 原理阐述常用的按键由于机械触点的弹性作用 ,一个按 键开关在闭合时或断开时不会马上稳定下来 ,因而 在闭合和断开的瞬间都伴随着一连串的抖动 ,如图 1. 抖动时间的长短由按键的机械特性来决定 ,一般 为 5~10 ms. 这种抖动对人来说是感觉不到的 , 但图 1 按键抖动void delay (unsigned char i) {unsigned char j ;while ( - - i) {j = 180 ; while ( - - j) ;}}图 2 触发器去除抖动对单片机来说 ,则是完全可以感知的 ,因为单片机的 1. 2 举例说明 处理速度在微秒量级. 如果不对按键消除抖动则会 假设有电路图如图 3 所示 ,要完成如下要求的 引起程序处理的误操作. 去抖动的方法有很多种 ,如 电路控制 :当按键按下时 L ED 亮灭状态取反. 使用 R - S 触发器等的硬件方法[ 3 ] , 运用不同算法的各种 软 件[ 4 ] 方 法 等. 硬 件 方 法 会 增 加 成 本 和 体 积 ,如图 2 ;软件方法用的比较普遍 , 现 在 常 应 用 加 固定软件延时来去抖动. 具体方法就是在有按键按 下时 ,利用软件延时 10ms 或稍长的时间 ( 根据具体 键的机械特性来确定) 后再次检测按键是否按下 ,实 际上是避开了按键按下时的抖动时间. 实践证明 ,不 对按键释放的抖动进行处理 ,也能满足设计的要求.在程序中 添 加 此 函 数 则 可 以 实 现 延 时 , 参 数 i 表示 延 时 i 个 毫 秒. 应 用 中 可 以 这 样 调 用 : delay 图 3 按键触发 L ED 电路图(10) ,表示延时 10 ms. 本例中单片机的晶振采用 12收稿日期 :2007 - 09 - 24第一作者简介 :王春武 (1978 - ) ,男 ,吉林省松原市人 ,现为吉林师范大学信息技术学院助教 ,硕士. 研究方向 :计算机软件与应用.— 86 —main ( ){for ( ; ;){L ED = 1 ;/ /初始状态L ED灯灭if ( ! P10){delay (10) ;/ /延时10ms去抖按键仍然是按下的则执行while语句,系统会一直查询按键状态,只有按键抬起才可以退出循环结构,从而可以一次响应.方法二:加入按键标志( ! P10) / /确认去抖后按键是否真的按下P30 = ! P30 ;/ /触发L ED灯亮}}} bit k eymai n ( )mark = 0 ;/ /一次按键响应封锁标志2按键响应问题{for ( ; ;){if ( ! K & & ! key mark )2. 1问题阐述如图3所示,主要讨论如何在单片机设计中实现对按键的一次响应问题,即每次按下键时,系统只响应一次按键处理.从程序设计的表面上看,执行L ED = ! {delay (1) ;延时10ms去抖if ( ! K ){key mark = 1 ;/ /封锁按键,直到按键抬起L ED = ! L ED ;/ / L ED状态去反}}else if ( K )L ED语句即可,但实际应用中却出现L ED一直处于闪key mark = 0 ;/ /标志清零,为下次按键做好准备}}烁的情况,经分析发现:当程序中确定按键已被按下分析:其中key mark是位变量,只有当按键按时,会将L ED的状态取反,可当主程序不断的扫描按键下且keymark = 0时,程序才会继续确认是否真的时,按键一直处于按下的状态,系统会频繁的调用此语有键按下.经过延时去抖,程序中将key mark的值句,从而导致了,显然程序无法实现预期的要求. 置 1 ,然后执行其它语句,设想按键没有抬起,则因为现在介绍一下本文所用的方法. key mark的值已经变为 1 ,if ( ! K & & ! key mark 2. 2举例说明)将不会再次成立,直到当前的按键抬起,即else if下面是实现按键一次响应问题的常用两种方法. ( K)成立时key mark的值才重新为0.这样处理可方法一:查询方式main ( ){for ( ; ;){if ( ! k ){delay (1) ;延时10ms去抖if ( ! k ){L ED = ! L ED ;/ / L ED状态去反While ( ! k) ;/ /查询按键状态,只有按键抬起则退出循环}}}} 以实现每一次按键,系统只会调用一次键处理.3结论虽然以上的两种方法在实践中都有所应用,但是两种方法在效率上却大不相同.方法一,通过查询方式来判断按键系统就一直进行while死循环,从效率上看,CPU的执行效率变低.方法二,当第一次检测到按键真的按下处理完相应的程序后,CPU无分析:当有键按下时,经过延时去抖后,如果按需浪费时间等待按键抬起操作,从而可以用大部分键真的按下,则执行L ED状态取反语句,然后如果时间进行其它的处理,提高CPU的执行效率.参考文献[ 1 ]张素芬.键处理程序的设计方法[J ] .电子仪器仪表用户,1997 , (3) :12~15.[ 2 ]肖广安.一种软件去除键抖动的方法[J ] .单片机与嵌入式系统应用,2001 , (7) :63~65.[ 3 ]马家辰,孙玉德,张颖. MCS - 51单片机原理及接口技术[ M ] .哈尔滨:哈尔滨工业大学出版社,2004.[ 4 ]曾旖,奚大顺,李向阳.按键开关的抖动与消除方法[J ] .电子世界,2005 (9) :55~56.[ 5 ]孙鉴. KELL u ision2环境下仿真单片机程序[J ] .计算机辅助工程,2006 , (2) :74~77.The Handles Method on Button in C51W A N G Chun - w u 1 , L I Yan 2 , M EN G Xiang - ying3 , Y IN Dong - mei 4(1. College of In formation and Technology ,Jilin Normal Universit y ,Siping 136000 ,China ;2.№1 Middle School of Linyi ,Linyi 251500 ,China3. Siping Decaux Ltd. ,Siping 136000 ,China ;4. College of Physics ,Nort heast Normal Universit y ,Changchun 130024 ,China)Abstract :MCS - 51 system is mostly controlled with keys. It must be considered for designers which are eliminating the dithering of keys and operating respond of keys in non - coding keyboard. In this thesis ,the dithering problem of keys was solved by software and discussed how to come true once key operation of respond. In addition ,some applied procedures were provided with C51 language in the paper.Key words :MCU ;key ;respond ;dit hering感谢您试用AnyBizSoft PDF to Word。

单片机按键单击双击长按功能实现

单片机按键单击双击长按功能实现

单片机按键单击双击长按功能实现在很多嵌入式系统中,都需要对按键进行检测和处理,以实现不同的功能。

常见的按键功能包括单击、双击和长按。

在这篇文章中,我们将介绍如何使用单片机实现这些按键功能。

首先,我们需要连接一个按键到单片机的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甚⾄加更多的原因。

对于按键消抖,常⽤的有硬件消抖和软件消抖。

本⽂是我个⼈对按键处理的⼀些常见⽅法的总结,由于我本⼈不太懂硬件,所以这⾥只讨论独⽴按键的软件消抖实现。

⽔平有限,如有错误请不吝指正。

硬件环境 本⽂代码均在单⽚机STC90C516RD+、晶振12.0MHz硬件环境下试验通过。

带消抖的简单的按键处理 最简单的消抖处理就是在⾸次检测到电平变化后加⼀个延时,等待抖动停⽌后再次检测电平信号。

这也是⼤多数单⽚机教程讲述的消抖⽅式。

但在实际应⽤中基本不⽤这种⽅式,原因后⾯讲,先看代码://⽅法⼀:带消抖的简单的按键处理#include <reg52.h>#define GPIO_KEY P1 //8个独⽴按键IO⼝#define GPIO_LED P0 //8个LED灯,⽤于显⽰键值unsigned char ScanKey();void DelayXms(unsigned char x);void main(){unsigned char key;GPIO_LED = 0x00; //初始化LEDwhile (1){key = ScanKey(); //读取键值// if (0xff != key) //若有键按下,则更新LED的状态GPIO_LED = ~key; //点亮LED}}unsigned char ScanKey(){unsigned char keyValue = 0xff; //赋初值,0xff表⽰没有键按下GPIO_KEY = 0xff; //给按键IO⼝置位if (0xff != GPIO_KEY) //检查按键IO⼝的电平,如有键按下则不为0xff{DelayXms(15); //延时15ms,滤掉抖动。

单片机矩阵按键课程设计

单片机矩阵按键课程设计

单片机矩阵按键课程设计一、课程目标知识目标:1. 学生能理解单片机矩阵按键的基础知识,掌握矩阵按键的原理及其在电路中的应用。

2. 学生能描述单片机I/O口操作方法,并运用此知识实现矩阵按键的编程控制。

3. 学生能解释并运用行、列扫描法进行按键识别,实现按键的消抖处理。

技能目标:1. 学生能够独立完成矩阵按键电路的连接,并进行调试。

2. 学生能够运用所学知识,编写程序实现矩阵按键的扫描与功能分配。

3. 学生能够通过实验,分析和解决矩阵按键编程过程中遇到的问题。

情感态度价值观目标:1. 学生培养对单片机技术的兴趣,增强对电子工程领域的认识。

2. 学生在学习过程中,培养解决问题的耐心和毅力,树立团队协作意识。

3. 学生能够认识到单片机技术在现实生活中的应用价值,增强创新实践能力。

课程性质:本课程为实践性较强的电子技术课程,要求学生在掌握理论知识的基础上,注重动手实践。

学生特点:学生具备一定的单片机基础知识,对电子技术有较高的兴趣,但编程和动手能力参差不齐。

教学要求:结合学生特点,课程注重理论与实践相结合,充分调动学生的积极性,提高学生的动手能力和创新能力。

通过课程学习,使学生在知识、技能和情感态度价值观方面均有所提升。

二、教学内容1. 矩阵按键原理:介绍矩阵按键的电路结构、工作原理以及其在单片机系统中的应用。

- 教材章节:第二章第二节《矩阵键盘的工作原理》2. 单片机I/O口操作:回顾并加深理解单片机I/O口的基本操作,为矩阵按键编程打下基础。

- 教材章节:第一章《单片机基础》3. 行列扫描法:讲解如何运用行列扫描法进行按键识别,包括消抖处理方法。

- 教材章节:第二章第三节《矩阵键盘的编程方法》4. 矩阵按键编程实践:指导学生编写程序,实现矩阵按键的扫描与功能分配。

- 教材章节:第二章第四节《矩阵键盘应用实例》5. 电路连接与调试:学生动手实践,完成矩阵按键电路的连接,并进行调试。

- 教材章节:实验指导书《矩阵键盘实验》6. 问题分析与解决:针对编程和调试过程中遇到的问题,引导学生进行分析和解决。

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

即可。然后在主程序类似下面这样写即可
if( KeyTime )
//定时扫描时间到
{
KeyValue = u8_ReadKey_f() ;
}
具体的工作就交
给您去完成啦。
看看效果:
按键单击

连发时候的截图 至此,关于单个按键的学习就告一段落了,您是否已经明白了。如果您还不明白,那么把这 个程序好好的看看,并画下流程图,分析分析。估计您就会恍然大悟。关键是思路要转换过 来。 下面我们来看看多个按键的情况吧 一般情况下,如果多个按键每个都直接接在单片机的 I/O 上的话会占用很多的 I/O 资源。比 较合理的一种做法是,按照行列接成矩阵的形式。按键接在每一个的行列的相交处。这样对 于 m 行 n 列的矩阵,可以接的按键总数是 m*n。这里我们以常见的 4*4 矩阵键盘来讲解矩 阵键盘的编程。
下面以四个独立按键的处理程序为例来讲解(支持单击和连发)
#include"regx52.h"
sbit KeyOne = P1^0 ;
sbit KeyTwo = P1^1 ;
sbit KeyThree = P1^2 ;
sbit KeyFour = P1^3 ;
#define uint16 unsigned int
//临时保存读到的键值 //读键值
if( KeyTemp == 0x0f )
{
KeyCount = 0 ;
KeyOverTime = KEY_OVER_TIME ;
return NOKEY ;
//无键按下返回 NOKEY
}
else
{
if( KeyTemp == LastKey ) //是否第一次按下
KeyValue = u8_ReadKey_f() ; if( KeyValue != NOKEY ) { LOCATE(1, 2)
if( KeyValue == 0x0e )Count++ ; if( KeyValue == 0x0d )Count-- ; if( KeyValue == 0x0b )Count = 0 ; if( KeyValue == 0x07 )Count = 0 ; HIDE_ICON PRINTD(Count, 5) LOCATE(6, 2) } else { //SHOW_ICON } } }
#define NOKEY
0xff //定义无键按下时的返回值
#define DELAY_COUNT 2 //消抖时间常数
/*****************************************
* 此模块所需的全局或者外部变量
*
*****************************************/
按键的种类很多。不过原理基本相似。下面我们以一种轻触开关为例讲解按键程序的 写法。
这种轻触开关大家不陌生吧^_^
一般情况下,按键与单片机的连接如下面这幅图所示。
(图中电阻值一般去 4.7k~10k 之间,对于内部端口有上拉电阻的单片机则可省略此电阻) 单片机对于按键的按下与否则是通过检测相应引脚上的电平来实现的。对于上图而言, 当 P17 引脚上面的电平为低时,则表示按键已经按下。反之,则表明按键没有按下。我们 在程序中只要检测到了 P17 引脚上面的电平为低了,就可以判断按键按下。呵呵,简单吧。
#include"regx52.h"
#define uint8 unsigned char
#define uint16 unsigned int
/**************************************** * 与硬件连接相关的定义及宏定义和操作宏 * *****************************************/ #define KEYBOARD P3 #define READ_ROW_ENLABLE KEYBOARD = 0x0f ; 本 51 单片机特性决定的) #define READ_COL_ENLABLE KEYBOARD = 0xf0 ;
每次执行读键盘函数时,只是对一些标志进行判断,然后退出。因此能够充分的利用 CPU
的资源。同时可以处理连发按键。此按键扫描按键函数可以直接放在主函数中。如果感觉按
键太过灵敏或者迟钝则改一下相关消抖动的宏定义即可。此函数也可以通过中断标志位进行
定时的扫描。此时,需要添加一个定时标志位,并将相关消抖动的和连击时间的宏定义改小
上图就是矩阵键盘的一般接法。
这里我们要介绍一种快速的键盘扫描法:线反转法(或者称为行列翻转法)。具体流程如下。 首先,让单片机的行全部输出 0,列全部输出 1,读取列的值(假设行接 P3 口的高四位,列 接低四位)。即 P3= 0x0f ; 此时读列的值,如果有键按下,则相应的列读回来的值应该为低。 譬如此时读回来的值为 0x0e ; 即按键列的位置已经确定。这时反过来,把行作为输入,列 作为输出,即 P0 = 0xf0 ;此时再读行的值,如果按键仍然被按下,则相应的行的值应该为低, 如果此时读回来的值为 0xe0,则确定了行的位置 。说到这里,您应该笑了,知道了一个按 键被按下的行和列的位置,那么就可以肯定确定它的位置了。我们把读回来的行值和列值进
单片机系统的按键小议 -------蒋晨辉
对于一个由单片机为核心构成的系统而言。输入通道是相当重要的。可以看到几乎每 一样基于单片机的产品都有人机交互的部分。如各种仪器设备上的各种按钮和开关,以及我 们手机上的键盘,MP3 上的按键等等。最常见的输入部分,莫非就是按键了。对于大多数 初学者而言,编写一个好的按键程序是一件颇为头疼的事情。于是乎在网上乱搜一气,程序 倒是找到了不少,但是看了半天依然是不明白。或者在某某论坛上面发帖“跪求 XX 按键程 序,大虾帮忙……”如果你偶然间进了这个论坛,又偶然看到了这个帖子,而且恰好你对按 键程序的写法也不是很清楚,那么我希望你能够静静的看完这个帖子。如果你觉得对你很有 帮助,那么我希望你能够在以后的日子中能够坚持到这个论坛来,一起交流学习,分享自己 学习过程中的喜悦或者一起探讨棘手的问题,这是我写这个帖子的最大的初衷了。OK,不 能再说了,再说就变成水帖了。那么我们开始吧。
{
static uint8 LastKey = NOKEY ;
//保存上一次的键值
static uint16 KeyCount = 0 ;
//按键延时计数器
static uint16 KeyOverTime = KEY_OVER_TIME ; //按键抬起时间
uint8 KeyTemp = NOKEY ; KeyTemp = P1 & 0x0f ;
{
if( ++KeyCount == KEY_WOBBLE_TIME ) //不是第一次按下,则判断
//抖动是否结束
{
return KeyTemp ;
//去抖动结束,返回键值
}
else
{
if( KeyCount > KeyOverTime )
{
KeyCount = 0 ;
KeyOverTime = KEY_QUICK_TIME ;
{ Delay(20) ;
//延时 20MS
If( P17 == 0)
{
KeyPress = 1 ; While( !P17) ; //等待释放
}
else KeyPress = 0 ; } }
这样一个程序,相信对很多初学者而言都不陌生。因为好多书上基本都是这样的一个 流程和写法。可是当有一天,我们想做一个数码管加按键调整的时钟,发现当我们按键按下 去的时候,数码管就不亮了。为什么呢。原因就在这个键盘扫描函数。平常没有按键按下还 好。一旦有键按下,它先是浪费了 CPU 的大部分时间(就是那个什么事情都没做的延时 20MS 函数)然后,又霸占 CPU( 就是哪个死死等在那里的 while(P17);语句)直到按键释放。对 于这种情况我们是忍无可忍的,那么就让我们彻底的抛弃它吧。那么到底按键扫把 CPU 延时 的那 20MS 拿出来去做其它事情,那么不就充分利用 CPU 的时间了吗。而一般情况下我们 只要前沿去抖动就可以了。也就是说了,我们只需在按键按下后去抖就可以了,对于按键的 释放抖动可以不必要过于关注。当然这主要和应用的场合有关。一个能有效识别按键按下并 支持连发功能的按键已经能够应用到大多数的场合了。
#define KEY_QUICK_TIME 1000 //等待按键抬起的连击时间(待定)
void v_KeyInit_f( void )
{ KeyOne = 1 ;
//按键初始化(相应端口写 1)
KeyTwo = 1 ;
KeyThree = 1 ;
KeyFour = 1 ;
}
uint8 u8_ReadKey_f(void)
#define uint8 unsigned char
#define NOKEY 0xff
#define KEY_WOBBLE_TIME 500
//去抖动时间(待定)
#define KEY_OVER_TIME 15000 //等待进入连击时间(待定),该常数要比正常
//按键时间要长,防止非目的性进入连击模式
//键盘连接到单片机上的端口位置 //读端口之前先把相应口置位(由基
// 根据实际硬件连接情况修改
/*****************************************
* 模块内相关的宏定义及常数宏*******************************************/
等会,您先别乐呵,话还没说完呢。下面我们来看看,当按键按下时,P17 引脚上面的波形 是怎么变化的。
这张图是一个理想波形图,当按键按下时,P17 口的电平马上被拉低到 0V 了。当然理 想的东西都是不现实的。所以我们还是看看现实的波形图吧。
相关文档
最新文档