DATA SEGMENT
CWORD DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;数码管共阴极结构,数据段为数码管显示的段选码
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,0606H ;(A:0600H,B:0602H,C:0604H,8255控制端口:0606H)
MOV AL,10000001B ;(PC3-PC0输入1),选择c口低4位为输入口,a、b、c高四位口输出,工作方式都为0,
OUT DX,AL ;8255控制字写入
MOV DX,0646H
MOV AL,00110000B ;选择PC0,读/写先低后高,方式0
OUT DX,AL ;8254控制字写入
MOV DX,0640H
MOV AL,00H
OUT DX,AL
MOV AL,48H
OUT DX,AL
ZERO: MOV CX,00H ;CX从零开始计数
LP1: MOV DX,0604H
IN AL,DX
TEST AL,4 ;判断第二位是否为1(pc2)
JNZ START ;非零转移(ZF=0)
AND AL,00000001B
CMP AL,00000001B ;C口的最后一位(连接计数器0 OUT端口)的状态,判断开关是否打开
JC KEEP ;计数器为暂停态,状态保持
INC CX
CMP CX,64H ;两位数计时最大值为99,再inc一次后等于64H
JE ZERO ;到达最大值后秒表自动复位(ZF=1)
MOV DX,0640H
MOV AL,00H ;?选择PC0,锁存计数值,方式0
OUT DX,AL
MOV AL,48H ;?选择PC1,锁存计数值,方式4
OUT DX,AL
KEEP: MOV AL,CL
LP2: XOR AH,AH
MOV BL,0AH
DIV BL ;将时间转换为十进制,个位十位分离,AL为十位,AH为个位
CALL NUMBER ;AL寄存器转换为对应字形码
MOV DX,0600H
OUT DX,AL ;数码管显示数字
MOV DX,0604H
MOV AL,01111111B ;pc7
OUT DX,AL ;选中十位数字的数码管
MOV AL,11111111B ;
OUT DX,AL ;数码管全灭,防止两数码管互相干扰
MOV AL,AH
CALL NUMBER
MOV DX,0600H
OUT DX,AL
MOV DX,0604H
MOV AL,10111111B
OUT DX,AL
OR CX,CX
JNZ LP1 ;若一个完整周期未结束,cx继续数秒
JMP ZERO ;若结束,CX重置,开始下一周期计数
MOV AH,4CH
INT 21H
NUMBER PROC NEAR
MOV BX,AX
XOR BH,BH
MOV AL,[CWORD+BX]
RET
NUMBER ENDP
CODE ENDS
END START