微机原理与接口技术:键盘接口

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

jnz Exit1 ;是,转Exit1
shr al, 1 ;指向该列的下一行按键?
inc cl
;指向该列的下一个键值
dec ch ;4个按键都测试完了吗?
jnz LoopC
19
jne Goon_
;该列有按键
dec cl
;该列无按键,检测下一列:3(2、1)
jnz Kloop
mov cl, 16
;所有列都检测完成,没有键按下, 返回 0ffh
};
/* 键码定义 */
24
unsigned char TestKey()
{
OUT(OUTBIT, 0);
/* 输出线置为0 */
return (~IN(IN_KEY) & 0x0f); /* 读入键状态 (高四位不用) */
}
25
unsigned char GetKey() {
unsigned char Pos; unsigned char i; unsigned char j; unsigned char k; unsigned char t;
14
【例6-3】4×4键盘按键识别程序
OUT­_COL :列输出端口
IN_ ROW :行输入端口
KeyTable:
; 键值定义
db 0dh, 0ch, 0bh, 0ah ;第1列
db 0eh, 09h, 06h, 03h ;第2列
db 0fh, 08h, 05h, 02h ;第3列
db 00h, 07h, 04h, 01h ;第4列
10
D CB A 93 E6 F82 5 0 7 1 4
矩阵键盘
按键数量大的键盘通常采用矩阵结构。这是一个4×4的小矩阵键盘。利 用74LS374作为输出端口,输出列值。74HC245作为输入端口,输入 行值。 Q3~Q0输出全0,从B3~B0读入,若读入的数据不等于0FH, 表明有键按下;否则无键按下继续查询。
return(KeyTable[i][t]); /* 取出键码 */ } /*else return(0xff); */ } }
27
4
键盘的布局有两种:线性键盘和矩阵键盘。按键数量不多时可以采用 线性键盘,按键数量太多,识别按键需要的时间太长,线性键盘容易 引起按键丢失。
5
线性键盘
利用74HC245双向数据总线缓冲器B端8根线,每根线接一个按键,就 构成8个按键的线性键盘。每根线通过一个10K的上拉电阻与5V相连, 使得按键在没按下时保持高电平。读取这个输入端口的数据,逐位检 测看看哪一位为0,就可以确定哪一个键被按下。 识别键盘上哪个键被压下的过程称为键盘扫描。
6
线性键盘
利用74HC245双向数据总线缓冲器B端8根线,每根线接一个按键,就 构成8个按键的线性键盘。每根线通过一个10K的上拉电阻与5V相连, 使得按键在没按下时保持高电平。读取这个输入端口的数据,逐位检 测看看哪一位为0,就可以确定哪一个键被按下。 识别键盘上哪个键被压下的过程称为键盘扫描。
11
D CB A 93 E6 F82 5 0 7 1 4
矩阵键盘
按键数量大的键盘通常采用矩阵结构。这是一个4×4的小矩阵键盘。利 用74LS374作为输出端口,输出列值。74HC245作为输入端口,输入 行值。 Q3~Q0输出全0,从B3~B0读入,若读入的数据不等于0FH, 表明有键按下;否则无键按下继续查询。
mov ch, 4 ;每列4个按键
LoopC:
test al, 1 ;是该列的第一行按键码?
jnz Exit1 ;是,转Exit1
shr al, 1 ;指向该列的下一行按键?
inc cl
;指向该列的下一个键值
dec ch ;4个按键都测试完了吗?
jnz LoopC
18
jne Goon_
;该列有按键
GetKey proc near
mov ch, 00001000b
mov cl, 4
;列号
Kloop:
; 找出键所在列
mov dx, OUT­_COL ;逐列输出0
mov al, ch
not al
out dx, al
;第4(3、2、1)列输出0
shr ch, 1
mov dx, IN_ROW ;输入行值
23
#define INROW 0x8001 #define OUTBIT 0x8002 extern unsigned char IN(unsigned int port); extern void OUT(unsigned int port, unsigned char v);
unsigned char const KeyTable[][4] = { 0x0d, 0x0c, 0x0b, 0x0a, 0x0e, 0x09, 0x06, 0x03, 0x0f, 0x08, 0x05, 0x02, 0x00, 0x07, 0x04, 0x01
MOV DX,PORT245 ;重新检测
IN AL, DX
CMP AL, 0FFH
JZ K1
;说明刚才检测到的按键是源于干扰,重新检测
8
MOV AH,0
;识别按键
K2: SHR AL,1
JNC K3
;是0转K3,键被按下
INC AH
CMP AH,8
JNZ K2
JMP K4
K3: MOV DX,PORT245 ;重新检测,,等待按键释放
in al, dx
not al
and al, 0fh
17
jne Goon_
;该列有按键
dec cl
;该列无按键,检测下一列:3(2、1)
jnz Kloop
mov cl, 16
;所有列都检测完成,没有键按下, 返回 0ffh
jmp Exit1
Goon_:
dec cl
shl cl, 2 ;键值 = 列×4 + 行
i = 4; Pos = 0x08; /* 找出键所在列 */ do {
OUT(OUTBIT, ~ Pos); Pos >>= 1; k = ~IN(IN_KEY) & 0x0f; } while ((--i != 0) && (k == 0));
26
/* 键值 = 列 X 4 + 行 */ if (k != 0) { if (k==4) t=k-2; else t=(k-1)%4; OUT(OUTBIT, 0); do Delay(10); while (TestKey()); /* 等键释放 */
mov al, 0
out dx, al
; 等键释放
mov ah, 10
;延时10ms,等待释放
21
call Delay
call TestKey
jne WaitRelease ;没有释放,继续等待
mov al, bl
;bl中有键值,返回调用
ret
GetKey endp
22
Testkey子程序扫描键盘,读取扫描码。如果有按键,首先通过延时 10~20ms去除键抖动。延时后再次调用Testkey读入扫描码,如果仍 然表明有按键,则调用Getkey读取键值,并等待按键释放,释放完成, 本次按键识别过程结束。Getkey中调用延时10ms等待按键释放。
dec cl
;该列无按键,检测下一列:3(2、1)
jnz Kloop
mov cl, 16
;所有列都检测完成,没有键按下, 返回 0ffh
jmp Exit1
Goon_:
dec cl
shl cl, 2 ;键值 = 列×4 + 行
mov ch, 4 ;每列4个按键
LoopC:
test al, 1 ;是该列的第一行按键码?
7
【例6-2】
;8个按键的线性键盘,按键识别过程。
;AH中含有键值,如果AH为8则为出错
PORT245 EQU 8000H
KEY PROC NEAR
ຫໍສະໝຸດ Baidu
AGAIN: MOV DX, PORT245
K1: IN AL, DX
CMP AL,0FFH
JZ K1
;无按键,继续等待
CALL D20ms ;延时20ms去抖动
知识点6.3
键盘和显示接口
1
6.3 键盘和显示接口
键盘、显示器是人机交互接口的常用设备。本节以键盘、显示接口为 例说明简单输入接口和简单输出接口与系统的连接方式。
2
知识点6.3.1
键盘接口
3
键盘有各种大小,有4、12、16键的小型键盘,如电话键盘、家电键 盘、手机键盘,还有83键、86键、101键等计算机键盘。 键盘的按键有多种,常用的有机械式、薄膜式、电容式和霍尔效应式 等4种。机械式开关较便宜,但压键时会产生触点抖动,而且长期使用 后可靠性会降低。薄膜式开关可做成很薄的密封单元,不易受外界潮 气或环境污染,常用于微波炉、医疗仪器或电子秤等设备的按键。电 容式开关没有抖动问题,但需要特制电路来测电容的变化。霍尔效应 按键是一种无机械触点的开关,具有很好的密封性,平均寿命高达1亿 次甚至更高,但开关机制复杂,价格很贵。
jnz LoopC
20
Exit1:
mov dx, OUT­_COL
mov al, 0
out dx, al
mov ch, 0
mov bx, offset KeyTable
add bx, cx
;cl的取值范围0~10H
mov al, [bx]
; 取出键值
mov bl, al
WaitRelease:
mov dx, OUT­_COL
IN AL, DX
CMP AL, 0FFH
JNZ K3
K4: NOP
;AH中返回键值,AH=8为出错
RET
KEY ENDP
9
识别按键编程应该注意一点,如果有按键,首先通过延时10~20ms去 除键抖动,然后再次读入扫描码,如果仍然表明有按键,则识别按键, 识别完毕必须等待按键释放,释放完成,本次按键识别过程结束。
12
D CB A 93 E6 F82 5 0 7 1 4
矩阵键盘
按键数量大的键盘通常采用矩阵结构。这是一个4×4的小矩阵键盘。利 用74LS374作为输出端口,输出列值。74HC245作为输入端口,输入 行值。 Q3~Q0输出全0,从B3~B0读入,若读入的数据不等于0FH, 表明有键按下;否则无键按下继续查询。
13
按键识别
首先从输出端口输出列值0,然后从输入端口输入行值,若读入的数据 不等于0FH,表明有键按下;否则无键按下继续查询。 如果有键按下,则逐列输出0,读回行值。如果读入的数据为0FH,表 明该列没键按下,继续检测下一列。否则说明该列有键按下。逐位检 测行值,即可以得到行号和列号。 根据行号和列号,查表,即可得到键值。
jmp Exit1
Goon_:
dec cl
shl cl, 2 ;键值 = 列×4 + 行
mov ch, 4 ;每列4个按键
LoopC:
test al, 1 ;是该列的第一行按键码?
jnz Exit1 ;是,转Exit1
shr al, 1 ;指向该列的下一行按键?
inc cl
;指向该列的下一个键值
dec ch ;4个按键都测试完了吗?
db 0ffh
15
; 扫描键盘
TestKey proc near
mov dx, OUT­_COL
mov al, 0
out dx, al
; 置列线为0
mov dx, IN_ROW
in al, dx
; 读入行线
not al
and al, 0fh
; 屏蔽高四位
ret
TestKey endp
16
; 4×4键盘按键识别程序
相关文档
最新文档