实验要求:
本次实验的要求与前一实验类似,但仅要求识别小键盘0~9数字键,将小键盘键入的任意长的0~9数字串,采用左移位动态显示的方法显示在数码管电路上,当小键盘按下”R”时停止演示.
实验电路图:

程序框图:
程序清单:
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
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,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,当然不出显示的,这是多么不应该的问题啊!
然后主要是延时的问题和显示的更新问题,我在最前面又加了一句显示才搞定,还有一个就是判断键是否松开的方法,其实和判断是否有键按是一样的。
总之本实验难在程序方法上,调试并不是太困难。我感到做实验一定要仔细,想好的再动手,要不然出错了都不知道在哪儿,很费时间的。