8086制作红绿灯的问题!!!

cusuanjun 2017-12-01 04:21:59
这个程序仿真的时候一直没有变化,我不知道为什么,我需要帮助,谢谢!
……………………………………………………主程序……………………………………………………
DATAS SEGMENT ;此处输入数据段代码
TIME DB 05H ;黄灯闪烁次数
COUNTER DB 48H ;计数
DATAS ENDS
STACKS SEGMENT
DB 100 DUP (0)
STACKS ENDS
IOA EQU 0000H
IOB EQU 0002H
IOX EQU 0006H
T0 EQU 0020H
TX EQU 0026H
A0 EQU 0040H
A1 EQU 0041H
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START PROC FAR
BEGIN:PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATAS
MOV DS,AX
;……………………………………………8253A初始化………………………………………………
;一秒定时,计数器初值由时钟频率决定,本次计数时钟的频率100HZ
MOV DX,TX
MOV AL,00010101B ;T0工作方式2,十进制计数,只读写低8位
OUT DX,AL
MOV DX,T0 ;设置通道0的计数初值
MOV AL,64H ;写低8位,64H=100
OUT DX,AL
;…………………………………………8255A初始化…………………………………………………
MOV DX,IOA
MOV AL,10000000B ;设置8255A的工作方式:A口方式0
OUT DX,AL
;……………………………………………8259初始化………………………………………………
;送8259的控制字
MOV DX,A0 ;将8259控制字的偶地址送给DX
MOV AL,00010011B ;将ICW1 的控制字送给AL,上升沿触发,单片,要写ICW4
OUT DX,AL ;发送ICW1
MOV DX,A1 ;将8259控制字的奇数地址送给DX
MOV AL,80H ;将ICW2 的控制字送给AL,中断类型号80H
OUT DX,AL ;发送ICW2
MOV AL,00000101B ;将ICW4 的控制字送给AL,非缓冲,自动EOI,8086
OUT DX,AL ;发送ICW4
;送8259的状态字
MOV DX,A1 ;OCW1必须发送到奇地址端口
MOV AL,11111110B ;发送OCW1,仅打开IR0中断
OUT DX,AL
MOV DX,A0 ;OCW2必须发送到偶地址端口
MOV AL,00100000B ;发送OCW2,工作方式为普通EOI,复位IR0
OUT DX,AL
;………………………………………8253A产生秒中断向量定义…………………………………
MOV AX,0
MOV DS,AX
MOV BX,80*4 ; 中断类型号为80
MOV AX,OFFSET INTR ; 取1S计时中断子程序的偏移地址
MOV ES:WORD PTR[BX],AX ; 将偏移地址存到ES的2个低字节地址
MOV AX,SEG INTR ; 取1S计时中断子程序的段地址
MOV ES:WORD PTR[BX+2],AX ; 将段地址存到ES的2个高字节地址
;………………………………………初始化8255A各口……………………………………………
MOV AL,00000000B ;初始化8255A的A口,初始状态为显示总时间
MOV DX,IOA ;取A口地址
OUT DX,AL
MOV AL,00010001B ;初态设置为东西南北四方向的红灯全亮
MOV DX,IOB ;取B口地址
OUT DX,AL
STI ; 开中断
HERE:JMP HERE ; 等待中断,中断产生后,进入中断子程序
RET
START ENDP
;………………………………………8253A产生秒中断……………………………………………
INTR PROC
CLI ; 关中断
PUSH AX ; 保护现场
PUSH BX
PUSH CX
PUSH DX
MOV AL,COUNTER
DEC AL ;产生一秒中断将AL减1
MOV COUNTER,AL ;刷新时间
CMP AL,2AH
JA CASE0
CMP AL,2AH
JZ CASE1
CMP AL,25H
JA HERE
CMP AL,25H
JZ CASE2
CMP AL,24H
JA HERE
CMP AL,24H
JZ CASE3
CMP AL,06H
JA HERE
CMP AL,06H
JZ CASE4
CMP AL,01H
JA HERE
CMP AL,01H
JZ CASE5
CMP AL,00H
JZ EXIT
JMP EXIT
DECAH1:MOV AH,TIME
DEC AH
MOV TIME,AH
RET
DECAH2:MOV TIME,50H
MOV AH,TIME
SUB AH,10H
MOV TIME,AH
CASE0:MOV DX,IOA
MOV AL,00000000B
OUT DX,AL
MOV DX,IOB
MOV AL,01000001B
OUT DX,AL
JMP HERE
CASE1:MOV DX,IOA
CALL DECAH1
MOV AL,AH
OUT DX,AL
MOV DX,IOB
MOV AL,00100001B
OUT DX,AL
CALL DELAY
MOV AL,00000001B
OUT DX,AL
DEC CL
LOOP CASE1
JMP HERE
CASE2:MOV DX,IOA
MOV AL,00000000B
OUT DX,AL
MOV DX,IOB
MOV AL,00010001B
OUT DX,AL
JMP HERE
CASE3:MOV DX,IOA
MOV AL,00000000B
OUT DX,AL
MOV DX,IOB
MOV AL,00010100B
OUT DX,AL
JMP HERE
CASE4:CALL DECAH2
MOV AL,AH
MOV DX,IOA
OUT DX,AL
MOV DX,IOB
MOV AL,00010010B
OUT DX,AL
CALL DELAY
MOV AL,00010000B
OUT DX,AL
JMP HERE
CASE5:MOV DX,IOA
MOV AL,00000000B
OUT DX,AL
MOV DX,IOB
MOV AL,00010001B
OUT DX,AL
JMP HERE
EXIT: POP DX ;恢复现场
POP CX
POP BX
POP AX
STI ;开中断
MOV DX,A0 ;OCW2必须发送到偶地址端口
MOV AL,00100000B ;发送OCW2,工作方式为普通EOI,复位IR0
OUT DX,AL
IRET
INTR ENDP
;………………………………10ms延时程序………………………………………………………
DELAY PROC ;初值由时钟频率决定(时钟频率为5MHZ)
PUSH CX
CLI
MOV CX,5000 ;此处的延时调用程序循环执行时占用的时间
LOOPER:NOP
NOP
DEC CX ;计数值设置为5000
LOOP LOOPER
POP CX
STI
RET
DELAY ENDP
CODES ENDS
END BEGIN
...全文
956 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
cusuanjun 2017-12-01
  • 打赏
  • 举报
回复
对了,那个DCLOCK一直没有输出。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧