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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
   键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。按钮开关的抖动问题0 g# x0 ^! T  F2 h1 t. ?6 @5 _
组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下图中,当开( H" Z; {; ~5 k  h; e/ B: w
<键盘结构图>
' p7 v/ }8 Q7 b% q

* ^# i& R/ j5 O3 e            图11 T  c( t$ u; x4 F+ I( u
$ h3 A+ P8 M# c! a6 b* p
            图24 B  ^/ k! @/ I2 q( a, h( k
关S未被按下时,P1。0输入为高电平,S闭合后,P1。0输入为低电平。由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。0输入端的波形如图2所示。这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。9 c' W, p' H7 A+ I" C
为使CPU能正确地读出P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。单片机中常用软件法,因此,对于硬件办法我们不介绍。软件法其实很简单,就是在单片机获得P1。0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。0口,如果仍为低,说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。而在检测到按钮释放后(P1。0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。
2 ~0 W) V2 K, {! W( n" s/ S键盘与单片机的连接6 P8 ?5 J. X! z, ^  r. |

  l1 x* h1 I! W. H" X/ U& z            <键盘连接>
0 v  k9 g5 c+ i$ }            图3" m- e8 Y+ f* q7 k% U

- Z7 Z: [8 B3 S            <单片机与键盘接口图>; ]- G- j' U+ ^
            图4
1 [7 K8 |# Y3 j
1、通过1/0口连接。将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入对应的键处理。下面给出一个例程。其功能很简单,四个键定义如下:
: i# O" X7 J1 E6 |P3.2:开始,按此键则灯开始流动(由上而下)
- H9 _( E- e" k5 R3 PP3.3:停止,按此键则停止流动,所有灯为暗
1 a! ]7 q8 B1 tP3.4:上,按此键则灯由上向下流动
# r/ h$ v; @1 h# q" m0 C" g. e9 PP3.5:下,按此键则灯由下向上流动$ w- V0 d2 B6 Z) L
UpDown EQU 00H ;上下行标志9 f" q: r/ Y4 ~1 F4 e
StartEnd EQU 01H ;起动及停止标志) j/ f' B  Y2 x
LAMPCODE EQU 21H ;存放流动的数据代码
) p. [% {5 r0 @  o5 h- jORG 0000H9 R/ Z: j% t8 C" ~5 E) N* D
AJMP MAIN
4 M! K, f" R5 i6 ?ORG 30H
2 X  m9 O. u( W4 V( K5 m+ jMAIN:
% K9 m; U) O, UMOV SP,#5FH
( C" E: p; [& G7 v# O. FMOV P1,#0FFH
8 G" h: z( s9 e% n" N% q2 CCLR UpDown ;启动时处于向上的状态- A) A! ~* C; T+ M1 q5 p
CLR StartEnd ;启动时处于停止状态
/ q' g' L5 m, b6 _( q0 t" WMOV LAMPCODE,#0FEH ;单灯流动的代码
8 k" `7 C; k* i6 ?LOOP:
$ R% G2 F; k8 q: y  [9 v- q) NACALL KEY ;调用键盘程序4 N1 F* c$ c  x# `% D# x
JNB F0,LNEXT ;如果无键按下,则继续
* K2 i3 ^; F; qACALL KEYPROC ;不然调用键盘处理程序
5 _/ f3 |( c- Y: OLNEXT:
! I7 g" C$ L2 {% ^% }ACALL LAMP ;调用灯显示程序
0 G/ a$ J8 ~* d5 HAJMP LOOP ;反复循环,主程序到此结束
+ w# u' z6 [1 p+ C' g$ S3 ?, sDELAY:
& y' i2 a: z! w, [+ QMOV R7,#100
' n) |! c% B  ^8 T: ]. OD1: MOV R6,#100
3 S' X- n$ Z+ u* g6 T' i- c+ FDJNZ R6,$8 y- Z; e" |( F8 v: m; X
DJNZ R7,D1
  N% z' I* ~/ J7 n, p2 @) MRET
: k- f9 D5 X! y& U( O% V;----------------------------------------延时程序,键盘处理中调用
' t* M6 A% ^$ Y: m( xKEYPROC:6 r9 G; `- P! S2 g" S, ]- G
MOV A,B ;从B寄存器中获取键值! c8 T5 T; n- [9 B( L3 h6 G/ s
JB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)
  Q4 c+ z* |( nJB ACC.3,KeyOver9 Z0 {+ Q# c4 r
JB ACC.4,KeyUp
, I; L/ Z/ q8 SJB ACC.5,KeyDown
& ^, [1 I1 v- ZAJMP KEY_RET' z1 R, d8 n3 R& C2 o, d
KeyStart:8 j& ^% z( J" g8 J! z6 B0 e
SETB StartEnd ;第一个键按下后的处理
+ {; k- s# @: XAJMP KEY_RET3 I( R2 f! u+ A% F. X/ w4 `1 l
KeyOver:
) ^& Z: Z2 R" h/ uCLR StartEnd ;第二个键按下后的处理
5 _8 \  q* q" Z$ c% ~, aAJMP KEY_RET
* O0 z+ P  k( C1 nKeyUp: SETB UpDown ;第三个键按下后的处理# F- ?4 ]# t6 x7 B  q. k2 I
AJMP KEY_RET  W, T) W: F, Q% t, p
KeyDown:$ {; _9 k4 F! B( X6 s
CLR UpDown ;第四个键按下后的处理
) l+ j* E0 L8 z- iKEY_RET:RET: s, h+ g! X0 ?
KEY:
  W" n+ d; G. LCLR F0 ;清F0,表示无键按下。; A" I* k5 Q2 f4 B  ^9 r  f
ORL P3,#00111100B ;将P3口的接有键的四位置1
6 X+ z8 \3 x' ]# c* q, wMOV A,P3 ;取P3的值' @/ G  i, i& Q8 A
ORL A,#11000011B ;将其余4位置11 Y+ l+ H0 e+ A- W
CPL A ;取反$ K6 H4 B* \: F& b2 N
JZ K_RET ;如果为0则一定无键按下4 k: k8 [1 P2 Z
ACALL DELAY ;不然延时去键抖
3 X8 c" Y3 w4 H9 KORL P3,#00111100B8 A5 B9 j& z2 U
MOV A,P39 m' x5 M6 P' c- A3 N6 W+ J
ORL A,#11000011B
9 d' G) {( }" }$ v+ W/ fCPL A( I4 C- u- Y  Y7 O6 m1 n( `! U. g
JZ K_RET
8 m( w$ F2 B* h/ a  W% uMOV B,A ;确实有键按下,将键值存入B中
$ A! Z  a1 s# F- r  k2 {SETB F0 ;设置有键按下的标志
: s0 ~0 L2 d, }; a" _6 WK_RET:3 d& m6 F3 A0 I8 ?9 R
ORL P3,#00111100B ;此处循环等待键的释放
* f2 n/ A5 k! ?, mMOV A,P3
  f6 ]5 c$ }; \; m2 ]7 n3 Y6 SORL A,#11000011B8 T  ~: X* h! S, T2 Z2 C
CPL A
5 y- g' W/ \) w# |& ZJZ K_RET1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回
5 s! x* n- X$ p: RAJMP K_RET
+ U0 M% f: ]7 y/ V1 Q  jK_RET1:
6 c, I- `" R/ `. }RET
+ ^- C; r( n9 |8 |/ `% Y  T4 cD500MS: ;流水灯的延迟时间9 k! e$ R4 ?( s. @* c9 J' w& q5 I
PUSH PSW/ D( K. X3 M8 L8 V; ^; ~( N; Q
SETB RS0( q3 q4 u! }6 K7 G6 `
MOV R7,#2008 m4 ]6 u' d; f! y8 B/ t* L- [
D51: MOV R6,#250; L0 U% |; T: G4 \" H" ~5 N
D52: NOP
4 p$ O" x6 K0 c8 ^0 QNOP  k: c5 S, {4 t
NOP
8 Z  e0 [+ R! pNOP1 R9 v, j8 u- {1 m% y
DJNZ R6,D52
) h1 q8 ]/ m$ w2 u5 SDJNZ R7,D51
8 z0 w0 E! ~# W% [1 R7 W4 ^POP PSW
: q5 Q5 q0 F. t" w* X  W! m: wRET: C, r# p0 C+ L9 |
LAMP:$ M: e2 f. f& k% Y5 e3 A7 S7 t# W: q
JB StartEnd,LampStart ;如果StartEnd=1,则启动
1 N" \7 B3 h( T  Q0 lMOV P1,#0FFH
$ @3 G6 ?2 e3 d! Q- ^; I2 WAJMP LAMPRET ;不然关闭所有显示,返回% E& b/ z: V4 }0 v5 Y
LampStart:
) f: @, t- t7 h% HJB UpDown,LAMPUP ;如果UpDown=1,则向上流动
# u+ ?, g& [1 a' |' vMOV A,LAMPCODE
. Z7 ?7 U, c3 n% r8 a* f& CRL A ;实际就是左移位而已
! y* d1 a& I; n: KMOV LAMPCODE,A
9 V3 {# W; E3 Z9 x6 t  K* @MOV P1,A
5 G; c/ W8 N) X0 D" O! J" cLCALL D500MS
" {4 O! A- }# m5 A7 k4 }& p# _/ yAJMP LAMPRET
3 i1 n. {6 n, j. ALAMPUP:
! M; p. \7 h# }7 e) zMOV A,LAMPCODE
: [$ f5 y- P% l# u, Q* ^RR A ;向下流动实际就是右移
6 W8 @" h& b' u! y2 eMOV LAMPCODE,A
. Z( d& A% H9 F4 o* v6 p7 fMOV P1,A
% B- i7 Q& H7 y- b" h3 BLCALL D500MS; o; I+ W9 d  ~9 X8 M
LAMPRET:) Y/ T+ O9 g% H
RET+ F. P& O2 \4 W& b
END3 u- j3 G) ^$ @4 b2 ^
以上程序功能很简单,但它演示了一个单片机键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。
3 q2 E6 S" Q) G4 k6 D2、采用中断方式:如图4所示。各个按钮都接到一个与非上,当有任何一个按钮按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中持续地循环查询,如果有键按下,单片机再去做对应的处理
, \! D# }  p' ~* A5 A# b

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 16:19 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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