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

单片机教程25单片机键盘接口程序设计

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
   键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。按钮开关的抖动问题/ W1 ~% n% W1 E: c  K
组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下图中,当开
$ |7 [6 s" n& G- |" K<键盘结构图>% a) u( {) z  N5 u3 r) [

( `/ P, t; ]2 f( e6 ?  V            图1
( A1 K) {' W# _. Z

) A9 f6 |- C! ^' n7 ~1 U- N3 Y            图2% `% W8 G9 d, a4 a0 Q8 W
关S未被按下时,P1。0输入为高电平,S闭合后,P1。0输入为低电平。由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。0输入端的波形如图2所示。这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。
2 t+ [1 @' P3 s5 q5 X% s/ G( p1 q0 H为使CPU能正确地读出P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。单片机中常用软件法,因此,对于硬件办法我们不介绍。软件法其实很简单,就是在单片机获得P1。0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。0口,如果仍为低,说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。而在检测到按钮释放后(P1。0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。
+ u4 z2 P: _' L  W2 ~键盘与单片机的连接: T5 ~2 b3 q' @5 H! a
4 L  C/ Y: |% O: L! T  ^
            <键盘连接>4 Q5 o! t' r7 D5 v% `- s: q7 j3 d
            图35 J" S* y# _( V9 c  s7 Y& \

: |" T  @- s& Q            <单片机与键盘接口图>) L9 g  t+ H( t& E& d! a
            图4
5 C$ o0 k" ~# K. k( L6 m
1、通过1/0口连接。将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入对应的键处理。下面给出一个例程。其功能很简单,四个键定义如下:. |/ o! ~6 h% _# s
P3.2:开始,按此键则灯开始流动(由上而下)5 I( H* p3 F8 C; [
P3.3:停止,按此键则停止流动,所有灯为暗
. v) F  l8 ]1 W* tP3.4:上,按此键则灯由上向下流动% I& T% Z3 f( L. W
P3.5:下,按此键则灯由下向上流动
) i8 V5 r" _5 h4 lUpDown EQU 00H ;上下行标志
( R$ s* _! ~( h3 H+ d' W6 QStartEnd EQU 01H ;起动及停止标志
5 O$ n! P7 O  Z  O7 a2 ~LAMPCODE EQU 21H ;存放流动的数据代码
' }* ]3 E0 O2 i- t1 f5 eORG 0000H
6 I  x- h; c: i+ \AJMP MAIN
2 W  }* w6 x6 u0 @6 y' l" aORG 30H( W) ]3 r: p+ ^) x& W6 L; |% x
MAIN:) J" f! h3 ?3 k( \% @4 @" [+ k$ R
MOV SP,#5FH9 f/ W6 O9 l: b$ O0 w" N4 v1 W; m
MOV P1,#0FFH
7 t2 p, n' X* Z3 A! GCLR UpDown ;启动时处于向上的状态) S0 D1 }1 q5 h
CLR StartEnd ;启动时处于停止状态
( I/ _3 L0 x1 t4 w  r; n" NMOV LAMPCODE,#0FEH ;单灯流动的代码
1 d4 n7 Y" Q* b" L3 R1 i6 HLOOP:5 N9 b. G) X. i0 h! ?4 G
ACALL KEY ;调用键盘程序3 m) L1 p: z5 B3 X( q1 q
JNB F0,LNEXT ;如果无键按下,则继续
3 C4 b: E0 P  |" AACALL KEYPROC ;不然调用键盘处理程序+ q  j0 c; _: ^3 v6 o! k1 A
LNEXT:
  }+ K, B8 X2 n% _1 \ACALL LAMP ;调用灯显示程序
4 ?" ]! a. w+ H5 ?: `1 bAJMP LOOP ;反复循环,主程序到此结束: V+ A* Y: n. f
DELAY:
! I" c/ V$ r4 [/ A& X+ `MOV R7,#100
7 v9 ]* }  [: w3 _2 v$ \4 ?D1: MOV R6,#100$ F) L" G' t$ b. V# }( i2 v/ {( D
DJNZ R6,$
3 e- W" w. C3 F4 J& t2 {; I8 q+ ODJNZ R7,D1
# M9 |. Z0 ?, H' h% PRET& y( V7 g* S5 ^! ~
;----------------------------------------延时程序,键盘处理中调用
% K, S9 g! x4 U) nKEYPROC:5 f+ t- D: K, e2 h
MOV A,B ;从B寄存器中获取键值
! }3 |$ h7 ~' A+ G! U, VJB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)1 O, @: x1 ~4 i3 H5 Y- Z
JB ACC.3,KeyOver
* `( L! P! a' [* B* ]) s0 Q8 iJB ACC.4,KeyUp
6 d+ d, q3 k: z% f( \. M; ], OJB ACC.5,KeyDown9 X+ o1 u5 H9 b9 p+ @2 S6 ]& k" R' `% l
AJMP KEY_RET; t' h( n: z- q
KeyStart:6 v$ o/ M9 H  L  k6 l/ K
SETB StartEnd ;第一个键按下后的处理4 J, F& P- u1 ?1 x# {5 X0 F
AJMP KEY_RET2 p8 n. D4 n/ t% M
KeyOver:
* @1 p- S+ f8 K: `CLR StartEnd ;第二个键按下后的处理
$ s! w9 E+ Y: \$ ~; IAJMP KEY_RET! O/ d8 n. ?# R8 Z# A
KeyUp: SETB UpDown ;第三个键按下后的处理# f4 l3 w1 n# m5 N, I  W
AJMP KEY_RET$ V4 m* D! W* F4 j
KeyDown:8 T: }1 R; Z$ T
CLR UpDown ;第四个键按下后的处理7 q, h- u3 T& Q) p2 ]0 }
KEY_RET:RET
) E, o3 n$ ~" \' [KEY:
$ G- |" [& Z, Z9 x) D$ YCLR F0 ;清F0,表示无键按下。: z% M' C# a  g: q) V
ORL P3,#00111100B ;将P3口的接有键的四位置1
! v- v) w; L! g' r& D9 I0 ?MOV A,P3 ;取P3的值
' U& E% v$ c7 |' S. k, R/ VORL A,#11000011B ;将其余4位置16 W. y1 P. W/ X5 d" b
CPL A ;取反
; H+ P+ p# a: G3 R6 P8 {2 D2 _JZ K_RET ;如果为0则一定无键按下6 E/ N5 F6 u7 q" [
ACALL DELAY ;不然延时去键抖9 M" l' l! C1 n8 G2 e
ORL P3,#00111100B
' ?8 g/ Z! S) O5 R( rMOV A,P3
1 L+ c" {* V: mORL A,#11000011B
1 @& Q; \6 h2 y% @) g8 ~CPL A% e4 P' Q' A( M! c+ X  S% q
JZ K_RET. g9 ^! ~" x4 ~+ t  f- L
MOV B,A ;确实有键按下,将键值存入B中" @7 ?4 h- T# ]1 U8 ]' c: S
SETB F0 ;设置有键按下的标志
. ]% A8 p* x3 {, z, v& MK_RET:
! X- M7 o; T- E- iORL P3,#00111100B ;此处循环等待键的释放
8 Z& x! r" _  q1 I/ M- n9 f* VMOV A,P3
# ?  F# D4 o7 c4 I2 nORL A,#11000011B$ M5 l) Q3 y7 x$ E
CPL A4 C6 f9 R' n. b
JZ K_RET1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回4 a9 ~: `* o4 N) x2 {
AJMP K_RET4 j% f; X7 r' K6 L$ ~& a1 M, S+ H8 n% s
K_RET1:
$ ~/ u  L4 @9 [2 g: _# E. zRET& _9 X5 n; H) |; {2 a
D500MS: ;流水灯的延迟时间
3 T' h  `# [8 ?6 Z9 R0 m9 t  z* ~* tPUSH PSW" L7 L5 M& ]( t& W+ e0 F
SETB RS0
/ A+ c) \; s( m, jMOV R7,#200
8 G$ p5 Y) S8 a' E5 U# L/ J1 dD51: MOV R6,#250- k6 L" r' M" @; ]; |* X( a
D52: NOP
" {) ]! e' N; [1 }* qNOP
2 ?7 V+ z0 F2 p5 q# }) P: m. {NOP2 {  W% ]0 @/ c; S
NOP
5 z# N  D) n5 v" VDJNZ R6,D52
1 w% ]- `" v# v$ T* J  dDJNZ R7,D51
  z3 b5 t" |9 QPOP PSW
* U& B4 I- F8 jRET
2 i7 P. I8 n; ?" F# R& F% KLAMP:3 U) N4 L. T$ H  U& p2 L
JB StartEnd,LampStart ;如果StartEnd=1,则启动
" `& r6 b! O+ c4 sMOV P1,#0FFH! w+ ^: y4 X: z) j0 j0 R
AJMP LAMPRET ;不然关闭所有显示,返回
! a1 T9 Z$ B; o+ `  d- d- t! u/ @' |LampStart:& M! j# J& F- {( i
JB UpDown,LAMPUP ;如果UpDown=1,则向上流动
* x$ O! g6 ~9 `4 ^MOV A,LAMPCODE
) _# p3 _( y  }) S$ L3 qRL A ;实际就是左移位而已2 P3 v' ?  j' e* g
MOV LAMPCODE,A- N, D1 i' @- C; M) }) l# s
MOV P1,A
5 q5 h& k( H) x1 y( `LCALL D500MS
% }1 i6 W+ [  D& HAJMP LAMPRET
; q" l. R8 k7 G# l. A. t- CLAMPUP:
' r7 c$ M4 b5 kMOV A,LAMPCODE. t- r, ~& G  @( E% p4 y9 p
RR A ;向下流动实际就是右移. S& t! l3 H" V) b
MOV LAMPCODE,A3 G- q& K3 E2 C3 U& Q. w% O
MOV P1,A
# G& A2 o! C7 M# @LCALL D500MS
4 ?& L7 p) h2 S4 z  R% J9 vLAMPRET:
2 J5 H' \! s* y1 a  `  ?RET) M/ B2 h7 V& }/ E
END. g6 k; W8 \/ p6 `& t) x+ u; |. T7 I1 k
以上程序功能很简单,但它演示了一个单片机键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。
! [. x4 j9 v: Q3 l7 j* {+ p2、采用中断方式:如图4所示。各个按钮都接到一个与非上,当有任何一个按钮按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中持续地循环查询,如果有键按下,单片机再去做对应的处理
% ]( |# v0 ]; U

该用户从未签到

2#
发表于 2022-8-11 11:25 | 只看该作者
谢谢楼主,很不错的东西

该用户从未签到

3#
发表于 2022-8-11 14:21 | 只看该作者
谢谢,看到了很不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-7 11:40 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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