代码拉取完成,页面将自动刷新
DATAS SEGMENT
;此处输入数据段代码
digit DB 09H,01H,0CDH,11H,19H,02DH,49H,43H,0EDH,81H
; 9 8 7 6 5 4 3 2 1 0
digit_index DB 0
;led DW 3024H,3042H,03000H,4818H,8418H,0018H ;灯变化的六个阶段PAPB[下面程序中直接赋值,不使用数组]
count DB 1 ;申明计数变量,初值1
;原中断
INT0A_OFF DW ?
INT0A_SEG DW ?
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对数码管对应计数器的初始化,选用计数器0和1,分别初始值为1000,500(周期为0.5s)
;对计数器进行初始化编程
MOV DX,307H;控制端口地址给dx
MOV AL,01110110B;计数器1用16位计数方式3,二进制计数
OUT DX,AL
MOV AX,1000
MOV DX,305H
OUT DX,AL;先送低8位
MOV AL,AH
OUT DX,AL;后送高8位
MOV DX,307H
MOV AL,10110110B;计数器2用16位计数方式3,二进制计数
OUT DX,AL
MOV AX,500
MOV DX,306H
OUT DX,AL;先送低8位
MOV AL,AH
OUT DX,AL;后送高8位
;初始化8255
MOV DX,303H
MOV AL,80H ; A,B,C三个口均作为输出口
OUT DX,AL
;使LED灯及数码管熄灭
MOV DX,300H ;PA口LED灯熄灭
MOV AL,0H
OUT DX,AL
MOV DX,301H ;PB口LED灯熄灭
MOV AL,0H
OUT DX,AL
MOV DX,302H ;PC口数码管熄灭
MOV AL,0FFH
OUT DX,AL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV AX,3572H ;获取原中断向量
INT 21H
MOV INT0A_OFF,BX ;保存原中断向量
MOV BX,ES
MOV INT0A_SEG,BX
CLI ;关中断
MOV AX,2572H
MOV DX,SEG TRAFFIC_LIGHT ;设置新的中断向量到中断服务程序TRAFFIC_LIGHT
PUSH DS
MOV DS,DX
MOV DX,OFFSET TRAFFIC_LIGHT
INT 21H
POP DS
STI ;开中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IN AL,0A1H ;打开IRQ10
AND AL,0FBH
OUT 0A1H,AL
IN AL,21H ;打开IRQ2
AND AL,0FBH
OUT 21H,AL
L1: ;死循环
JMP L1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_EXIT: ;退出程序
MOV AX,2572H ;恢复中断向量
MOV DX,INT0A_SEG
PUSH DS
MOV DS,DX
MOV DX,INT0A_OFF
INT 21H
POP DS
IN AL,0A1H ;屏蔽IRQ10
OR AL,04H
OUT 0A1H,AL
IN AL,21H ;屏蔽IRQ2
OR AL,04H
OUT 21H,AL
MOV AX,4C00H ;程序退出
INT 21H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TRAFFIC_LIGHT PROC FAR ;中断服务程序
;保存寄存器
PUSH SI
PUSH AX
PUSH DX
CLI ;关中断
CMP count,21 ;第1秒,开启状态1
JNZ _LED_STATUS_RESET
mov count,1
_LED_STATUS_RESET:
;;;;;;;;;;;;;;;;;;时间控制区;;;;;;;;;;;;;;;;;;;;;;
CALL DIGIT_SUB ;调用数码管子程序,1秒1次
;按时间调用两个子程序,定50s为一周期=20+5+20+5
CMP count,1 ;第1秒,开启状态1
JZ _LED_STATUS_1
CMP count,7 ;第21秒,开启状态2,此处要闪亮
JZ _LED_STATUS_2
CMP count,8 ;第21秒,开启状态2,此处要闪灭
JZ _LED_STATUS_3
CMP count,9 ;第21秒,开启状态2,此处要闪亮
JZ _LED_STATUS_2
CMP count,10 ;第21秒,开启状态2,此处要闪灭
JZ _LED_STATUS_3
CMP count,11 ;第26秒,开启状态3
JZ _LED_STATUS_4
CMP count,17 ;第46秒,开启状态4,此处要闪亮
JZ _LED_STATUS_5
CMP count,18 ;第47秒,开启状态4,此处要闪灭
JZ _LED_STATUS_6
CMP count,19 ;第48秒,开启状态4,此处要闪亮
JZ _LED_STATUS_5
CMP count,20 ;第49秒,开启状态4,此处要闪灭
JZ _LED_STATUS_6
_LED_STATUS_1:
MOV BX,3024H;led[0]
CALL LED_SUB ;调用LED子程序
INC count
JMP _LED_STATUS_END
_LED_STATUS_2: ;闪亮
MOV BX,3042H;led[1]
CALL LED_SUB ;调用LED子程序
INC count
JMP _LED_STATUS_END
_LED_STATUS_3: ;闪灭
MOV BX,3000H;led[2]
CALL LED_SUB ;调用LED子程序
INC count
JMP _LED_STATUS_END
_LED_STATUS_4:
MOV BX,4818H;led[3]
CALL LED_SUB ;调用LED子程序
INC count
JMP _LED_STATUS_END
_LED_STATUS_5: ;闪亮
MOV BX,8418H;led[4]
CALL LED_SUB ;调用LED子程序
INC count
JMP _LED_STATUS_END
_LED_STATUS_6: ;闪灭
MOV BX,0018H;led[5]
CALL LED_SUB ;调用LED子程序
INC count
JMP _LED_STATUS_END
_LED_STATUS_END:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV AL,62H ;发中断结束命令
MOV DX,0A0H
OUT DX,AL ;向从片8259发EOI命令
OUT 020H,AL ;向主片8259发EOI命令
STI ;开中断
;还原寄存器
POP DX
POP AX
POP SI
IRET ;(interrupt return)中断返回
TRAFFIC_LIGHT ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;数码管子程序
DIGIT_SUB PROC
;保存寄存器
PUSH SI
PUSH AX
PUSH DX
MOV SI,OFFSET digit
CMP digit_index,10 ;比较digit_index和9
JNZ _ELSE_DIGIT ;如果不等于9,跳转到else
MOV digit_index,0 ;否则,等于9的话,将digit_index重置为0
_ELSE_DIGIT:
;获取当前要显示的数字
MOV DX,302H ;PC口数码管
MOV AX,0
MOV AL,digit_index
ADD SI,AX
MOV AL,[SI]
OUT DX,AL
MOV DL,digit_index
ADD DL,'0'
MOV AH,2
INT 21H
INC digit_index ;将digit_index自增
;还原寄存器
POP DX
POP AX
POP SI
RET
DIGIT_SUB ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;LED子程序,每调用一次状态切换一次,通过bx传参
LED_SUB PROC
;保存寄存器
PUSH SI
PUSH AX
PUSH DX
;获取当前LED状态
MOV AX,BX ;取LED状态码
;先给低8位
MOV DX,300H
OUT DX,AL ;将AX的低8位给PA
MOV AL,AH ;将AX的高8位给PB
MOV DX,301H ;PB口LED
OUT DX,AL
;还原寄存器
POP DX
POP AX
POP SI
RET
LED_SUB ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODES ENDS
END START
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。