目录
矩阵式键盘的
行线
、列线
分别接并行输出口
和并行输入口
①可以先使所有行同时为低电平
②再检查是否有列线也处在低电平
第一步:判断有无键按下
使输出端口各位均输出为0,即相当于将所有各行都接地。
然后,从输入端口读入数据,如果读得的数据不是FFH,则说明必有列线处于低电平,从而可断定必有键被按下。
此时,为了消除键的抖动,可以调用延迟程序,然后再判别具体按下的是哪个键。如读得的数据是FFH,则程序在循环中等待。
WAIT:MOV AL,00H
MOV DX,OUTPORT ;输出端口
OUT DX,AL
MOV DX,INPORT ;输入端口
IN AL,DX
CMP AL,0FFH ;比较是否是全1(高电平)
JZ WAIT ;如果是(无键按下)则循环WAIT
DONE:CALL DELAY ;否则延迟20ms去抖动
第二步:判断哪一个键按下
开始时,程序先将键号寄存器清零
,将计数器设置为键盘行的数目,然后设置扫描初值
。
扫描初值11111110使第0行为低电平,而其他行为高电平。
输出扫描初值以后,马上读取列线的值,看是否有列线处于低电平。
若无,则将扫描初值循环左移1位,变为11111101,这样使第一行为低电平,而使其他行为高电平。
同时使键号为8,即从第2行上第1个键开始检查。此外,计数值减1…如此下去,一直查到计数值为0。
PROG:MOV BL,0 ;键号寄存器清0,按键编号
MOV CL,0FEH ;设置扫描初值,使第0行为低电平,其它行为高电平
MOV DL,8 ;计数值为8行
FROW:
MOV AL,CL
MOV DX,OUTPORT ;输出端,除第0行,全为高电平
OUT DX,AL
ROL AL,1 ;循环左移一位,使下一行为低电平,其余全为高电平
MOV CL,AL ;将AL的内容赋值个CL,CL在最开始设置的扫描初值
MOV DX,INPORT
IN AL,DX ;读入列线的指令
CMP AL,0FFH ;如果是FFH,说明该行不存在按键
JNZ FCOL ;如果不是FFH,跳转
ADD BL,8 ;设置下一行的按键+8(即本行结束,从下一行第一个按键开始)
DEC DL ;总共8行,执行过一行,减去一行
JNZ FROW ;如果不相等0,则跳转
JMP DONE ;相等则无条件跳转
FCOL:
RCR AL,1 ;8位从列线上读入的值(将右移的数字移入到CF中)
JNC PROCE ;CF不为1,为0说明找到了按键
INC BL ;+1一列一列寻找按键
JMP FCOL
PROCE:
... ;键命令处理程序
DONE:
... ;后续处理程序