EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
第12讲 矩阵按键 知识点: `3 A1 b) L# o2 m: T" h
1、 单片机程序的一般结构
8 A( E4 I' Q7 C8 }; d2、 keil 基本使用 T' d) B4 }# x
3、 单片机识别按键的注意点5 K% S9 d- S' V
4、 识别矩阵按键的一种方法
7 w0 N. w* e1 @1 f7 f
; B. U9 R6 M- u2 B; Y& o# v一、单片机程序的一般结构5 W6 D5 i% u6 t2 `3 J4 i% @6 K
1、前后台结构 前后台结构是最常用的结构。所谓前后台结构就是主循环+中断的方式,主4 L% C S0 @. ~0 U9 Q
循环称为后台,前台就是中断程序。主循环用 while(1)或其它死循环结构轮询
; a; @+ F* v! X4 v: v+ e% o任务,而前台负责处理实时性要求较高的任务,或者外部中断任务,一般把按键 扫描、显示扫描放在定时中断里。, k( w% Q& z! ?' ^8 K+ d# ~- b
2、占用式程序与非占用式程序 W$ U0 `7 F \5 U m/ C& \2 S. I
凡是用 while、for 等循环语句实现的程序都称为占用式程序。占用式程序的特 点是 CPU 必须执行完所有的循环任务才能退出,除非有中断发生,比如我们做的 独立按键处理程序就是占用式程序。在单片机程序设计中要尽量避免设计占用式 程序。与其相对应的是非占用式程序,非占用式程序能提高 CPU 的使用效率,让 所有的任务都能及时得到响应。: x0 t; E+ r& m' _' x
二、keil 基本使用+ ^2 G( M# T) L( G
1、点击工程文件图标,进入源代码编辑区。
+ C, a3 {& T6 _; ? k2、保存、编译、生成 hex 文件( A- N% z) M! W9 ?
3、下载、运行
! j" G& C" Y8 h" _' }
( F) s v6 X4 B; e8 \& c9 d8 j三、单片机识别按键的注意点2 k8 r3 j% A( q. a+ j7 I t4 N
识别哪个键被按下(通过读取键码的方式)、识别按键所处的状态(有效方 式),常用的有效方式:抬起有效、按下有效、组合有效、长按有效等- v$ W/ Z3 ^ a
5 d. H+ O- ~( J' G. I- |# ~四、识别矩阵按键的一种方法
& O" z6 F* o5 b& D3 m+ E: k9 z' P矩阵式按键接法,是利用单片机的IO 口组成行与列,在行与列的每一个 交点处连接按键。故也称为矩阵式按键。电路结构如下所示:
0 N d5 J- }# B6 D; ^: C2 Hfile:///Z:/TEMP/msohtmlclip1/01/clip_image002.jpg
8 o3 [6 t3 q/ ]这种按键的识别方法,我们会在第 5 个知识点上详细讲解。
: H; p4 W' l' f8 F+ ~0 W2 @4 P) o* Y/ I$ B
) ~- J4 \( m! C* C五、单片机识别按键的一般思路:
) I1 A! P8 ]7 {0 L' @! v! ]一般情况下,单片机识别按键的目的是识别当前按键的状态,意 思就是说,一要识别是哪个键动作了(键码),还要识别当前按键 是何状态,也称为有效方式,当然了这里的状态大多是与时间有关的,并执行相应的动作。比如,开发板上独立式按键实验,当按键 按下并抬起时,LED 被点亮。这是最简单的识别。因为是一支按键,所以不用识别是哪个键被按下,只需识别按键的状态。一般的按键 状态有以下几种:按下,抬起,长按,组合,长按多长时间等等。
' ]! H, X! V7 \! d7 M! X- J3 `+ _3 j6 l' O
一个完整的按键动作必须包含下面四个阶段: 按键按下-à按下消抖-à按键抬起-à抬起消抖 在单片机与按键接口程序中,往往先进行按下消抖,而对按键状态的 判断就是指按键处理了。这里的按键处理不是执行相应的动作,而是 区分按键此刻处于何种状态,并改变相应状态变量的值,以便程序其 它地方通过检测相应的按键状态变量去执行相应的动作。比如,我们可以把按下并抬起的短按点亮 LED,改成长按一段时间点亮 LED。总的来讲,单片机识别按键就分为三个阶段:按键消抖---按键处理--- . I+ E$ I: g$ Q# L. d6 l& r
按键执行。这个思路适用于所有形式的按键。至于为什么要消抖?是 因为我们在操作按键时,不可能立即按下或抬起,机械式按键接触面 不是立刻就接触或断开的,而单片机的检测速度特别快,这样往往会 发生误判,因此,我们要等待电平稳定了,再去处理按键。消抖的方 式很简单,就是利用延时,等待一个稳定电平的到来。
; ^& e' P, y9 M6 W- ]* V( |0 `3 W# x, Q: R7 ~8 H: {
H:表示行;L:表示列;, g7 @5 B. o7 I9 o& l, r
+ Z& k" t* G) q! T2 _
2 A% n; s$ _! d6 e8 Q) B3 a- l
| L0 P13
. ]( Y6 W& o" g( V8 A | L1 P12; e$ G) J4 S, e- Y9 N
| L2 P11
; k$ V' a1 r" y& v# J3 |' ?. Z6 Y | L3 P10 Q2 w% G, b: p- ]
|
4 g( ~: Y; m" e; K! @3 n' w% k% I | H0 P17: }! [. c& N8 r& v0 F0 ~
| 0
0 T) ?: X8 a J | 1
/ Z6 W6 t/ `4 Z N | 24 O, c6 |0 R0 z3 P6 J2 P, B8 r9 }4 T
| 3
* D* }% i8 S1 _. l& x& G% _9 M |
1 n4 f# V9 v& o | H1 P16
/ R4 p' Q7 H6 p" v% B+ W; F$ R | 4
. s$ y6 U. g6 R8 q | 5
8 x6 d! B( t4 j5 [6 Z+ o | 6
1 c' c) w, Z( a/ r2 T) V8 x | 7
6 d0 `1 K& q5 i | |
H2 P15$ P1 Q- W7 n- z# t
| 8% j% R5 D% j) y, i. f1 }
| 9
1 R3 n) c# E8 Z4 ?: \ | 10
; ~& Z6 y, k, p) T: a- c | 111 l2 y d. m8 J
| / E0 b9 n t* }! B* B
| H3 P141 D& j1 B: R: S! f5 I4 r
| 12
% s# Q4 r, O3 `& y" L; Q2 Y$ t | 13
3 H/ n( E( k- t; C | 14! i: U6 m; @1 y# g
| 15; a N& U0 P& Z) _8 n1 U
|
2 G# W( O/ I7 i8 H0 W |
+ j) P% i$ d- @: Z | ' J: f9 j& a/ d0 O T7 t( F
|
; _; w4 N) k% D* u% e |
, e+ E7 u. U0 C; |+ i1 y | 4 {8 ]; p0 ]$ M* C2 V
| - D! }1 n, ?/ n/ p4 K% c, i7 B* \1 d
| 我们先测试列,测试列时,把行控 IO 设置为 0,列空IO 设置为 1( r7 o9 V# F* c9 h
即:P1 = 0X0F;此时若有按键被按下,我们可以得到 4 组编码:4 \: @! u7 i( |' L: x$ Y, G
0X07,0X0B,0X0D,0X0E;每一组又对应列的四个按键。然后我们再测试行:P1 = 0XF0;又可以得出四个按键编码,这样就可以判断是哪个键被按下了。这里依然是抬起有效。% r3 O/ g& E( Z8 w3 Q
|