并行接口芯片8255A(含键盘)
8255A芯片相关知识
·
通信
计算机与外设间的交换数据、状态和控制命令的过程。
接口的功能
- 设置数据缓冲以解决CPU与外设之间速度差异所带来的不协调问题
- 设置信号电平转换电路以解决信号电平不匹配的问题
- 设置信息转换逻辑以满足对各自格式的要求
- 设置时序控制电路来同步CPU和外设的工作
- 提供地址译码电路
I/O端口
- 数据端口
- 状态端口
- 命令端口
4*4键盘
扫描
- 检测是否所有键都松开了,若没有则反复检测
- 当所有键都松开了,再检测是否有键压下,若无键压下则反复检测
- 若有键压下,要消除键抖动,确认有键压下
- 对压下的键进行编码,将该键的行列信号转换成16进制码,由此确定哪个键被压下了
- 该键释放后,回到2
检测方法:A端口向所有行线输出0电平,再通过B口的低4位读列值,若其中有0值,便是有键压下了。
DATA SEGMENT
TABLE DB 77H,7BH,7DH,7EH,0B7H,0BBH,0BDH,0BEH ;0~7
DB 0D7H,0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH ;8~F(编码根据实验原理图设计:按下时行列为低电平)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA ;
MOV DS,AX
;初始化8255,方式0,A、C输出,B输入
MOV DX,PORT_CTL
MOV AL,10000010B
OUT DX,AL
;向所有行送0
MOV DX,PORT_A
MOV AL,00H
OUT DX,AL
;读列,查看是否所有键均松开
MOV DX,PORT_B
WAIT_OPEN:
IN AL,DX ;读入B端口
AND AL,0FH ;AL表示低四位,用AND运算是只得到低四位
CMP AL,0FH
JNE WAIT_OPEN ;0表示有键压下,1表示无,故需得到0FH
;各建均已松开,再查列是否有0,即是否有键压下
WAIT-PRES:
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_PRES
;有键压下,延时20ms,消除键抖动,防止误触情况
MOV CX.16EAH
DELAY:
LOOP DELAY ;延时20ms
;再查列,看是否仍被压着
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE WAIT_PRES
;键仍被压着,确定哪一个键被压下
MOV AL,0FEH ;先令D0为0,即先假设键是在第一行按下,然后逐行扫描
MOV CL,AL
NEXT_ROW:
MOV DX,PORT_A
OUT DX,AL
MOV DX,PORT_B
IN AL,DX
AND AL,0FH ;取列值
CMP AL,0FH
JNE ENCODE ;不都为1说明有键压下,转去编码
ROL CL,01 ;均为1,使下行输出0,即逐行扫描
MOV AL,CL
JMP NEXT_ROW ;查看下行
;已找到有一列为低电平,对压键的行列值编码
ENCODE:
MOV BX,000FH ;从最大的找起,后面自减
IN AL,DX
NEXT_TRY:
CMP AL,TABLE[BX] ;行列对应的值与表里的是否相等
JE DONE ;相等则输出
DEC BX ;不等,指向下一个地址,BX是指针寄存器
JNS NEXT_TRY ;BX非负时,则继续查找
DONE:
MOV AL,BL ;BL中存有键的16进制代码
MOV DX,PORT_C
OUT DX,AL ;从C端口输出
思路:先对所有行线输出0,然后逐列查询列线,看所有键是否已松开,再看是否有键被按下,若确定有键被按下,要排除误触的情况,所以给个20ms的延时之后,再从A口输出一个低电平到一行线上,再从B口读入各列的值,若某一列线上出现低电平,则说明该行该列的键便是压下的键所在的行列值。再跟TABLE中的值进行比较,判断是否相等,相等则进行下一步操作(如输出),不等,则指针移动,指向下一个值,直到找到为止。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)