EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
& p) {9 Q0 G% \$ z1 C) U1 D知识点:
& m* O: I& D5 h3 ^1、 机械式按键结构特点 3、 按键常见电路接法 4、 单片机识别按键的一般思路 5、 识别行列式按键的一种方法 6、 单片机程序设计思想:宏观上并行,微观上串行 0 L6 h* v! W9 M
一、 机械式按键结构特点: 这里所讲的机械式按键又称轻触开关或微动开关。它的一个主要特点就是按下接通,松开断
- N8 s2 z$ f H( A/ M: K9 y7 F开。电路图形符号 ![]() ,文字符号常用 K 或 SW 表示。以下简称按键。
, h8 a/ s! p7 p' _% ~# j: i7 L二、51 单片机 IO 端口配置成输入: 51 单片机 IO 端口作为通用输入口时,应先向对应的端口寄存器写 1,比如,把 P2.1 配置成 输入,应先 P2.1 = 1;但作为通用输出口时却是无条件的。所以,也把 51 单片机 I/O 口称 为准双向 IO 口。这个操作在行列式按键扫描时,得以体现。由于 51 单片机在上电复位时, 端口寄存器 P0-P3 默认值就是 0XFF,所以,我们在做独立按键时,没有把检测按键的 P1^0 口事先写 1。这一点同学们要注意。
. p5 j. m/ v0 X( a三、 按键常见电路接法: 常见接法有两种:分压式接法和高低电平式接法。 分压式接法电路如下所示
1 p8 _# m {' ^! Y" O
这种是分压式接法,其中 ADIN 接的是单片机某一个 AD 口,通过检测不 同的分压值来识别是哪个按键被按下。这种接法的特点是占用单片机 IO 端口极少,只需一个 AD 口即可。但对分压电阻的精度要求高一些。 高低电平式接法是最常见的,也是单片机通用 IO 端口就可以识别的。一 般分为两种:独立式接法和行列式接法。 4 t0 L+ x$ D2 r8 w" @* G0 [
/ Q$ P) w" g9 l) m; \
独立式接法就是每一个按键对应一个单片机 IO 端口,这种接法单片 机识别起来特别简单,只需检测相应 IO 的高低电平即可。如下图所示:
; F( m: ~3 X' a4 N0 `所有的按键一端接单片机 IO 端口,另外一端全部连在一起接地 GND。我 们只需要检测哪个端口为低电平,即可判断哪个按键被按下了。 行列式高低电平接法,是利用单片机的 IO 口组成行与列,在行与列的每 一个交点处连接按键。故也称为矩阵式按键。电路结构如下所示:
" \; E% ~: z5 J9 { \$ e+ c0 V0 a3 t' n5 f8 y7 n1 ~
这种按键的识别方法,我们会在第 5 个知识点上详细讲解。
9 ^# i6 ]' i" g0 I: p四、 单片机识别按键的一般思路: 一般情况下,单片机识别按键的目的是识别当前按键的状态,意 思就是说,一要识别是哪个键动作了(键码),还要识别当前按键是何状态,也称为有效方式,当然了这里的状态大多是与时间有关 的,并执行相应的动作。比如,开发板上独立式按键实验,当按键 按下并抬起时,LED 被点亮。这是最简单的识别。因为是一支按键, 所以不用识别是哪个键被按下,只需识别按键的状态。一般的按键 状态有以下几种:按下,抬起,长按,组合,长按多长时间等等。 - H; @+ N" q! E, E' o! Z ~
一个完整的按键动作必须包含下面四个阶段: 按键按下->按下消抖->按键抬起->抬起消抖
. f! S5 [( S7 d4 g. X
! d% U" ?! E7 s% |. U8 K在单片机与按键接口程序中,往往先进行按下消抖,而对按键状态的 判断就是指按键处理了。这里的按键处理不是执行相应的动作,而是 区分按键此刻处于何种状态,并改变相应状态变量的值,以便程序其 它地方通过检测相应的按键状态变量去执行相应的动作。比如,我们 可以把按下并抬起的短按点亮 LED,改成长按一段时间点亮 LED。总 的来讲,单片机识别按键就分为三个阶段:按键消抖---按键处理--- 按键执行。这个思路适用于所有形式的按键。至于为什么要消抖?是 因为我们在操作按键时,不可能立即按下或抬起,机械式按键接触面 不是立刻就接触或断开的,而单片机的检测速度特别快,这样往往会 发生误判,因此,我们要等待电平稳定了,再去处理按键。消抖的方 式很简单,就是利用延时,等待一个稳定电平的到来。 : D- r0 U# X6 C" M) |% C
H:表示行;L:表示列; ( u! J7 u5 o0 Z! o
% I. V0 I( V' ]) m2 v
| L0 P13 | L1 P12 | L2 P11 | L3 P10 |
, K) {+ L4 {( D! e+ ?7 [& Q- W* p | H0 P17 | 0 | 1 | 2 | 3 | 5 `8 }) S+ O4 s1 z% b# P
| H1 P16 | 4 | 5 | 6 | 7 |
% }1 D/ u3 L- B | H2 P15 | 8 | 9 | 10 | 11 |
. x" t% M; \# J. G5 D. I. c | H3 P14 | 12 | 13 | 14 | 15 | * \; |8 h$ d$ S; q7 V- N' [4 ~
| # A j2 y M: j+ l# B
| 1 g: w: U( m6 t
|
9 O* h$ I1 z9 `2 w0 q
; v# w6 L5 k9 g2 [/ q |
9 c+ ~ ^. G9 q; ~8 c* a" H2 f |
2 [4 M6 N0 v* V: e) b6 G3 N- b | & Z9 m! ?0 A2 k
|
我们先测试列,测试列时,把行控 IO 设置为 0,列空 IO 设置为 1 即:P1 = 0X0F;此时若有按键被按下,我们可以得到 4 组编码: 0X07,0X0B,0X0D,0X0E;每一组又对应列的四个按键。 然后我们再测试行:P1 = 0XF0;又可以得出四个按键编码,这样就可以判断是哪个键被按下了。这里依然是抬起有效。
" v5 V5 u, \5 {$ F/ ]六、 单片机程序设计思想之一 动态扫描 % M* T- n! P+ U6 l9 R! j8 x
|