📄 code3.asm
字号:
writeINT: MOV AX,0H ;写中断向量子程序
MOV ES,AX
MOV DI,002CH
LEA AX,INTQ3
STOSW ;002C,002D
MOV AX,CS
STOSW ;002E,003F
MOV DI,003CH
LEA AX,INTQ7
STOSW ;003C,003D
MOV AX,CS
STOSW ;003E,003F
RET
;----------------------------------------------中断处理程序-----------------------------------
INTERUPT3:
CLI ;处理中断时先关中断
PUSH AX
PUSH DX
MOV AL,DS:[DATA6] ;DATA6 EQU 0529H 地址中为00D ,用于保存收到的中断次数
INC AL
MOV DS:[DATA6],AL ;将00D改为 01D ,DATA6用于保持收到脉冲的次数,满20时加1
CMP AL,20H
JAE NEXT ;大于等于20时,清零,并转向状态判断程序,中断返回
JMP INTRE2 ;小于时中断返回
NEXT: MOV BYTE PTR DS:[DATA6],00H ;将中断计数器清零
CALL LEDDISP ;将显示缓冲区中的数字显示出来
CALL NEWTIME ;将时间缓冲区中的数字减一
P1: CMP BYTE PTR DS:[DATA7],01H ;判断是否是第一个状态
JNZ P2 ;如果不是第一个状态,则转P2
CMP BYTE PTR DS:[DATA8],00H ;看20S是否已经减到0
JNE CONV ;如果未减到0,则更新显示缓冲区,并中断返回
MOV BYTE PTR DS:[DATA7],02H ;如果减到0,则转到第二个状态
MOV BYTE PTR DS:[DATA9],15H ; 设定2状态时,路口的显示初始值
MOV BYTE PTR DS:[DATA8],15H ;
JMP CONV
P2: CMP BYTE PTR DS:[DATA7],02H ;看是否是第二个状态
JNZ P3
CMP BYTE PTR DS:[DATA8],00H ;看是否减到0
JNE CONV
MOV BYTE PTR DS:[DATA7],03H ;转到第三个状态
MOV BYTE PTR DS:[DATA9],15H ;设定3状态时,路口的显示初始值
MOV BYTE PTR DS:[DATA8],15H
JMP CONV
P3: CMP BYTE PTR DS:[DATA7],03H ;看是否是第三个状态
JNZ P4
CMP BYTE PTR DS:[DATA8],00H ;看是否减到0
JNE CONV
MOV BYTE PTR DS:[DATA7],04H ;转到第四个状态
MOV BYTE PTR DS:[DATA9],45H ;设定4状态时,路口的显示初始值
MOV BYTE PTR DS:[DATA8],45H
JMP CONV
P4: CMP BYTE PTR DS:[DATA7],04H ;看是否是第四个状态
JNZ P1
CMP BYTE PTR DS:[DATA8],00H ;看是否减到0
JNE CONV
MOV BYTE PTR DS:[DATA7],01H ;转到第一个状态
MOV BYTE PTR DS:[DATA9],45H ;设定1状态时,路口的显示初始值
MOV BYTE PTR DS:[DATA8],45H
JMP CONV
&&
CONV: CALL CONVERS ;把时间缓冲区中的时间转换到显示缓冲区中
INTRE2: CALL LEDDISP
MOV AL,20H ;写8259控制口 ,并中断返回
MOV DX,INTPORT1
OUT DX,AL
POP DX
POP AX
STI ;开中断
IRET ;中断返回
;------------------------------------------------------------------------------------------------
INTERUPT7: CLI ;电平不符合要求时,自动显示ERR
MOV SI,DATA1
CALL LEDDISP
MOV AL,14H
MOV DX,INTPORT1
OUT DX,AL
IRET
;-----------------------------转换子程序,将时间数值转换为显示字符,存入显示缓冲区-----------------
CONVERS: MOV AL,BYTE PTR DS:[DATA9] ;转换2,4路口(对应于实验仪上右边显示屏)的秒
CALL CONVERS2
ADD WORD PTR DS:[DATA10],03H ;转换1,3路口(对应于实验仪上左边显示屏)的秒
MOV AL,BYTE PTR DS:[DATA8]
CALL CONVERS2
MOV WORD PTR DS:[DATA10],DATA4 ;恢复[DATA10]的指向显示缓冲区首地址
RET
CONVERS2: PUSH AX
CALL CONVERS1 ;转换低位
MOV BX,WORD PTR DS:[DATA10]
MOV DS:[BX],AL ;更新低位所对应的显示缓冲区
ADD WORD PTR DS:[DATA10],01H ;[DATA10]指向高位
POP AX
PUSH CX
MOV CL,4H
SHR AL,CL ;AL右移CL(4)位, 丢弃低4位,如AL为12H,则转换为01H
POP CX
CALL CONVERS1 ;转换高位
MOV BX,WORD PTR DS:[DATA10] ;更新高位所对应的显示缓冲区
MOV DS:[BX],AL
RET
CONVERS1: MOV BH,0H
AND AL,0FH ;取AL的低位 ,如AL为12H,则取02H
MOV BL,AL ; 将数值存入BL中,作为基址
MOV AL,CS:[BX+DATA2] ;将相应的显示字符存入AL,如将2对应的字符存入AL.
RET
;-------------------------------------------------------------------------------------------
;--------------------------------更新时间缓冲区子程序---------------------------------------
NEWTIME:
MOV AL,BYTE PTR DS:[DATA9] ;[DATA789]全部加1D
SUB AL,01D
DAS ;减法的十进制调整,如12D改为12H
MOV BYTE PTR DS:[DATA9],AL
MOV AL,BYTE PTR DS:[DATA8]
SUB AL,01D
DAS
MOV BYTE PTR DS:[DATA8],AL
RET ;返回
;----------------------------------------------------------------------------------------------
;-------------------------------------显示子程序,调用时显示时间缓冲区中的字符--------------------------
LEDDISP:
PUSH AX ;显示子程序
PUSH BX
PUSH CX
PUSH DX
MOV SI,DATA4 ;DATA4 EQU 0520H 从0520h开始显示
MOV AL,90H ;初始显示时 DATA3 EQU 0518H
MOV DX,CONTPORT ;写8255控制口
OUT DX,AL
MOV BYTE PTR DS:[DATA5],00H ;DATA5 EQU 0528H
LED1: CMP BYTE PTR DS:[DATA5],05H
JA LED2 ;如果显示完8位后,返回
MOV BL,DS:[DATA5]
MOV BH,0H
MOV AL,CS:[BX+SI] ; 初始时,SI等于DATA3 0518H ,
;INTQ3时等于DATA4 0520H ,从0520h显示到0527H
MOV DX,DATAPORT ;写8255数据口,以此改变显示值
OUT DX,AL
ADD BYTE PTR DS:[DATA5],01H ;显示下一位
JNZ LED1
LED2:
POP DX
POP CX
POP BX
POP AX
RET
;---------------------------------------------------------------------------------------------------------
FORMAT: MOV BX,0 ;DATA1 EQU 0500H
MOV WORD PTR DS:[BX+DATA1],5050H ; 1 0 INTQ7中使用,显示ERR 0101000001010000
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0079H ;3 2 0000000001111001
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ;5 4 0000000000000000
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ;7 6 0000000000000000
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],063FH ;9 8 显示字符 1 0 0000011000111111
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],4F5BH ;0B 0A 3 2 0100111101011011
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],6D66H ;0D 0C 0110110101100110
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],077DH ;0F 0E 0000011101111101
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],6F7FH ;11 10 0110111101111111
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],7C77H ;13 12 0111110001110111
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],5E39H ;15 14 0101111000111001
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],7179H ;17 16 0111000101111001
;----------------------------------------- 初始化时显示 ------------------------
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],666DH ;19 18 45 000011000111111
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F3fH ;1B 1A 0- 0011111100111111
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F3FH ;1D 1C 00 0011111100111111
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],3F3FH ;1F 1E 00 0011111100111111
ADD BX,2
;-------------------------------------------------------------------------------
;-------------显示缓冲区,保存着当前时间对应的显示字符,INTQ3中进行调用和修改-----------
MOV WORD PTR DS:[BX+DATA1],666DH ;21 20 初次显示45 0000011001011011
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ; 23 22 0- 0000000000000000
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],666DH ;25 24 初次显示45 0000011001011011
ADD BX,2
MOV WORD PTR DS:[BX+DATA1],0000H ; 27 26 00 0000000000000000
;---------------------------------------------------------------------------------------
MOV BYTE PTR DS:[DATA6],00H ;保存8259A当前收到时钟脉冲的次数
MOV BYTE PTR DS:[DATA7],01H ;设置初始状态
MOV BYTE PTR DS:[DATA8],45H ;设置刚开始正常工作后1,3路口显示的秒数
MOV BYTE PTR DS:[DATA9],45H ;设置刚开始正常工作后2,4路口显示的秒数
MOV WORD PTR DS:[DATA10],DATA4 ;0520H;
RET
;--------------------------------------------------------------------------------------------
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -