📄 transfermlights.asm
字号:
ioport equ 5400h-280h
PORT_A EQU ioport+288H ;8255A口地址
PORT_B EQU ioport+289H
PORT_C EQU ioport+28AH
PORT_CTL1 EQU ioport+28BH ;8255控制口地址
PORT_0 EQU ioport+280H ;8253计数器0地址
PORT_1 EQU ioport+281H
PORT_2 EQU ioport+282H
PORT_CTL2 EQU ioport+283H ;8253控制口地址
DELAY_5 MACRO
MOV DX,PORT_CTL2 ;指向8253控制口
MOV AL, 00110111B ;8253控制字,计数器0,方式3
OUT DX,AL ;写入控制字
MOV DX,PORT_0 ;8253计数器0的端口地址
MOV AL,00H ;N的低8位
OUT DX,AL ;写入N的低8位
MOV AL,50H ;N的高8位
OUT DX,AL ;写入N的高8位
MOV DX,PORT_CTL2 ;指向8253控制口
MOV AL, 01110001B ;8253控制字,计数器1,方式0,BCD
OUT DX,AL ;写入控制字
MOV DX,PORT_1 ;8253计数器1
MOV AL,00H ;N的低8位
OUT DX,AL ;写入N的低8位
MOV AL,10H ;N的高8位
OUT DX,AL ;写入N的高8位
ENDM
DELAY_3 MACRO
;延时3秒
;初始化8253通道0,16位BCD计数,方式3,CLK0=1MHz
MOV DX,PORT_CTL2 ;指向8253控制口
MOV AL, 00110111B ;8253控制字
OUT DX,AL ;写入控制字
MOV DX,PORT_0 ;8253计数器0
MOV AL,00H ;N的低8位
OUT DX,AL ;写入N的低8位
MOV AL,50H ;N的高8位
OUT DX,AL ;写入N的高8位
;初始化8253通道1,16位BCD计数,方式0,CLK1=200Hz
MOV DX,PORT_CTL2 ;指向8253控制口
MOV AL, 01110001B ;8253控制字
OUT DX,AL ;写入控制字
MOV DX,PORT_1 ;8253计数器1
MOV AL,00H ;N的高8位
OUT DX,AL ;写入N的高8位
MOV AL,06H ;N的低8位
OUT DX,AL ;写入N的低8位
ENDM
;数据段
DATA SEGMENT
STRING DB 'Enter any key exit to dos.',0DH,0AH,'$'
DATA ENDS
;堆栈段
STACK SEGMENT STACK
DW 50 DUP(?)
STACK ENDS
;代码段
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET STRING
INT 21H
;初始化8255A,方式0,C口作输出
;PC7,PC6,PC5分别为南北路口的红黄绿灯
;PC2,PC1,PC0分别为东西路口的红黄绿灯
TES: MOV DX,PORT_CTL1 ;指向8255控制口
MOV AL,10010000B ;8255控制字,方式0,输出
OUT DX,AL ;写入控制字
MOV DX,PORT_C ;C口
MOV AL,24H ;南北路口的绿灯、东西路口的红灯同时亮
OUT DX,AL
DELAY_5
MOV DX,PORT_A
LOP1: IN AL,DX
TEST AL,00000001B
JE LOP1
MOV DX,PORT_C ;C口
MOV AL,44H ;南北路口的黄灯亮3秒,同时东西路口的红灯继续亮
OUT DX,AL
DELAY_3
MOV AH,0BH
INT 21H
TEST AL,1
JNE EXIT
MOV DX,PORT_A
LOP2: IN AL,DX
TEST AL,00000001B
JE LOP2
MOV DX,PORT_C ;C口
MOV AL,11H ;南北路口的红灯、东西路口的绿灯同时亮
OUT DX,AL
DELAY_5
MOV AH,0BH
INT 21H
TEST AL,1
JNE EXIT
MOV DX,PORT_A
LOP3: IN AL,DX
TEST AL,00000001B
JE LOP3
MOV DX,PORT_C ;C口
MOV AL,12H ;南北路口的黄灯亮3秒,同时东西路口的红灯继续亮
OUT DX,AL
DELAY_3
MOV AH,0BH
INT 21H
TEST AL,1
JNE EXIT
MOV DX,PORT_A
LOP4: IN AL,DX
TEST AL,00000001B
JE LOP4
;按任意键退出
MOV AH,0BH
INT 21H
TEST AL,1
JNE EXIT
JMP TES
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -