- 1、本文档共107页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课件:可编程外围接口芯片8255A及其应用.ppt
二、键盘与微机的接口及处理方式 行扫描方式 识别键盘上哪个键被压下的过程称为键盘扫描,上述键盘的扫描包含以下几步: (1) 检测是否所有键都松开了,若没有则反复检测。 (2) 当所有键都松开了,再检测是否有键压下,若无键压下则反复检测。 (3) 若有键压下,要消除键抖动,确认有键压下。 (4) 对压下的键进行编码,将该键的行列信号转换成16进制码,由此确定哪个键被压下了。如出现多键重接的情况,只有在其它键均释放后,仅剩一个键闭合时,才把此键当作本次压下的键。 (5) 该键释放后,再回到(2)。 检测矩阵中是否有键压下的一种简单方法是,自输出口A向所有行线输出0电平,再通过B口的低4位读取列值,若其中有0值,便是有键压下了。 在开始一次扫描时,先应确认上一次压下的键是否已松开。即先向所有行线 输出低电平,再读人各列线值,只有当所有的行线和列线均为高电平,表示以前压下的键部已释放了,才开始检测是否有键压下。 当检测到有键压下后,必须消除键抖动( Debance)。消除键抖动的常用方法是在检测到有键压下后,延长一定时间(通常为20ms),再检查该键是否仍被压着。若是,才认定该键确实被接下了,而不是干扰。 确认有键压下后,再确定被压下键所在的行列号。为获取行列信息,先从A口输出一个低电平到一行线上,再从B口读人各列的值,若没有一列为低电平,说明压下的键不在此行。于是,再向下一行输出一个低电平,再检测各列线上是否有低电平。依次对每一行重复这个过程,直至查到某一列线上出现低电平为止。被置成低电平的行和读到低电平的列,便是被压下键所在的行列值。 已知被压下的键所在的行号(0~3)和列号门~3)后,就能得到该键的扫描码。例如,对于数字0,它位于3行、3列,压下“0”键时,从B口可读得D7位和D3位为0,其余位为1,所以数字0的编码,即77H;对于数字6,处于2行1列,压下‘6’键时,D6位和D1位0以其余位为1,所以数字6的编码=BDH。类似地,其余各键的编码也可一一求得。将这些编码值列成表,放在数据段中,用查表程序来查对,便能确定压下的是什么键。 程序实现 下面是键盘检测、去抖动、键值编码和确定键名的汇编语言程序。程序运行后,若返回值AH=0,表示已读到有效的键值,并在AL中存有0~F键的16进制代码;若AH=l,则表示出错。 ;端口地址 PORT-A EQU 0FF9H;8255 A口地址 PORT-B EQU 0FFBH;8255 B口地址 PORT-CTL EQU 0FFFH;8255控制口地址 ;数据段,键盘扫描码表 DATA SEGMENT ;0 1 2 3 4 5 6 7 TABLE DB 77H, 7BH, 7DH, 7EH, 0B7H,0BBH,0BDH,0BEH ; 8 9 A B C D E F DB 0D7H,0DBH,0DDH,0DEH,0E7H,0EBH,0EDH,0EEH DATA ENDS ;堆栈段 STACK SEGMENT STACK DW 50DUP(0) TOP_STACI LABEL WORD STACK ENDS ;代码段 CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX, STACK MOV SS, AX LEA SP, TOP_STACK MOV AX, DATA MOV DS, AX ;初始化8255A,方式0,A口作输出,B口和C口为输人 MOV DX, PORT-CTL;指向控制口 MOV AL;控制字 OUT DX, AL;写人控制字 ;向所有行送0 MOV DX,PORT-A;A口 MOV AL,00H OUT DX, AL;向 A口各位输出 0 ;读列,查看是否所有键均松开 MOV DX,PORT-B WAIT_OPEN : IN AL,DX;键盘状态读人 B口 AND AL, 0FH;只查低4位(列值) CMP AL,0FH;是否都为1(各键均松开)? JNE WAIT_OPEN;否,继续查 ;各键均已松开,再查列是否有0,即是否有键压下 WAIT
文档评论(0)