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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
   键盘是由若干按钮组成的开关矩阵,它是单片机系统中最常用的输入设备,用户能通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。按钮开关的抖动问题$ B* c. i9 L. B2 z4 R9 ?
组成键盘的按钮有触点式和非触点式两种,单片机中应用的一般是由机械触点组成的。在下图中,当开
2 ~5 J. |* m  M3 c7 O! L0 k<键盘结构图>
9 G0 J1 `, d5 W1 [# H: {' x: X; z
1 `* k& V) \  e& p: `" R
            图1$ \% U9 Q  r5 w, T1 _. s

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

* ]7 `+ r# o0 O+ z% d2 b( F6 Q            <键盘连接>, B1 v' U/ Q0 R) \( g# g
            图3
% R" v  @/ _& m, \. B3 U0 c! Y: @
" h8 {$ A4 G0 t( l
            <单片机与键盘接口图>
; U( I$ ]) ^4 f& d/ V$ A            图4
9 ^' j8 _4 A/ G0 X
1、通过1/0口连接。将每个按钮的一端接到单片机的I/O口,另一端接地,这是最简单的办法,如图3所示是实验板上按钮的接法,四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键各程序能采用持续查询的办法,功能就是:检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入对应的键处理。下面给出一个例程。其功能很简单,四个键定义如下:) Z6 ~  N5 s7 L0 L9 Q  o
P3.2:开始,按此键则灯开始流动(由上而下)$ O- u: x! r" I0 C! Y
P3.3:停止,按此键则停止流动,所有灯为暗' U0 K3 R5 U. ~$ @  e
P3.4:上,按此键则灯由上向下流动
6 J2 d4 v* [' E, }P3.5:下,按此键则灯由下向上流动
% S$ r, K* w# H* XUpDown EQU 00H ;上下行标志& ]0 F/ y) l9 E8 l9 }+ s& ^
StartEnd EQU 01H ;起动及停止标志
+ ~1 R2 Q% [, T2 X' K$ \; }' vLAMPCODE EQU 21H ;存放流动的数据代码
5 t. p8 Q$ `4 |ORG 0000H
5 d+ y( `/ R! J, P! `. s5 ?AJMP MAIN
/ \$ ]4 F! F$ R  VORG 30H; X- m1 Z. @' J- V
MAIN:2 G* F  G. c3 B! D' c6 \. k4 Y
MOV SP,#5FH8 q1 y4 W5 Z0 ^6 F
MOV P1,#0FFH' g9 p8 H2 h* E/ N7 @7 ]- g
CLR UpDown ;启动时处于向上的状态
) c" n+ l% U/ V2 J2 I3 N- Z$ hCLR StartEnd ;启动时处于停止状态
" V  m) u3 V2 M; a& lMOV LAMPCODE,#0FEH ;单灯流动的代码
2 b/ }3 k2 [2 p! Y7 J9 oLOOP:1 k9 e6 \- q7 g/ s& ?8 L; i
ACALL KEY ;调用键盘程序
4 Z3 n; ]0 J9 ^7 R1 UJNB F0,LNEXT ;如果无键按下,则继续
% {* X! Q  n& z* l' L( [ACALL KEYPROC ;不然调用键盘处理程序
, r6 y3 D9 {) d3 WLNEXT:1 }0 X# Z% l3 f
ACALL LAMP ;调用灯显示程序0 {7 s& q5 t+ h1 o- ^4 ?  |
AJMP LOOP ;反复循环,主程序到此结束
0 ^' W: S; q7 L+ x1 n% f$ J; x, YDELAY:& R5 N( L* B/ E$ I7 ?6 `' C
MOV R7,#100
, s- _9 i7 z- D( l  @7 AD1: MOV R6,#100
& I, `) U. u, D+ D. xDJNZ R6,$
7 Q9 n" g% m7 a3 Q) p1 `DJNZ R7,D14 s- ^5 Q: p/ C$ m
RET
2 C" j* C/ N! x& X;----------------------------------------延时程序,键盘处理中调用+ h7 @! d7 T: w
KEYPROC:; U( Z' K( f, q' a9 m% A( N
MOV A,B ;从B寄存器中获取键值3 T0 }! y% W& N, v5 @  r2 g; ]
JB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)
8 Q9 P- z0 z7 I( R& l7 ?& p% jJB ACC.3,KeyOver1 o9 y  P. D- O! h0 g( k
JB ACC.4,KeyUp
% V8 w, H& |1 Q! H& K3 |JB ACC.5,KeyDown6 u! |! G  X+ I7 F3 z* N
AJMP KEY_RET7 Q5 L# J$ x( ^% t' M
KeyStart:/ z' Z, Q8 G+ x* j
SETB StartEnd ;第一个键按下后的处理  l6 T/ C7 v3 O4 [4 [
AJMP KEY_RET' M1 U& X3 Z1 K  s0 I' H( @$ _! \. C
KeyOver:
; C+ X3 K' a) f" K; z! zCLR StartEnd ;第二个键按下后的处理& P! E2 u1 Z# _
AJMP KEY_RET
( }: d' W3 i6 b5 p- rKeyUp: SETB UpDown ;第三个键按下后的处理; e, P' `1 H. J9 ^7 Z* a2 `+ g
AJMP KEY_RET9 o4 }* F6 R" W2 A
KeyDown:8 p% R6 L" |: u
CLR UpDown ;第四个键按下后的处理
( U' K1 \0 i, x& ^- L0 r4 B# aKEY_RET:RET
5 l/ P$ B1 L3 HKEY:
! t4 V0 |6 q0 Q* ~CLR F0 ;清F0,表示无键按下。8 c, I; ?: U3 H5 m2 @, \
ORL P3,#00111100B ;将P3口的接有键的四位置16 W8 S; t  X+ C, B5 R9 q
MOV A,P3 ;取P3的值
. M1 |' q' W* R3 kORL A,#11000011B ;将其余4位置1
8 b8 O3 _8 K1 [9 [9 rCPL A ;取反
$ G" S: B+ m. A; V1 S1 x; AJZ K_RET ;如果为0则一定无键按下
( r2 R" [8 X) n5 JACALL DELAY ;不然延时去键抖
) H9 q  c0 p7 `ORL P3,#00111100B
0 A. `1 Y6 b1 Y! [; I- Y9 q# }5 _" AMOV A,P3
7 M. J- U1 @" y0 T! A3 ?; ]ORL A,#11000011B! z% A7 U: e" G7 L' e' U* J
CPL A6 S" D: b1 n( ?" H, }8 g& X
JZ K_RET4 X3 ^& x* x7 [
MOV B,A ;确实有键按下,将键值存入B中, ?% m! y' d/ A, v; \. G. C
SETB F0 ;设置有键按下的标志
, E9 _7 k6 {8 sK_RET:3 f6 @  b% G/ H8 w
ORL P3,#00111100B ;此处循环等待键的释放- V+ A7 P' s# c. U
MOV A,P31 s$ P6 O1 h) l, u$ A
ORL A,#11000011B* c  E! X% m7 u8 z- H( h2 J
CPL A
" z0 c: r! \# l3 e8 N% ?' C2 k: j; XJZ K_RET1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回
8 q# D0 k; N6 cAJMP K_RET
4 j; {8 F1 m) J) A/ n. `/ b$ D( CK_RET1:
& H) q+ t# C5 \! \RET
6 D# p6 o# L) ]$ O$ t1 a: N5 cD500MS: ;流水灯的延迟时间
6 I% ?' B' h( X' T3 k2 VPUSH PSW. [+ o6 w+ _, w5 I% A
SETB RS06 b- ^: a+ x2 L% X; @- v6 |
MOV R7,#2002 P+ J5 L+ `3 [- a9 ^; y4 r7 ~
D51: MOV R6,#250
* `  {4 g* i9 D7 s1 D6 tD52: NOP
5 W. k+ Y7 h! p" X$ BNOP/ v! A4 }' S, D" ^
NOP
' G7 O$ |6 T/ }  B5 r0 w7 r* q9 h! z- wNOP3 d% A+ d3 g! k) K6 S
DJNZ R6,D52& U5 d$ h2 j3 E+ W2 {8 B' h" c
DJNZ R7,D513 Q+ G# K, {/ J* Q( g5 }) c$ k
POP PSW% u) Z8 n& @$ s" [( @+ d
RET0 e: x2 \  `, u' I% {
LAMP:: W6 ]# k; h- ^" l( v
JB StartEnd,LampStart ;如果StartEnd=1,则启动
. T6 |& ~. y1 O! R" \. A" wMOV P1,#0FFH
3 M; p% s0 m; G& x& e3 _! AAJMP LAMPRET ;不然关闭所有显示,返回& A  d. h( {  A* i0 ]
LampStart:
3 z: W: T& b! _+ {JB UpDown,LAMPUP ;如果UpDown=1,则向上流动
. E! m" ^# N5 ~- E  z4 PMOV A,LAMPCODE
" X, o& @6 `  a+ G/ j+ d# lRL A ;实际就是左移位而已
9 P) I7 S4 @- XMOV LAMPCODE,A6 z/ ^3 [* O% q( \9 g. |
MOV P1,A' y0 ^  A7 U9 P: }
LCALL D500MS1 i! J' Q% `( b
AJMP LAMPRET
  E- W0 k( ]* T/ y& QLAMPUP:
' i0 f( ~3 T& p/ L$ YMOV A,LAMPCODE
; u7 m( j; y# f6 ?; QRR A ;向下流动实际就是右移
7 g9 L' C, ~3 F+ v/ \MOV LAMPCODE,A# ^5 m9 B( z1 e( A# G! a0 m
MOV P1,A
, n' J# a3 z7 C8 m- N2 QLCALL D500MS3 k- o- ?2 Z1 N. ]; o. m
LAMPRET:
- S% y) e8 B# I( W; ?RET" u2 m- i/ y) P- P4 F/ v
END. A, g4 E, e. W- y) v1 @( o
以上程序功能很简单,但它演示了一个单片机键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按钮反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,大家能仔细考虑一下这些问题,再想想有什么好的解决办法。
: w  u# Q4 H! [+ D2、采用中断方式:如图4所示。各个按钮都接到一个与非上,当有任何一个按钮按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中持续地循环查询,如果有键按下,单片机再去做对应的处理
9 L; a7 V0 d1 C' L

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-15 01:50 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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