微机习题课(键盘-8255A行扫描法)
8255A并行接口(实验一) 识别按键方法:行扫描法和线反转法 1、行扫描法 STEP1: 检查是否有键按下 1)所有行输出‘0’; 2)读列状态,检查是否全‘1’; 若否,则有可能有键按下 3)延时20ms,再读列线,是否全‘1’。 若否,有键按下 * * STEP2:读键码(行扫描法) 1)行扫描; 逐行输出‘0’ 2)读列状态。 被扫描到得行有键按下,列状态才会改变 STEP3:键分析 1)行值送(AL) 2)列值送(AH) 3)(AX)取反,得键码 STEP4:键处理 1)查表 拿键值与键值表比较,相同则记录下对应的字符码 2)显示字符 主程序: 设置数据段,显示提示信息 调键盘扫描子程序KEY 字符是否为‘R’ N Y 开始 结束 键扫描子程序流程图(行扫描法): 置8255A控制字82H,A口输出,B口输入 A口输出低电平,B口读入数据 标识位BL清零 列线全为高电平 (BL)=1? Y N 延时去抖动 BL置1 N Y A B B 开始 第1行输出低电平 保存行值 列线全为高电平 行扫描完毕 取行值 行值左移1位 指向下一行 N Y Y N A B C 与表无任一键相同 Y 在屏幕上显示此键对应的字符 从A口输出00,从B口读入列值 输入字符的ASCII码存放在(DL)中 键是否已释放 返回 Y N 列值送(AH),行值送(AL),(AX)取反,查表 B C N PA55EQU218H PB55EQU219H P55CTLEQU21BH DATASEGMENT TABLEDW0101H,0102H,0104H,0108H;键码表 DW0110H,0120H,0140H,0180H DW0201H,0202H,0204H,0208H DW0210H,0220H,0240H,0280H DW0401H,0402H,0404H,0408H DW0410H,0420H,0440H,0480H CHARDB‘CDEF’;字符码表 行扫描法源程序[1 of 10] DB‘BA98’ DB‘4567’ DB‘3210’ DB‘ ’;四个空格 DB‘RPMG’ MESDB‘INPUT ANY KEY IN THE’ DB‘SMALL KEYBOARD.’ DB0AH,0DH;回车换行 DB‘IT WILL BE DISPLAY’ DB ‘ON THE SCREEN!’ DB‘END WITH ‘R’’ 行扫描法源程序[2 of 10] DB0AH,0DH, ‘$’ DATAENDS CODESEGMENT MAINPROCFAR ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX;DS指向数据段 MOVDX,OFFSET MES MOVAH,09 ;显示提示信息 INT21H KY:CALLKEY;调键盘扫描子程序 行扫描法源程序[3 of 10] CMPDL,’R’;键入字符不是‘R’,转KY JNZKY MOVAX,4C00H INT21H RET MAINENDP KEYPROCNEAR ;键盘扫描子程序 MOVAL,82H ;设置8255A控制字 MOVDX,P55CTL;工作在方式0,端 OUTDX,AL ;口A输出,端口B输入 BEGIN:MOVBL,00H ;标识位清零 行扫描法源程序[4 of 10] WAIT1:MOVAL,00H ;端口A输出全0 MOVDX,PA55 OUTDX,AL MOVDX,PB55 INAL,DX;端口B读入列值 ANDAL,07H CMPAL,07H JZBEGIN ;若为07H,无键按下 CMPBL,01H JZKPRESS ;若为1,已消抖动 MOVCX,1000H 行扫描法源程序[5 of 10]