微机----------------键的识别(行扫描法)

目录


矩阵式键盘的行线列线分别接并行输出口并行输入口

在这里插入图片描述

①可以先使所有行同时为低电平
②再检查是否有列线也处在低电平

第一步:判断有无键按下
使输出端口各位均输出为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:
	  ...			;后续处理程序
	 

在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值