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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
   键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。按钮开关的抖动问题& b3 k, K6 r: W, s+ L: x: V3 V
组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下图中,当开
5 V8 X& `, u! L% K8 I' @<键盘结构图>
6 R1 M; U! h0 O  M9 p8 t% J
7 m2 m8 W( @2 d" M5 }! g2 R
            图1% G3 d/ z' K" m% @% A
7 X2 }2 o0 g- B1 `: _
            图2& R. J* p% g' ]
关S未被按下时,P1。0输入为高电平,S闭合后,P1。0输入为低电平。由于按钮是机械触点,当机械触点断开、闭合时,会有抖动动,P1。0输入端的波形如图2所示。这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全能感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了。前面我们讲到中断时曾有个问题,就是说按钮有时灵,有时不灵,其实就是这个原因,你只按了一次按钮,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了。% D2 ^9 j+ Y$ P. |. |$ q) r
为使CPU能正确地读出P1口的状态,对每一次按钮只作一次响应,就必须考虑如何去除抖动,常用的去抖动的办法有两种:硬件办法和软件办法。单片机中常用软件法,因此,对于硬件办法我们不介绍。软件法其实很简单,就是在单片机获得P1。0口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P1。0口,如果仍为低,说明S1的确按下了,这实际上是避开了按钮按下时的抖动时间。而在检测到按钮释放后(P1。0为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理。不过一般情况下,我们常常不对按钮释放的后沿进行处理,实践证明,也能满足一定的要求。当然,实际应用中,对按钮的要求也是千差万别,要根据不一样的需要来编制处理程序,但以上是消除键抖动的原则。0 A; w) X% Z* u! y6 f0 Y6 `
键盘与单片机的连接1 v; S: P8 m, j- C. q1 f) Q

. Q( V8 n# U! M            <键盘连接>8 |. Y9 F( S3 V* `
            图3: L& ?% P  W; e; [& L6 _
8 b& N9 Z# N' k7 Z7 _& x
            <单片机与键盘接口图>
+ B! |, i2 _  K, W            图4% w/ \$ R1 b0 p- O
1、通过1/0口连接。将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入对应的键处理。下面给出一个例程。其功能很简单,四个键定义如下:* V8 ^' c/ m8 G- F2 E4 @5 T4 B& C
P3.2:开始,按此键则灯开始流动(由上而下)
% H5 m' S$ H' B/ n- h: I" `P3.3:停止,按此键则停止流动,所有灯为暗/ z/ D8 {1 c4 T
P3.4:上,按此键则灯由上向下流动$ |( `( Y) @% |3 h4 O: a) W: h5 f
P3.5:下,按此键则灯由下向上流动" _9 e! i8 `6 Y) j& M
UpDown EQU 00H ;上下行标志( w3 h, u' x: R- S' {
StartEnd EQU 01H ;起动及停止标志5 C* y- A( a/ {4 G1 y2 x
LAMPCODE EQU 21H ;存放流动的数据代码9 |+ C  V' G: U9 N
ORG 0000H
0 N" f  N: u5 KAJMP MAIN; `' ^! b2 s8 Y' j' r, E9 C
ORG 30H+ N% l2 I  r: k$ ^7 S
MAIN:
7 m6 V- n" l# M, Q0 L0 v4 ~4 i) S( UMOV SP,#5FH, J1 u, g- ?  N4 c# L( V# G
MOV P1,#0FFH( r4 o% ]9 J/ k$ Y; h
CLR UpDown ;启动时处于向上的状态
( A6 c: A! K0 k- {; oCLR StartEnd ;启动时处于停止状态
! l9 g1 ~; N7 Z% T( U4 Y; m7 L4 `MOV LAMPCODE,#0FEH ;单灯流动的代码
; N  i" H1 R# R& ~7 ], SLOOP:* |' A9 ~5 C! s2 s6 m; J
ACALL KEY ;调用键盘程序/ W/ r1 |# Q5 L' y) k+ h: W
JNB F0,LNEXT ;如果无键按下,则继续2 a- X" j  q5 @. I5 o
ACALL KEYPROC ;不然调用键盘处理程序7 v3 ^9 v' H7 p7 D+ _
LNEXT:
6 V8 ]8 q9 b% P5 \$ @ACALL LAMP ;调用灯显示程序
7 R. d. G$ V9 G3 nAJMP LOOP ;反复循环,主程序到此结束
+ {8 I5 U& |0 sDELAY:
5 O0 u6 }# c" Z/ Z4 @MOV R7,#100- x, l) m) \9 P0 g( _7 |9 l5 D3 R' ]
D1: MOV R6,#100
  e2 M1 i9 c0 i% q6 y% yDJNZ R6,$
# |( U9 \; B. e* F# tDJNZ R7,D1
9 U+ T9 r3 v! P3 Z4 K# RRET1 \3 _, I! ?, K, ?9 d
;----------------------------------------延时程序,键盘处理中调用
0 A- [0 a3 W. k8 Q2 d- nKEYPROC:8 p1 H1 |. s4 @7 x' Y' Y
MOV A,B ;从B寄存器中获取键值
9 u2 M' U5 o" b8 h% f4 M, PJB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)6 ~) r# h4 L& S+ ^# l- k) l
JB ACC.3,KeyOver  n  c2 W, p0 e* V; K/ [2 G, X+ g( V
JB ACC.4,KeyUp
- w8 P$ Z/ n: \% U8 V$ X% A& zJB ACC.5,KeyDown7 U) ]" o% G$ N
AJMP KEY_RET
! r) z+ ~" S0 G8 H/ pKeyStart:
; m/ K2 v- G+ r; J3 P0 SSETB StartEnd ;第一个键按下后的处理7 e) z! T1 b) U/ v8 v
AJMP KEY_RET
# g& y% [0 K$ c: E5 t) eKeyOver:
8 c  X: K9 ]& vCLR StartEnd ;第二个键按下后的处理/ L/ T/ s: ^( ]& d
AJMP KEY_RET% W( I  F1 S9 \8 l
KeyUp: SETB UpDown ;第三个键按下后的处理9 r# O  T2 k) ^5 V% X
AJMP KEY_RET
6 g; u7 c: P! m" P- @. U0 q( {KeyDown:
) g- Y5 f/ n8 B. s8 MCLR UpDown ;第四个键按下后的处理+ N8 y* M+ i6 C$ L( y3 q5 d
KEY_RET:RET
  ^' \& V* C. S5 {% h: Z7 O% GKEY:$ o9 I- R1 E1 V
CLR F0 ;清F0,表示无键按下。
1 ?! y: B$ w) iORL P3,#00111100B ;将P3口的接有键的四位置1
5 m: u  b- Q  h, k6 u8 dMOV A,P3 ;取P3的值
8 p' L8 }) M3 z+ HORL A,#11000011B ;将其余4位置11 i; E# F$ C1 U7 S2 ~' F$ Q
CPL A ;取反7 l8 W' {9 h1 L' e
JZ K_RET ;如果为0则一定无键按下$ D" r9 D8 w% l3 J" r
ACALL DELAY ;不然延时去键抖
9 x# i' ]2 h( q1 aORL P3,#00111100B
: p0 }& Y( ^! K* Y! d1 k/ L8 XMOV A,P34 x: ?7 @0 t5 R
ORL A,#11000011B0 C. L: \& |" j6 X  x
CPL A$ f, Q1 [' X. V
JZ K_RET+ R1 c# I! W5 n7 ^" W! [
MOV B,A ;确实有键按下,将键值存入B中
7 E3 O" @% ]1 {8 a" kSETB F0 ;设置有键按下的标志# M% I$ t9 S2 G2 c, [4 b. B7 [, r
K_RET:
3 `+ x, k1 V+ ^8 V$ R0 Y) _" E& g4 F. @ORL P3,#00111100B ;此处循环等待键的释放
$ J+ K. ?: C- I+ K( k  qMOV A,P3
2 g+ w6 V" m: I" t' r7 x) HORL A,#11000011B
$ `) |1 Y- y- [" Y. c2 T! ?0 eCPL A7 X, x1 m% e& d- h3 m; A- t2 j$ s. y
JZ K_RET1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回# I/ o8 ?" D& x; U
AJMP K_RET6 u/ m* X' i7 H8 C. B% ^+ D
K_RET1:  D& R6 w9 R, R8 @, x
RET
2 C! [  ?) N0 c+ n( |) ?D500MS: ;流水灯的延迟时间! @2 M0 G- X6 b2 }9 i- S' X9 o
PUSH PSW4 v5 u* j7 d+ f! @% g- `( `
SETB RS04 k8 c! R; Y( v' [# k5 H6 y# L/ m$ A
MOV R7,#200
+ E2 b+ p0 t9 WD51: MOV R6,#250! L; I2 y2 [: W
D52: NOP
) J4 _( ~1 M3 F: @  cNOP
# {$ H, {3 O, l( HNOP
6 H* n6 K  C% I$ {: b" c/ Z% CNOP3 O6 n+ f& F# m6 H! [- [' I
DJNZ R6,D52
1 _) i1 [3 N% Q& C4 l' QDJNZ R7,D51  `2 ]4 G+ D$ n! p
POP PSW
' k# s. g' g3 m) tRET
7 Y8 g* p. q/ r3 U7 A4 j2 [) ]LAMP:
, `) s1 c' u3 I0 dJB StartEnd,LampStart ;如果StartEnd=1,则启动" v4 H' d# i( F
MOV P1,#0FFH
$ f/ ^  }$ t% M' s+ jAJMP LAMPRET ;不然关闭所有显示,返回3 h' o6 m: _+ G' }* I
LampStart:
/ J1 k( Y& Q# V& c$ z4 y+ oJB UpDown,LAMPUP ;如果UpDown=1,则向上流动* M) p9 P) ?, @4 y! a/ T
MOV A,LAMPCODE7 M" {$ Y- k6 _- ^( P
RL A ;实际就是左移位而已
4 a5 }4 z5 e' Z2 c0 y$ OMOV LAMPCODE,A
/ q6 P- @/ u2 q5 dMOV P1,A
) T5 D0 J1 r! e! G) \# K$ B5 t+ sLCALL D500MS
% e2 R2 p0 _, {7 y# V: Q8 QAJMP LAMPRET
- v) T2 h7 b! h- A  RLAMPUP:& x/ y6 c+ m  {/ ?6 m
MOV A,LAMPCODE
' a: Y8 U* L# }1 n. xRR A ;向下流动实际就是右移
2 }- }3 t! w: X# z$ b7 r  AMOV LAMPCODE,A, D# C0 y% ]( X3 q% s* ]7 N
MOV P1,A
3 p9 }" r# A; p. m, c6 _; X" D2 aLCALL D500MS2 T0 D7 A/ {' s% A- C
LAMPRET:+ |2 k- p7 y' a, M2 n) V3 [
RET: I6 o* ~; ~8 V  u: l! o' ?
END6 k; s. B: e% i# x7 j3 j
以上程序功能很简单,但它演示了一个单片机键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。
& C" m8 b$ {" o  [2、采用中断方式:如图4所示。各个按钮都接到一个与非上,当有任何一个按钮按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中持续地循环查询,如果有键按下,单片机再去做对应的处理
& t6 t/ D% Z7 s6 E0 C. W8 U2 w" a

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-30 20:19 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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