⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transfermlights.asm

📁 一个实现交通路口红黄绿灯分别轮流亮灭的汇编语言小程序
💻 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 + -