本实验要实现:用按键并通过8255并行接口来控制数码管的显示。具体如下:
(1)用8255的PA口控制数码管的段码。
(2)用8255的PC口控制数码管的位码。
(3)初始状态时,在最右侧数码管上显示0,自此,可用按键控制数码管的后续显示,具体为:
DATA SEGMENT IO8255_A EQU 288H IO8255_C EQU 28AH IO8255_K EQU 28BH LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;保存各个数字的数码管亮的十六进制数 BUFFER DB 0 ;BUFFER存储当前输出的数字 BZ DW ? ;BZ存储位码 CHAR DB ? ;CHAR存储当前输入的字母L/R/U/D/E DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV DX,IO8255_K ;K命令口 MOV AL,80H ;命令口写入80H,即10000000B,意味方式0,PA,PB,PC口均为输出口 OUT DX,AL MOV SI,OFFSET LED ;SI指向LED,方便找到要显示的数字 MOV BL,BUFFER MOV BH,01 MOV BYTE PTR BZ,BH MOV BH,0 ADD SI,BX MOV AL,BYTE PTR [SI] ;AL中存入0,也即将从PA口输出数字0的段码 MOV DX,IO8255_A ;从PA口输出数字0段码,显示数字为0 OUT DX,AL MOV AL,BYTE PTR BZ MOV DX,IO8255_C ;从PC口输出位码,最后一位将用于显示 OUT DX,AL LOOPALL: MOV SI,OFFSET LED MOV AH,01 INT 21H MOV CHAR,AL ;从键盘输入一个字母,将其存入CHAR MOV BL,108 CMP CHAR,BL ;与L的ASCII码比较,查看是否为L JNZ NEXT1 CALL LEFT ;是L则调用LEFT子程序,否则进行下一个比较 NEXT1:MOV BL,114 CMP CHAR,BL ;与R的ASCII码比较,查看是否为R JNZ NEXT2 CALL RIGHT ;是R则调用RIGHT子程序,否则进行下一个比较 NEXT2:MOV BL,117 CMP CHAR,BL ;与U的ASCII码比较,查看是否为U JNZ NEXT3 CALL UP ;是U则调用UP子程序,否则进行下一个比较 NEXT3:MOV BL,100 CMP CHAR,BL ;与D的ASCII码比较,查看是否为D JNZ NEXT4 CALL DOWN ;是D则调用DOWN子程序,否则进行下一个比较 NEXT4:MOV BL,101 CMP CHAR,BL ;与E的ASCII码比较,查看是否为E JNZ LOOPALL JMP EXIT ;是E则跳转到EXIT退出,否则回到循环开头 LEFT:MOV BL,BYTE PTR BZ ROL BL,1 ;位码循环左移一位,使用ROL保证到最左端可以回到最右端 MOV BYTE PTR BZ,BL MOV SI,OFFSET LED MOV BL,BUFFER ;BUFFER中数字直接使用 MOV BH,0 ADD SI,BX MOV AL,BYTE PTR [SI] MOV DX,IO8255_A ;PA口输出段码 OUT DX,AL MOV AL,BYTE PTR BZ MOV DX,IO8255_C ;PC口输出位码 OUT DX,AL RET RIGHT:MOV BL,BYTE PTR BZ ROR BL,1 ;位码循环右移一位,使用ROR保证到最右端可以回到最左端 MOV BYTE PTR BZ,BL MOV SI,OFFSET LED MOV BL,BUFFER MOV BH,0 ADD SI,BX MOV AL,BYTE PTR [SI] MOV DX,IO8255_A OUT DX,AL MOV AL,BYTE PTR BZ MOV DX,IO8255_C OUT DX,AL RET UP:MOV BL,BUFFER INC BL ;当前数字自增1 MOV BH,0 MOV DL,9 CMP BL,DL ;如果数字加一后大于9,则将数字置零 JNA NU ;否则跳到NU MOV BL,0 NU:MOV BUFFER,BL ;将新的数字存入BUFFER MOV SI,OFFSET LED ADD SI,BX MOV AL,BYTE PTR [SI] MOV DX,IO8255_A OUT DX,AL MOV AL,BYTE PTR BZ MOV DX,IO8255_C OUT DX,AL RET DOWN:MOV BL,BUFFER SUB BL,1 ;当前数字自减1 MOV BH,0 ;若自减后小于0则将数字置9 JNC ND ;否则跳到ND MOV BL,9 ND:MOV BUFFER,BL ;将新的数字存入BUFFER MOV SI,OFFSET LED ADD SI,BX MOV AL,BYTE PTR [SI] MOV DX,IO8255_A OUT DX,AL MOV AL,BYTE PTR BZ MOV DX,IO8255_C OUT DX,AL RET EXIT:MOV DX,IO8255_A ;数码管熄灭 MOV AL,0 OUT DX,AL MOV AX,4C00H ;程序中断 INT 21H CODE ENDS END START