EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
第12讲 矩阵按键 知识点:
8 w' P8 n" J% ?/ }7 k+ o3 c2 J1、 单片机程序的一般结构
0 `" k% ~; j: Z, P$ d, T2、 keil 基本使用 } Q. H G7 e; S L" V
3、 单片机识别按键的注意点
) ~/ z1 F' A2 C$ H( R2 ~3 X4、 识别矩阵按键的一种方法$ i) V# T/ q" g9 Z/ W8 ?
$ Z9 z# f: k, q8 e9 H( s一、单片机程序的一般结构
/ R V5 }" w6 `+ d" E7 H1、前后台结构 前后台结构是最常用的结构。所谓前后台结构就是主循环+中断的方式,主5 t0 ?0 A: y9 [8 Y* o$ F* Y
循环称为后台,前台就是中断程序。主循环用 while(1)或其它死循环结构轮询( V4 ~% T/ X: E8 r. T, N2 j; d( J
任务,而前台负责处理实时性要求较高的任务,或者外部中断任务,一般把按键 扫描、显示扫描放在定时中断里。
. S# R. Y1 Y$ j1 B2 Q4 e2、占用式程序与非占用式程序
$ M0 j- J; C7 Z$ L9 T; d凡是用 while、for 等循环语句实现的程序都称为占用式程序。占用式程序的特 点是 CPU 必须执行完所有的循环任务才能退出,除非有中断发生,比如我们做的 独立按键处理程序就是占用式程序。在单片机程序设计中要尽量避免设计占用式 程序。与其相对应的是非占用式程序,非占用式程序能提高 CPU 的使用效率,让 所有的任务都能及时得到响应。
/ s7 b8 D8 P S二、keil 基本使用
6 Y P* Y* E, |1、点击工程文件图标,进入源代码编辑区。: R* m. D+ k/ r( B+ H
2、保存、编译、生成 hex 文件- ~( j L$ `' A( A0 T
3、下载、运行 2 I7 _ g- ]7 H. E; v* E& N
/ k, E* h* V- d2 t/ y9 l
三、单片机识别按键的注意点
, e+ q) o4 o: b) L2 K识别哪个键被按下(通过读取键码的方式)、识别按键所处的状态(有效方 式),常用的有效方式:抬起有效、按下有效、组合有效、长按有效等, X% B, p/ Z4 Y
) v+ l& \7 L% e O$ Z6 |# X
四、识别矩阵按键的一种方法
w+ S1 H, | F- p+ ]' W& {0 o矩阵式按键接法,是利用单片机的IO 口组成行与列,在行与列的每一个 交点处连接按键。故也称为矩阵式按键。电路结构如下所示:
" ?- z; U, h* `# p- B( Z" R
file:///Z:/TEMP/msohtmlclip1/01/clip_image002.jpg0 B! p3 J" I) O9 M1 x9 H( K
这种按键的识别方法,我们会在第 5 个知识点上详细讲解。 2 g& o( n1 V! r: K$ K1 r
0 h# Y+ R- O6 r( i! u
& d. x; O; C8 Z9 e" l9 g五、单片机识别按键的一般思路:
9 C1 r% d' N5 h2 X一般情况下,单片机识别按键的目的是识别当前按键的状态,意 思就是说,一要识别是哪个键动作了(键码),还要识别当前按键 是何状态,也称为有效方式,当然了这里的状态大多是与时间有关的,并执行相应的动作。比如,开发板上独立式按键实验,当按键 按下并抬起时,LED 被点亮。这是最简单的识别。因为是一支按键,所以不用识别是哪个键被按下,只需识别按键的状态。一般的按键 状态有以下几种:按下,抬起,长按,组合,长按多长时间等等。
, ?- B ~2 A" c" i2 R# y* k* W7 a: u
( n! ^2 z9 ?! j' H* J2 {一个完整的按键动作必须包含下面四个阶段: 按键按下-à按下消抖-à按键抬起-à抬起消抖 在单片机与按键接口程序中,往往先进行按下消抖,而对按键状态的 判断就是指按键处理了。这里的按键处理不是执行相应的动作,而是 区分按键此刻处于何种状态,并改变相应状态变量的值,以便程序其 它地方通过检测相应的按键状态变量去执行相应的动作。比如,我们可以把按下并抬起的短按点亮 LED,改成长按一段时间点亮 LED。总的来讲,单片机识别按键就分为三个阶段:按键消抖---按键处理--- ! X; M% |) W* O7 J& z9 W
按键执行。这个思路适用于所有形式的按键。至于为什么要消抖?是 因为我们在操作按键时,不可能立即按下或抬起,机械式按键接触面 不是立刻就接触或断开的,而单片机的检测速度特别快,这样往往会 发生误判,因此,我们要等待电平稳定了,再去处理按键。消抖的方 式很简单,就是利用延时,等待一个稳定电平的到来。
( l, J6 r! Q* i. a1 t- @; W/ ]
" f4 U' S4 K# `H:表示行;L:表示列;- P E D2 B% ` z5 @
7 S" }0 q& m6 q1 j7 z* Y6 \4 |$ h) i- @7 n4 A0 B2 d8 W6 s& V
| L0 P13
; ]2 S6 p/ v1 I, c4 r2 G" ~ | L1 P12 C6 y5 D( m, n5 s8 s* L1 x
| L2 P11
! ~/ u2 Y# K0 f# j% T5 n' d. K | L3 P10- e3 {. v5 S$ M. j/ Q% O7 w
| 9 ~' ]; J" ?) D( Q
| H0 P17
. Z$ W9 J# o- L! W) F9 Z0 t | 0
i) C. e h% m" O" l2 K: q | 1
1 S9 u5 o) [7 n) o# p | 2
) a2 D( w4 Q/ y# R! x5 Q | 3
% H. ?4 _3 d5 V/ ?/ } |
) k8 k8 ~/ {! s4 _2 q" y5 F* b4 T | H1 P161 p: P5 \ F! C! x$ S
| 4
( @4 f! e/ C& j, ]) K* ^& y | 5/ B: n$ I K+ L2 S3 }
| 6+ j m& W. d6 y( O }' J
| 7. y2 V& w: Q7 F" w/ L4 c# B8 n; p
| |
H2 P15
0 R9 j- M1 {, T | 8* a* g* _' e# \/ ~6 p3 S! Q% o
| 9
! T& d) d2 T: `9 h" x. H) k | 10$ A& p/ D! v9 B4 b& C
| 11) m5 T' [: Q9 Y! G, I
|
9 M- n) {/ n$ g | H3 P14
4 ]* l4 N; P5 p% ^- y0 }7 H | 12" C L0 p% O4 [
| 13
$ o1 }* ~1 Z0 j# V4 I | 14
+ b# i) u2 W* L: r6 V, I | 15
# \3 A+ P; F: E- A. M# B | 1 G, t( q7 F2 K; _" ?
|
) w/ E0 t! U2 {- }/ D+ P+ a2 b1 U | 3 e/ p! j* k9 d9 W X) s. S1 k2 p
| 9 [) g) n8 w2 J. {- \* P
| 3 X' {& S+ F0 j9 E, m
| 6 d! e) O& a8 `5 P; _7 Y2 v0 S
| 2 S) @# t. Q$ {& n/ j
| 我们先测试列,测试列时,把行控 IO 设置为 0,列空IO 设置为 1
: T8 K' e8 m8 w" N2 u0 Y即:P1 = 0X0F;此时若有按键被按下,我们可以得到 4 组编码:3 H! w' V* z2 H; r
0X07,0X0B,0X0D,0X0E;每一组又对应列的四个按键。然后我们再测试行:P1 = 0XF0;又可以得出四个按键编码,这样就可以判断是哪个键被按下了。这里依然是抬起有效。/ ]8 F$ _1 v* i5 F3 V
|