EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在单片机系统里,按键是常见的输入设备,在本文将介绍几种按键硬件、软件设计方面的技巧。一般的在按键的设计上,一般有四种方案。
5 }' ?1 ?# A' I' T3 M) `2 p% l V3 A8 w
/ N5 p) I1 @7 d# @0 e! y* B. U- g
一是 GPIO 口直接检测单个按键,如图 1.1 所示;0 m- p) Z' @& k: l7 D0 Q7 |8 K+ n
4 c: I$ w, t) R: U$ B6 O二是按键较多则使用矩阵键盘,如图 1.2 所示;
! M5 S% d) d5 `* S: n
- }- Z& M/ \( J0 S+ p' O) ?三是将按键接到外部中断引脚上,利用按键按下产生的边沿信号进行按键检测,如图 1.3 所示;( @9 q& {2 h* s$ a. ]/ U! p }
. ^& g& l2 z0 e. q# S/ R四是利用单片机的 ADC,在不同的按键按下后,能够使得 ADC 接口上的电压不同,根据电压的不同,则可以识别按键,如图 1.4 所示。
\2 N; w. f* ~' l" |' @5 |2 q; h J7 o8 l
I# {3 o1 z' \" g% Q" [ I
图 1.1 方案一
3 x( |: W9 T9 S. k- S* B% o1 P
! D, X% V" c. v. \
7 p0 P5 r* ?0 Y0 E' C图 1.2 方案二( v" M' X4 Y: o/ I' H; ?
8 X0 a5 {' b6 f$ z( b( \. Z4 t9 v2 W& @! U
图 1.3 方案三
5 @- {* q6 f# I, w# Z! X8 P `6 d# I( G4 l
, [/ p' |/ {' v0 t9 F( T* r图 1.4 方案四
7 K7 D6 O, |, f1 z2 @ 8 _2 V5 }8 `0 p% U$ U9 S6 k
在以上四种设计上,各有优点和不足。 | `; u0 u) r/ E' Z
7 O6 X1 [3 F$ M& N) o4 t第一种,是最简单和最基础的,对于单片机初学者很容易理解和使用,但是缺点是,需要在主循环中不断检测按键是否按下,并且需要做消抖处理。若主循环中某个函数任务占用时间较长,则按键会有不同程度的“失灵”。6 J$ A9 U7 x) a/ q; M. a. r
( X* @1 ]9 E4 z# g, m; Z9 _7 J7 f: \
第二种,优点是能够在有限的 GPIO 情况下,扩展尽可能多的按键。但缺点同上,需要不停检测按键是否按下。2 P; D+ g1 S3 E9 x4 F% J- u" ^ w# b
; J, T y% {. a; Z第三种,是效率最高,不需要循环检测按键是否按下,但是缺点是,需要单片机有足够的外部中断接口以供使用。4 b' ^$ c; ?2 {6 s( E3 S, v
/ M, u6 e& o+ L+ N5 K, B( ]7 A第四种,优点是,只需要单片机的一个 ADC 接口,一根线,就能对多个按键进行识别,缺点是按键一旦内部接触不良,则可能按键串位,且按键产生的抖动,会造成一定的识别错误。
B4 z: V3 X# P2 u9 f' n5 B, q% o9 S" D9 ~9 q
在以上的三种常见按键设计的基础上,现在分享我学习和工作中总结的按键方案。" B! ] \7 u. p$ Y
) Q9 h: Z6 R9 q( D9 w, a
改进一:在原方案一的基础上,加上与门电路,使得任何一个按键按下,都能产生中断,然后在中断里面识别是哪个按键被按下。因此不需要循环扫描,大大提高了效率。方案如图 1.5 所示。只需要每个按键对应地增加一个二极管,利用二极管的线与特性,可以实现按下任何按键,都能产生中断信号,但是按键之间互不影响。二极管选用普通整流二极管即可,本人亲测可行。
) |( y* _9 A& g& d! h3 s
1 X) j( h' {% n6 F C1 `7 G' g3 M1 g S% M2 {9 o( n
图 1.5 改进一
/ p, g& U M8 B( l, Y# p
0 ` _/ ]3 M% j4 [- c改进二:在原有的 ADC 按键的基础上,也可用增加二极管的方式,实现按键中断,并在中断服务程序里进行 AD 转换,从而识别按键。电路如图 1.6 所示。
! l4 }: u) F" Z. c, _8 S
) Y- i& U( Z4 s
: y6 [! C0 m6 v' ?2 {; z2 o0 a1 c图 1.6 改进二
& V3 X9 I( x K% k! F & r7 |/ \1 q0 a1 C0 [' N8 [
改进三:因为按键不可避免的有抖动,因此按键消抖可以通过硬件消痘和软件消抖。现在分享一个十分简单且有效的硬件消痘方法:给按键并联一个 104 左右的电容。软件上基本不用处理即可避免抖动。
& G$ z' O5 Q- P% s T: O2 R9 R! H ~/ e( }& h
改进四:在按键扫描检测的方案下,如果主循环中有某个函数占用时间较长,则按键会发生或长或短的“失灵”,现分享我的一个解决方案。将按键扫描放到定时器中断里面,这样就可周期性地检测按键按下情况,不受主循环的影响。2 _4 X2 [( k- i$ D9 T( H
; ?# V- J2 O4 n
并且,能解析出按键的不同状态,即按下、按住、弹起、为按下这四种状态,用以实现更丰富的功能。
' O$ D/ w1 T. t# g e8 B3 f b1 q! S0 j) H/ s$ p& m1 e
但需注意两点:一是定时器的定时时间,不可过长也不可过短,过长容易检测不到按下,过短会占用大量时间资源。二是中断服务程序需简单明了,只做检测用,通过全局变量传递,在主循环内完成按键响应,中断服务函数内尽量不要占用太多时间。
; \+ x- V, B) @* e9 w |