一.实验要求 本次实验的要求与前一实验类似但仅要求识别小键盘0~9数字键将小键盘键入的任意 长的0~9数字串,采用左移位动态显示的方法显示在数码管电路上当小键盘按下”R时 停止演示 实验电路图 数码管显示电路 AND2 三.程序框图 预置:A口为方式0输出 B口为方式0输入 0>PA7-----PA0 PB2----PB0 AH AH=7? 四.程序清单
1 一.实验要求: 本次实验的要求与前一实验类似,但仅要求识别小键盘0~9数字键,将小键盘键入的任意 长的 0~9 数字串,采用左移位动态显示的方法显示在数码管电路上,当小键盘按下”R”时 停止演示. 二.实验电路图: 三.程序框图: 四.程序清单: 预置:A 口为方式 0 输出 B 口为方式 0 输入 0 PA7-------PA0 PB2----PB0 AH AH=7?
TITLE LITTLEKEYBOARD MOV DX.A 8255 SSEG SEGMENT PARA STACK STACK' IN AL DX DB 256 DUP(O MOV HANG.AL SSEG ENDS CALL GETINPUT DSEG SEGMENT CMP AL.OAH A 8255 EQU 220H JE CMPAGAIN B 8255 EQU 221H CMP AL. OFFH CON 8255 EQU 223H JNE CONTINUE BUFFER DB 6 DUP(O) CALL CLOSEALL HANG DB MOV AH. 4CH LIE DB INT 21H NEWHANG CONTINUE NEWLIE DB CALL CHANGE LE MOV CX.O 3FH,06H, 5BH, 4FH,66H, 6DH, 7DH,07H, 7FH, LABLE 6FH CALL DISPLAY DSEG ENDS INC CX CSEG SEGMENT CMP CX. 256 ASSUME CS CSEG. DS: DSEG SS: SSEG JNE LABLE START PROC NEAR JMP CMPAGAIN MOV AX DSEG RET MOV DS.AX START ENDP CMPAGAIN CALL DISPLAY DELAY 1 PROC NEAR MOV DX. CON 8255 PUSHAX MOV AL,10000010B PUSH CX OUT DX.AL PUSH DX agaIN: MOV AH.86H CALL DISPLAY MOV CX. O MOV DX,A 8255 MODX.20000 MOV AL,O INT 15H OUT DX.AL POP DX MOV DX. B 8255 POP CX IN AL, DX POPAX CMP AL.00000111B RET JEAGAIN DELAY I ENDP CALL DELAY I MOV DX. CON 8255 GETINPUT PROC NEAR MOV AL,10010000B CMP LIE. 00000110B OUT DX.AL JE LIEO MOV DX. B 8255 CMP LIE. 00000101B MOV AL, LIE JE LIE OUT DX. AL CMP LIE,00000011B 2
2 TITLE LITTLEKEYBOARD SSEG SEGMENT PARA STACK 'STACK' DB 256 DUP (0) SSEG ENDS DSEG SEGMENT A_8255 EQU 220H B_8255 EQU 221H CON_8255 EQU 223H BUFFER DB 6 DUP(0) HANG DB ? LIE DB ? NEWHANG DB ? NEWLIE DB ? TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH, 6FH, DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG, DS:DSEG,SS:SSEG START PROC NEAR MOV AX,DSEG MOV DS,AX CMPAGAIN: CALL DISPLAY MOV DX,CON_8255 MOV AL,10000010B OUT DX,AL AGAIN: CALL DISPLAY MOV DX,A_8255 MOV AL,0 OUT DX,AL MOV DX,B_8255 IN AL,DX CMP AL,00000111B JE AGAIN MOV LIE,AL CALL DELAY1 MOV DX,CON_8255 MOV AL,10010000B OUT DX,AL MOV DX,B_8255 MOV AL,LIE OUT DX,AL MOV DX,A_8255 IN AL,DX MOV HANG,AL CALL GETINPUT CMP AL,0AH JE CMPAGAIN CMP AL,0FFH JNE CONTINUE CALL CLOSEALL MOV AH,4CH INT 21H CONTINUE: CALL CHANGE MOV CX,0 LABLE: CALL DISPLAY INC CX CMP CX,256 JNE LABLE JMP CMPAGAIN RET START ENDP ;********************************* DELAY1 PROC NEAR PUSH AX PUSH CX PUSH DX MOV AH,86H MOV CX,0 MOV DX,20000 INT 15H POP DX POP CX POP AX RET DELAY1 ENDP GETINPUT PROC NEAR CMP LIE,00000110B JE LIE0 CMP LIE,00000101B JE LIE1 CMP LIE,00000011B
JE LIE2 RET MOV AL, OAH KEY4: MOV AL, 4 RET RET LIE2 CMP HANG. 00010000B KEY5: MOV AL, 5 JE NEXT RET MOV AL, OAH KEY6: MOV AL, 6 RET RET NEXT: MOV AL, OFFH KEY7: MOV AL, 7 RET RET LIEO: CMP HANG. 10000000B GETINPUT ENDP JE KEY CMP HANG. 01000000B CHANGE PROC NEAR JE KEY9 PUSHAX MOV AL, OAH PUSH SI RET MOV SIOFFSET BUFFER KEY8: MOV AL, 8 MOV AH,SI+1I RET MOV ISIL,AH KEY9: MOV AL. 9 MOV AH, [SI+2 RET MOV ISI+I,AH LIEl: CMP HANG. 10000000B MOV AH,[SI+3 JE KEYO MOV[SI+2,AH CMP HANG. 01000000B MOV AH,SI+4 JE KEYI MOV ISI+3L,AH CMP HANG. 00100000B MOⅤAH[SI+S JE KEY2 MOV [SI+4],AH CMP HANG O00 10000B MOV [SI+SL,AL JE KEY3 POP SI CMP HANG. 00001000B POP AX JE KEY4 RET CMP HANG. O0000100B CHANGE ENDP JE KEY5 CMP HANG. 00000010B JE KEY6 DISPLAY PROC NEAR CMP HANG. 00000001B PUSHAX JE KEY7 PUSH BX MOV AL, OAH PUSH CX PUSH DX KEYO: MOV AL O PUSH SI RET MOV BX OFFSET TABLE KEYI: MOV AL. MOV SIOFFSET BUFFER RET MOV CL. KEY2: MOV AL. 2 XUNHUAN: RET MOⅤAL[SI KEY3: MOV AL, 3 XLAT
3 JE LIE2 MOV AL,0AH RET LIE2:CMP HANG,00010000B JE NEXT MOV AL,0AH RET NEXT:MOV AL,0FFH RET LIE0:CMP HANG,10000000B JE KEY8 CMP HANG,01000000B JE KEY9 MOV AL,0AH RET KEY8:MOV AL,8 RET KEY9:MOV AL,9 RET LIE1:CMP HANG,10000000B JE KEY0 CMP HANG,01000000B JE KEY1 CMP HANG,00100000B JE KEY2 CMP HANG,00010000B JE KEY3 CMP HANG,00001000B JE KEY4 CMP HANG,00000100B JE KEY5 CMP HANG,00000010B JE KEY6 CMP HANG,00000001B JE KEY7 MOV AL,0AH RET KEY0:MOV AL,0 RET KEY1:MOV AL,1 RET KEY2:MOV AL,2 RET KEY3:MOV AL,3 RET KEY4:MOV AL,4 RET KEY5:MOV AL,5 RET KEY6:MOV AL,6 RET KEY7:MOV AL,7 RET GETINPUT ENDP CHANGE PROC NEAR PUSH AX PUSH SI MOV SI,OFFSET BUFFER MOV AH,[SI+1] MOV [SI],AH MOV AH,[SI+2] MOV [SI+1],AH MOV AH,[SI+3] MOV [SI+2],AH MOV AH,[SI+4] MOV [SI+3],AH MOV AH,[SI+5] MOV [SI+4],AH MOV [SI+5],AL POP SI POP AX RET CHANGE ENDP ;************************************ *************** DISPLAY PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV BX,OFFSET TABLE MOV SI,OFFSET BUFFER MOV CL,1 XUNHUAN: MOV AL,[SI] XLAT
MOV DX.20lH CLOSEALL PROC NEAR OUT DX.AL PUSH AX MOV DX. 200H PUSH CX MOV AL. CL PUSH DX OUT DX.AL MOV CL. MOV DX. 200H XUNHUANI MOV AL,O MOV DX. 200H OUT DXAL MOV AL, CL INC SI OUT DXAL SHL CL, I MOV AL, O CMP CL, 40H OUT DX. AL JNE XUNHUAN SHL CL. POP SI CMP CL, 20H POP DX JNEⅩ UNHUANI POP CX POP DX POP BX POP CX POPAX POPAX RET RET DISPLAY ENDP CLOSEALL ENDP CSEG ENDS END START 五.实验分析: 我决的这次实验比较难,可能是因为前一个实验有以前的例子可以参照,而这次的实验 虽然硬件部分比较简单,但要想写好程序要费一番工夫好好的考虑一下,主程序没有什么 书上已经给了流程图,但关键在于识别程序和缓冲区里数据的处理和更新,以及左移式显示 的程序,是比较难的。 在识别程序中,我用了两个表来做, TABLEl放键值码,通过读入值与之相比较来识别 输入,然后 TABLE2放字型码,用ⅪLAT来查找转换为字型码已供输出:在显示部分,我 用一个6字的 BUFFER缓冲区来存放要输出的字型码,通过移位来做到做移式显示。 调试中一直以为硬件连线没什么大不了的,只是一味找程序的问题,却一直不出显示 后来才发现是连线的问提,程序中的端口地址是210~21F,我却连的是220~22F,当然不 出显示的,这是多么不应该的问题啊! 然后主要是延时的问题和显示的更新问题,我在最前面又加了一句显示才搞定,还有一 个就是判断键是否松开的方法,其实和判断是否有键按是一样的。 总之本实验难在程序方法上,调试并不是太困难。我感到做实验一定要仔细,想好的再 动手,要不然出错了都不知道在哪儿,很费时间的
4 MOV DX,201H OUT DX,AL MOV DX,200H MOV AL,CL OUT DX,AL MOV DX,200H MOV AL,0 OUT DX,AL INC SI SHL CL,1 CMP CL,40H JNE XUNHUAN POP SI POP DX POP CX POP BX POP AX RET DISPLAY ENDP ;********************************* CLOSEALL PROC NEAR PUSH AX PUSH CX PUSH DX MOV CL,1 XUNHUAN1: MOV DX,200H MOV AL,CL OUT DX,AL MOV AL,0 OUT DX,AL SHL CL,1 CMP CL,20H JNE XUNHUAN1 POP DX POP CX POP AX RET CLOSEALL ENDP CSEG ENDS END START 五.实验分析: 我决的这次实验比较难,可能是因为前一个实验有以前的例子可以参照,而这次的实验 虽然硬件部分比较简单,但要想写好程序要费一番工夫好好的考虑一下,主程序没有什么的, 书上已经给了流程图,但关键在于识别程序和缓冲区里数据的处理和更新,以及左移式显示 的程序,是比较难的。 在识别程序中,我用了两个表来做,TABLE1 放键值码,通过读入值与之相比较来识别 输入,然后 TABLE2 放字型码,用 XLAT 来查找转换为字型码已供输出;在显示部分,我 用一个 6 字的 BUFFER 缓冲区来存放要输出的字型码,通过移位来做到做移式显示。 调试中一直以为硬件连线没什么大不了的,只是一味找程序的问题,却一直不出显示, 后来才发现是连线的问提,程序中的端口地址是 210~21F,我却连的是 220~22F,当然不 出显示的,这是多么不应该的问题啊! 然后主要是延时的问题和显示的更新问题,我在最前面又加了一句显示才搞定,还有一 个就是判断键是否松开的方法,其实和判断是否有键按是一样的。 总之本实验难在程序方法上,调试并不是太困难。我感到做实验一定要仔细,想好的再 动手,要不然出错了都不知道在哪儿,很费时间的
5