单片机键盘原理和实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
\\\§8.3 键盘接口技术
一、键盘输入应解决的问题
键盘是一组按键的集合,它是最常用的单片机输入设备.
操作人员可以通过键盘输入数据或命令,实现简单的人机通讯。
键是一种常开型按钮开关,平时(常态)键的二个触点处于断开状态,按下键时它们才闭合(短路)。
键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件译码器实现并产生编号或键值的称为编码键盘,
如:ASCⅡ码键盘、BCD码键盘等;
靠软件识别的称为非编码键盘。
在单片机组成的测控系统及智能化仪器中用得最多的是非编码键盘。
本节着重讨论非编码键盘的原理、接口技术和程序设计。
键盘中每个按键都是—个常开关电路,如图所示。
1.按键的确认:P1.7=1 无按键;
P1.7=0 有按键;
2.去抖动
去抖动的方法:
①硬件去抖动采用RS触发器:
优点: 速度快,实时,
缺点: 增加了硬件成本
②软件去抖动采用延时方法
延时5—10ms 延时5—10ms P1.7=0 确认P1.7=0 P1.7=1 (去前沿抖动) (去后沿抖动)
二、独立式键盘
每个I/O口连接一个按,S1 P1.0
S2 P1.1
……………………….
S8 P1.7
软件:
START:MOV P1,#0FFH ;置P1口为高电平
JNB P1.0, RS1 ; S1按下,程序去执行RS1
JNB P1.1, RS2 ; S2按下,程序去执行RS2
JNB P1.2, RS3 ; S3按下,程序去执行RS3
JNB P1.3, RS4 ; S4按下,程序去执行RS4
JNB P1.4, RS5 ; S5按下,程序去执行RS5
JNB P1.5, RS6 ; S6按下,程序去执行RS6
JNB P1.6, RS7 ; S7按下,程序去执行RS7
JNB P1.7, RS8 ; S8按下,程序去执行RS8
AJMP START ; 继续扫描按键
………….
RS1: AJMP PK1 ;
RS2: AJMP PK2 ;
RS3: AJMP PK3 ;
RS4: AJMP PK4 ;
RS5: AJMP PK5 ;
RS6: AJMP PK6 ;
RS7: AJMP PK7 ;
RS8: AJMP PK8 ;
AJMP START ; 无键按下,继续扫描…………………
PK1: ……….. ;按键S1功能处理程序
AJMP START ;处理S1按键后, 继续扫描PK2: ……….. ;按键S2功能处理程序
AJMP START
………………….
PK8: ………………;按键S8功能处理程序
AJMP START ; 处理S8按键后, 继续扫描优点: 连线简单,程序容易.
缺点: 太浪费资源
适用于按键较少、I/O口空闲的场合。
三、行列式非编码键盘接口方法
按键较多时,一般采用行列式键盘.
采用扫描方式,软件扫描方式有三种:
程序扫描方式: 当CPU空闲时,扫描键盘,判断有无键按下.
定时扫描方式: 利用CPU的定时器,每隔一定时间扫描一次键盘.
中断扫描方式: 在硬件上采用中断,有键按下时,产生中断,
由中断服务程序来处理.
下面是16个按键,构成的4×4键盘
行线: 四根,接P1.0---P1.3
列线: 四根,接P1.4---P1.7
程序扫描法原理:
P1.0---P1.3输出低电平,读P1.4—P1.7,
若全为1,无键按下
若不全为1,有键按下
②在有键按下的情况下,进一步判断是那个键按下
使P1.0---P1.3依次输出低电平,读P1.4----P1.7
判断有无键按下子程序, 程序名: KAP键盘查询子程序
KAP: MOV P1,#0F0H ;行线输出低电平,列线输出高电平
MOV A,P1 ;P1口读入A
CPL A ;取反
ANL A,#0F0H ;取高四位,即P1.4---P1.7
RET
程序出口: A=0, 则无键按下.
A≠0 则有键按下.
去抖动-----------延时10ms子程序: 程序名D10MS
D10MS: MOV R6, #14H;
DL: MOV R7,#0FFH;
DJNZ R7,$
DJNZ R6,DL
RET
KINP: LCALL KAP ; 调键盘查询子程序,
JNZ KP1 ; A≠0,有键按下
SJMP END_KINP ; A=0,无键按下,退出按键查询程序
KP1: LCALL D10MS ;延时10MS,去抖动
LCALL KAP ;再次查询键盘,
JNZ KP2 ; A≠0,确认有键按下
SJMP END_KINP ; A=0,误操作,重新查询
KP2为取键值子程序
KP2: MOV R2, #0FEH ; R2为行扫描值
MOV R4, #00H ; R4初值为第0行行首键号
CLR F0 ; F0=0表示正在扫描键盘
KP4: MOV P1, R2 ; 扫描行为低
MOV A, P1 ;读P1
JB ACC.4, L1 ;第0列不为低,则检查第1列
MOV A, #00H ; 为低,则行首键值送入A
AJMP KP5 ; KP5
L1: JB ACC.5, L2 ; 检查第一列
MOV A, #04H ;第一列行首键值送入A
AJMP KP5
L2: JB ACC.6 , L3 ; 检查第二列
MOV A, #08H ;第二列行首键值送入A
AJMP KP5
L3: JB ACC.7 , NEXT ;检查第三列,若为1,则检查下一行
MOV A, #0CH ; 第三列行首键值送入A
KP5: ADD A , R4 ; A A+R4,键值调整PUSH A ;
KP3: LCALL D10MS ; 后沿去抖动
LCALL KAP ;查询按键是否释放
JNZ KP3 ; A≠0 未释放,继续查询
POP A ;键已释放,弹出键值