找回密码
 注册
关于网站域名变更的通知
查看: 303|回复: 3
打印 上一主题 下一主题

单片机的四种按键硬件、软件设计方式

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-11-15 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机系统里,按键是常见的输入设备,在本文将介绍几种按键硬件、软件设计方面的技巧。一般的在按键的设计上,一般有四种方案。
- v# k% a8 |) `+ @8 d0 B3 [# `* N% w' T
6 k/ |( @0 V2 C
一是 GPIO 口直接检测单个按键,如图 1.1 所示;
% G# h  x( y" ~8 v. x% y$ w2 Z- c. e
二是按键较多则使用矩阵键盘,如图 1.2 所示;
7 c$ l, G) }! N
: I0 G; K" R( P9 I3 j, S! l三是将按键接到外部中断引脚上,利用按键按下产生的边沿信号进行按键检测,如图 1.3 所示;
1 q0 Q$ j5 P, F; T0 z& T/ q' |6 t* n7 p% |5 b: L0 g7 y
四是利用单片机的 ADC,在不同的按键按下后,能够使得 ADC 接口上的电压不同,根据电压的不同,则可以识别按键,如图 1.4 所示。% h. t5 T* v- `2 C" E
" M1 e! V* Z7 C- ^$ m6 v2 m" l* W4 |
- ]: k4 b0 C' t/ B. ?; w4 A
图 1.1 方案一4 |5 k  X8 x% |- P7 D. x) q
- \: K/ c' K0 k5 [5 k; M

% ]; D; ^2 @) k8 e' E0 |3 ]( o, C
图 1.2 方案二
6 F  V$ k& p3 K+ q6 ?
* |: o; z" U3 F2 Y% \

; @  E( C7 F2 Q' F+ A- h
图 1.3 方案三
# Q* l" M: f& q7 [! }

+ Z9 M( S6 d2 t  j4 `
4 [0 j6 p2 G. g' ^4 D
图 1.4 方案四4 l- L, Z( j9 q7 i: w
4 g9 ?' r3 B% D
在以上四种设计上,各有优点和不足。- O: P: H( d! s" c1 q, V

' V) ~3 R" r3 M. T& g  c+ @3 [第一种,是最简单和最基础的,对于单片机初学者很容易理解和使用,但是缺点是,需要在主循环中不断检测按键是否按下,并且需要做消抖处理。若主循环中某个函数任务占用时间较长,则按键会有不同程度的“失灵”。. p' |2 R/ \. }( l& D
: i6 G& Y; E& F4 r5 t; l6 @8 W
第二种,优点是能够在有限的 GPIO 情况下,扩展尽可能多的按键。但缺点同上,需要不停检测按键是否按下。, \  y* G: r3 C1 l4 _' B
8 F1 D( o3 ^* A, T8 }* w
第三种,是效率最高,不需要循环检测按键是否按下,但是缺点是,需要单片机有足够的外部中断接口以供使用。
, J- r/ `5 E" n
% ~0 N, ], X0 G第四种,优点是,只需要单片机的一个 ADC 接口,一根线,就能对多个按键进行识别,缺点是按键一旦内部接触不良,则可能按键串位,且按键产生的抖动,会造成一定的识别错误。& ?3 v. ?' v. J5 A3 T$ p! b

! l* ~  _) S2 l' `8 m在以上的三种常见按键设计的基础上,现在分享我学习和工作中总结的按键方案。
1 E" `+ K) d" ?9 w( T  M
6 X8 S, F2 U+ j: ^* ^) n5 B% t改进一:在原方案一的基础上,加上与门电路,使得任何一个按键按下,都能产生中断,然后在中断里面识别是哪个按键被按下。因此不需要循环扫描,大大提高了效率。方案如图 1.5 所示。只需要每个按键对应地增加一个二极管,利用二极管的线与特性,可以实现按下任何按键,都能产生中断信号,但是按键之间互不影响。二极管选用普通整流二极管即可,本人亲测可行。) A- Z9 n5 g' Z+ {$ Y! D

% X8 x$ O# Z+ p0 F# l

) F1 F( w5 v$ i+ P7 u; x
图 1.5 改进一! ~& N% |) }1 g; W5 D- N
. |/ t; O" {: j5 ]3 s6 I9 v
改进二:在原有的 ADC 按键的基础上,也可用增加二极管的方式,实现按键中断,并在中断服务程序里进行 AD 转换,从而识别按键。电路如图 1.6 所示。
7 X- h: i" p& F8 q/ l- o5 G7 L' M
4 {0 `$ J5 `* F0 F
3 k1 ^1 u, q, k0 n. i
图 1.6 改进二) q% }( G; y, p1 y% p, O

6 Z5 F7 z5 `$ J' ~1 P( d/ m9 ~改进三:因为按键不可避免的有抖动,因此按键消抖可以通过硬件消痘和软件消抖。现在分享一个十分简单且有效的硬件消痘方法:给按键并联一个 104 左右的电容。软件上基本不用处理即可避免抖动。1 y% c3 o$ R: s: `3 p) A* z& B
  K' C) w! D' r% m5 ]1 O
改进四:在按键扫描检测的方案下,如果主循环中有某个函数占用时间较长,则按键会发生或长或短的“失灵”,现分享我的一个解决方案。将按键扫描放到定时器中断里面,这样就可周期性地检测按键按下情况,不受主循环的影响。
* X6 \( h, t, r( m
- M# h' A' R# K1 v0 y+ x并且,能解析出按键的不同状态,即按下、按住、弹起、为按下这四种状态,用以实现更丰富的功能。7 g% @% f& a7 \2 u. ^8 O, L" ^1 t

4 j# E% E2 m% A3 o  ]但需注意两点:一是定时器的定时时间,不可过长也不可过短,过长容易检测不到按下,过短会占用大量时间资源。二是中断服务程序需简单明了,只做检测用,通过全局变量传递,在主循环内完成按键响应,中断服务函数内尽量不要占用太多时间。
& G+ p% V) s! R  \+ d0 g

该用户从未签到

2#
发表于 2021-11-15 14:38 | 只看该作者
定时器的定时时间,不可过长也不可过短
  • TA的每日心情

    2019-11-19 15:55
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2021-11-15 14:39 | 只看该作者
    按键消抖可以通过硬件消抖和软件消抖

    该用户从未签到

    4#
    发表于 2021-11-15 14:39 | 只看该作者
    中断服务程序需简单明了
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-12 17:25 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表