通信

计算机与外设间的交换数据、状态和控制命令的过程。

接口的功能

  • 设置数据缓冲以解决CPU与外设之间速度差异所带来的不协调问题
  • 设置信号电平转换电路以解决信号电平不匹配的问题
  • 设置信息转换逻辑以满足对各自格式的要求
  • 设置时序控制电路来同步CPU和外设的工作
  • 提供地址译码电路

I/O端口

  • 数据端口
  • 状态端口
  • 命令端口

4*4键盘

扫描
  1. 检测是否所有键都松开了,若没有则反复检测
  2. 当所有键都松开了,再检测是否有键压下,若无键压下则反复检测
  3. 若有键压下,要消除键抖动,确认有键压下
  4. 对压下的键进行编码,将该键的行列信号转换成16进制码,由此确定哪个键被压下了
  5. 该键释放后,回到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中的值进行比较,判断是否相等,相等则进行下一步操作(如输出),不等,则指针移动,指向下一个值,直到找到为止。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐