EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
第12讲 矩阵按键 知识点:4 a2 k, X Z( L
1、 单片机程序的一般结构
7 i: `2 A& E9 s$ }! W+ R4 V U( I2、 keil 基本使用
. x4 {- ?' S ?( ]3、 单片机识别按键的注意点
5 P/ k% L- t( d& q3 V4、 识别矩阵按键的一种方法, n2 i4 Y8 q0 U* ?4 g$ |. [ r
4 f& I& ^0 ?) Q; V7 d! Z: U8 [, E, D( ^
一、单片机程序的一般结构
3 `1 Z! z1 p }2 ]' Q n1 ~' O$ z1、前后台结构 前后台结构是最常用的结构。所谓前后台结构就是主循环+中断的方式,主
/ X w/ R @8 Z' w+ f w( o1 P循环称为后台,前台就是中断程序。主循环用 while(1)或其它死循环结构轮询
2 U& v+ p I: b! X+ S; K任务,而前台负责处理实时性要求较高的任务,或者外部中断任务,一般把按键 扫描、显示扫描放在定时中断里。
2 B2 t/ p6 w; M6 F9 e2、占用式程序与非占用式程序6 S' s* u+ C2 ~7 S2 y3 I
凡是用 while、for 等循环语句实现的程序都称为占用式程序。占用式程序的特 点是 CPU 必须执行完所有的循环任务才能退出,除非有中断发生,比如我们做的 独立按键处理程序就是占用式程序。在单片机程序设计中要尽量避免设计占用式 程序。与其相对应的是非占用式程序,非占用式程序能提高 CPU 的使用效率,让 所有的任务都能及时得到响应。7 e2 _ S; o2 s+ O& @# L# M ~( a! K
二、keil 基本使用4 Q7 U }% q8 r- t& u4 E8 \
1、点击工程文件图标,进入源代码编辑区。- ?7 \3 S. C! I
2、保存、编译、生成 hex 文件
/ A& j9 ^! ^7 O( I7 y5 v3、下载、运行
* g" I: h/ \2 q5 \, u: q" l) v8 M0 T" P
三、单片机识别按键的注意点
w4 q/ V4 i8 ]7 K9 Z( N1 k识别哪个键被按下(通过读取键码的方式)、识别按键所处的状态(有效方 式),常用的有效方式:抬起有效、按下有效、组合有效、长按有效等
$ o. O) j ^& b. `6 S6 V/ w$ Y2 b; M, ?/ ^+ K' E" l& y
四、识别矩阵按键的一种方法
; R' F ~7 j t& t" q6 p; ?矩阵式按键接法,是利用单片机的IO 口组成行与列,在行与列的每一个 交点处连接按键。故也称为矩阵式按键。电路结构如下所示:
! ^6 Z( X: u$ p K- H. ]1 y
file:///Z:/TEMP/msohtmlclip1/01/clip_image002.jpg$ @' I" E. J; A% P2 C7 U
这种按键的识别方法,我们会在第 5 个知识点上详细讲解。
4 u! |: k7 s- t" O; y9 U& S8 V5 ^2 G! Z; ~
( z! N' {7 g! w* v8 z
五、单片机识别按键的一般思路:& L( v2 |( K& E+ w
一般情况下,单片机识别按键的目的是识别当前按键的状态,意 思就是说,一要识别是哪个键动作了(键码),还要识别当前按键 是何状态,也称为有效方式,当然了这里的状态大多是与时间有关的,并执行相应的动作。比如,开发板上独立式按键实验,当按键 按下并抬起时,LED 被点亮。这是最简单的识别。因为是一支按键,所以不用识别是哪个键被按下,只需识别按键的状态。一般的按键 状态有以下几种:按下,抬起,长按,组合,长按多长时间等等。8 _/ h/ x6 Q4 D' c: ]! S
' \" l# @7 I7 [! o一个完整的按键动作必须包含下面四个阶段: 按键按下-à按下消抖-à按键抬起-à抬起消抖 在单片机与按键接口程序中,往往先进行按下消抖,而对按键状态的 判断就是指按键处理了。这里的按键处理不是执行相应的动作,而是 区分按键此刻处于何种状态,并改变相应状态变量的值,以便程序其 它地方通过检测相应的按键状态变量去执行相应的动作。比如,我们可以把按下并抬起的短按点亮 LED,改成长按一段时间点亮 LED。总的来讲,单片机识别按键就分为三个阶段:按键消抖---按键处理---
8 Y( k6 @$ G1 g3 c按键执行。这个思路适用于所有形式的按键。至于为什么要消抖?是 因为我们在操作按键时,不可能立即按下或抬起,机械式按键接触面 不是立刻就接触或断开的,而单片机的检测速度特别快,这样往往会 发生误判,因此,我们要等待电平稳定了,再去处理按键。消抖的方 式很简单,就是利用延时,等待一个稳定电平的到来。
9 S9 L8 [" b& i
) n: h& V- H/ w4 `2 ~" ?H:表示行;L:表示列;
. H5 X0 e# H$ y* A; A* C# K5 G : P; _; m, P: z, `# D G
; g( \ j/ i' J: }+ B3 X$ n | L0 P13: C8 \9 V. @: ^* ^8 @
| L1 P12
" O4 s+ J# v. u) z | L2 P11
- z2 r# u: G1 {9 j1 ]/ N$ w2 \/ G | L3 P10
" Q' {% N# }/ X- F1 e | 1 A/ F2 ^8 V" i3 X5 K
| H0 P177 I# L2 P, V7 ]" m8 d0 l5 v% C
| 0
- E P+ _8 j9 t5 \! G6 d | 1
0 W3 y M0 T$ N3 a7 \1 N | 2
C2 z+ x' l( T/ H | 3
! {# i' k9 M8 t, x- L" c |
5 B" P( D; ?; K W, _# D | H1 P164 v8 t1 N% O+ }1 E$ x2 m
| 4
" ~1 Q, ^7 b4 h% {, z+ _% s) m | 5
I0 d- z8 p7 _8 e" d% C5 G | 6
9 T# h3 Y1 s* D8 O | 7) o) ?8 [5 A, ~
| |
H2 P15
% ^0 `. c1 n& b3 w% ?$ V- A | 8
+ q/ j$ z/ ?1 S- Y( w' }& ~ | 9. n2 p' Z3 H: O. H5 @7 [! \; l, X
| 10
7 F, W( ^, ]) t( {7 u f | 11
: {) m+ }! Q- s$ N6 A2 X | + {7 e8 k3 q7 x
| H3 P14. Z5 b' C# p& ?/ |9 q
| 12
0 w# K, S" z% }. z | 13: Y0 y% g& K2 l+ Q* _6 d
| 14, d' E. F# b" p4 W. ]0 I$ X! _ L r
| 15
9 | g3 D2 ^; I |
. O( _" b V* j; ~ L | 4 f. d3 O, g, k
| 7 [7 b; Q, L5 W& M" J
|
# n% X. R& M; a6 {- E- Z |
+ S- ?! u% N. A6 S0 h" p% e! n R | ( R" [' S3 e5 s4 ]% n6 j
|
( G* U0 j. G P) \) v | 我们先测试列,测试列时,把行控 IO 设置为 0,列空IO 设置为 1
) d- W# i' g# `$ f/ \# `即:P1 = 0X0F;此时若有按键被按下,我们可以得到 4 组编码:
6 n; X0 Z# X2 w2 U0X07,0X0B,0X0D,0X0E;每一组又对应列的四个按键。然后我们再测试行:P1 = 0XF0;又可以得出四个按键编码,这样就可以判断是哪个键被按下了。这里依然是抬起有效。+ K/ ^% u5 H- r, O4 ?% J. P
|