📄 lx.asm
字号:
;模拟交通灯
;宏定义
;>>>>>>>>>>>>清屏>>>>>>>>>>>>>>>>>
clear macro al1,ch1,cl1,dh1,dl1,bh1
push ax
push bx
push cx
push dx
mov ah,6
mov al,al1
mov ch,ch1
mov cl,cl1
mov dh,dh1
mov dl,dl1
mov bh,bh1
int 10h
pop dx
pop cx
pop bx
pop ax
endm
;>>>>>>>>>>>>>光标定位>>>>>>>>>>>>>>>>>>>>>>>>
SetGb macro dh1,dl1
push ax
push bx
push dx
mov dh,dh1
mov dl,dl1
mov bh,0
mov ah,02h
int 10h
pop dx
pop cx
pop ax
endm
;>>>>>>>>>>>>>>>>>>提示信息>>>>>>>>>>>>>>>>>>>>>>>
ShowMess macro mess
push ax
push dx
mov ah,09
lea dx,mess
int 21h
pop dx
pop ax
endm
;>>>>>>>>>>>>输出>>>>>>>>>>>>>>>>>>>>>>>>>>
OutPut macro dl1
mov ah,02h
mov dl,dl1
int 21h
endm
;数据段
data segment
COUNT DW 0 ;计时器
SEC DW 0
MIN DW 0
HOURS DW 0
SAVE_LC DW 2 DUP(?)
North db 'N$'
South db 'S$'
East db 'E$'
West db 'W$'
tital db 'Welocome to My Programing$'
mess1 db 'Time:$'
mess2 db 'Designed by LiuXia$'
mess3 db 'Please press enter to begin!$'
data ends
;代码段
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
clear 0,0,0,24,79,7 ;清全屏
clear 0,8,10,16,60,04h
SetGb 10,28
ShowMess mess2
SetGb 12,24
ShowMess mess3
Get:
mov ah,08h
int 21h
cmp al,1bh
je leave
cmp al,0dh
je next
jmp get
leave:
jmp exit
next:
clear 0,0,0,2,79,04h
SetGb 1,30
ShowMess tital
clear 0,2,2,22,77,31h
clear 0,9,10,15,70,74h ;模拟十字路口
clear 0,3,35,21,45,74h
;显示东南西北
SetGb 12,11
ShowMess West
SetGb 12,69
ShowMess East
SetGb 3,40
ShowMess North
SetGb 21,40
ShowMess South
;输出模拟交通灯和警察
SetGb 12,40
OutPut 02h
;上方的交通灯
clear 0,8,35,9,45,71h ;改交通灯初始颜色为蓝色
SetGb 8,37
OutPut 40h
SetGb 8,40
OutPut 40h
SetGb 8,43
OutPut 40h
;下方的交通灯
clear 0,15,35,16,45,71h ;改交通灯初始颜色为蓝色
SetGb 16,37
OutPut 40h
SetGb 16,40
OutPut 40h
SetGb 16,43
OutPut 40h
;右方的交通灯
clear 0,9,45,15,46,71h ;改交通灯初始颜色为蓝色
SetGb 10,46
OutPut 40h
SetGb 12,46
OutPut 40h
SetGb 14,46
OutPut 40h
;左方的交通灯
clear 0,9,34,15,35,71h ;改交通灯初始颜色为蓝色
SetGb 10,34
OutPut 40h
SetGb 12,34
OutPut 40h
SetGb 14,34
OutPut 40h
MOV AH,35H ;将原中断保存在自设单元中
MOV AL,1CH
INT 21H
MOV SAVE_LC,BX
MOV SAVE_LC+2,ES
PUSH DS ;自设中断调用计数器
MOV DX,SEG CLINT
MOV DS,DX
MOV DX,OFFSET CLINT
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS
IN AL,21H ;允许定时器中断
AND AL,11111110B
OUT 21H,AL
begin:
;开始 东西先行,再南北
MOV COUNT,0 ;计时器
MOV SEC,0 ;将时间各单元计数器,时,分,秒清0
MOV MIN,0
MOV HOURS,0
;左方的交通灯
clear 0,9,34,15,35,72h ;改交通灯初始颜色为绿色--放行
SetGb 10,34
OutPut 40h
SetGb 12,34
OutPut 40h
SetGb 14,34
OutPut 40h
;右方的交通灯
clear 0,9,45,15,46,72h ;改交通灯初始颜色为绿色
SetGb 10,46
OutPut 40h
SetGb 12,46
OutPut 40h
SetGb 14,46
OutPut 40h
;上方的交通灯
clear 0,8,35,9,45,74h ;改交通灯初始颜色为红色--禁止通行
SetGb 8,37
OutPut 40h
SetGb 8,40
OutPut 40h
SetGb 8,43
OutPut 40h
;下方的交通灯
clear 0,15,35,16,45,74h ;改交通灯初始颜色为红色
SetGb 16,37
OutPut 40h
SetGb 16,40
OutPut 40h
SetGb 16,43
OutPut 40h
MOV DX,35890 ;时间延迟5秒 通行时间
aa1:
MOV CX,65535
bb1:
LOOP bb1
DEC DX
JNE aa1
SetGb 4,10 ;输出通行时间
ShowMess mess1
SetGb 5,12
call DISPTIME
MOV DX,25890 ;时间延迟1秒 显示通行时间
aa2:
MOV CX,5535
bb2:
LOOP bb2
DEC DX
JNE aa2
;开始变黄灯
clear 0,4,10,5,20,31h ;清除上次的时间
MOV COUNT,0 ;计时器
MOV SEC,0 ;将时间各单元计数器,时,分,秒清0
MOV MIN,0
MOV HOURS,0
;左方的交通灯
clear 0,9,34,15,35,7eh ;改交通灯初始颜色为黄色--警告
SetGb 10,34
OutPut 40h
SetGb 12,34
OutPut 40h
SetGb 14,34
OutPut 40h
;右方的交通灯
clear 0,9,45,15,46,7eh ;改交通灯初始颜色为黄色--警告
SetGb 10,46
OutPut 40h
SetGb 12,46
OutPut 40h
SetGb 14,46
OutPut 40h
;上方的交通灯
clear 0,8,35,9,45,7eh ;
SetGb 8,37
OutPut 40h
SetGb 8,40
OutPut 40h
SetGb 8,43
OutPut 40h
;下方的交通灯
clear 0,15,35,16,45,7eh ;
SetGb 16,37
OutPut 40h
SetGb 16,40
OutPut 40h
SetGb 16,43
OutPut 40h
MOV DX,35890 ;时间延迟3秒
aa3:
MOV CX,35535
bb3:
LOOP bb3
DEC DX
JNE aa3
;开始南北通行
clear 0,4,10,5,20,31h ;清除上次的时间
MOV COUNT,0 ;计时器
MOV SEC,0 ;将时间各单元计数器,时,分,秒清0
MOV MIN,0
MOV HOURS,0
;左方的交通灯
clear 0,9,34,15,35,74h ;改交通灯初始颜色为红色
SetGb 10,34
OutPut 40h
SetGb 12,34
OutPut 40h
SetGb 14,34
OutPut 40h
;右方的交通灯
clear 0,9,45,15,46,74h ;改交通灯初始颜色为红色--禁止通行
SetGb 10,46
OutPut 40h
SetGb 12,46
OutPut 40h
SetGb 14,46
OutPut 40h
;上方的交通灯
clear 0,8,35,9,45,72h ;改交通灯初始颜色为绿色
SetGb 8,37
OutPut 40h
SetGb 8,40
OutPut 40h
SetGb 8,43
OutPut 40h
;下方的交通灯
clear 0,15,35,16,45,72h ;改交通灯初始颜色为绿色--放行
SetGb 16,37
OutPut 40h
SetGb 16,40
OutPut 40h
SetGb 16,43
OutPut 40h
MOV DX,35890 ;时间延迟5秒
aa5:
MOV CX,65535
bb5:
LOOP bb5
DEC DX
JNE aa5
SetGb 4,10
ShowMess mess1
SetGb 5,12
call DISPTIME
MOV DX,25890 ;时间延迟1秒 显示通行时间
aa6:
MOV CX,5535
bb6:
LOOP bb6
DEC DX
JNE aa6
;开始变黄灯
clear 0,4,10,5,20,31h ;清除上次的时间
MOV COUNT,0 ;计时器
MOV SEC,0 ;将时间各单元计数器,时,分,秒清0
MOV MIN,0
MOV HOURS,0
;左方的交通灯
clear 0,9,34,15,35,7eh ;改交通灯初始颜色为黄色--警告
SetGb 10,34
OutPut 40h
SetGb 12,34
OutPut 40h
SetGb 14,34
OutPut 40h
;右方的交通灯
clear 0,9,45,15,46,7eh ;改交通灯初始颜色为黄色
SetGb 10,46
OutPut 40h
SetGb 12,46
OutPut 40h
SetGb 14,46
OutPut 40h
;上方的交通灯
clear 0,8,35,9,45,7eh ;
SetGb 8,37
OutPut 40h
SetGb 8,40
OutPut 40h
SetGb 8,43
OutPut 40h
;下方的交通灯
clear 0,15,35,16,45,7eh ;
SetGb 16,37
OutPut 40h
SetGb 16,40
OutPut 40h
SetGb 16,43
OutPut 40h
MOV DX,35890 ;时间延迟3秒
aa7:
MOV CX,65535
bb7:
LOOP bb7
DEC DX
JNE aa7
mov ah,0bh
int 21h
inc al
je exit
clear 0,4,10,5,20,31h ;清除上次的时间
jmp begin
exit:
mov ah,4ch
int 21h
;***************
;中断函数
;***************
CLINT PROC NEAR ;自设时间中断子过程
PUSH DS
PUSH BX
MOV BX,DATA
MOV DS,BX
LEA BX,COUNT
INC WORD PTR[BX]
CMP WORD PTR[BX],18 ;18次中断为1秒
JNE RETURN1
CALL INCT ;调用分秒转换子程序
ADJ:
CMP HOURS,12 ;处理"时"
JLE RETURN1
SUB HOURS,12
RETURN1:
POP BX
POP DS
STI
IRET
CLINT ENDP
;**************
;分秒转换子程序
;**************
INCT PROC NEAR
MOV WORD PTR[BX],0
ADD BX,2
INC WORD PTR[BX]
CMP WORD PTR[BX],60 ;60秒为1分
JNE EXIT1
CALL INCT
EXIT1:
RET
INCT ENDP
;****************
;显示计时器时间
;****************
DISPTIME PROC NEAR
MOV AX,MIN ;显示"分"
CALL BINDECCXC1
MOV BX,0
MOV AL,':'
MOV AH,0EH
INT 10H
MOV AX,SEC ;显示"秒"
CALL BINDECCXC1
MOV BX,0
MOV AL,':'
MOV AH,0EH
INT 10H
MOV BX,COUNT ;显示"毫秒"
MOV AL,55
MUL BL
CALL BINDECCXC
RET
DISPTIME ENDP
;********************
;为显示时间而服务的二进制->十进制(3位)
;********************
BINDECCXC PROC NEAR
MOV CX,100
CALL DECDIVCXC
MOV CX,10
CALL DECDIVCXC
MOV CX,1
CALL DECDIVCXC
RET
BINDECCXC ENDP
;*********************
;为显示时间而服务的二进制->十进制(2位)
;*********************
BINDECCXC1 PROC NEAR
MOV CX,10
CALL DECDIVCXC
MOV CX,1
CALL DECDIVCXC
RET
BINDECCXC1 ENDP
;**************************
;为显示时间而服务的二进制->十进制(1位)
;**************************
DECDIVCXC PROC NEAR
MOV DX,0
DIV CX
MOV BX,0
ADD AL,30H
MOV AH,0EH
INT 10H
MOV AX,DX
RET
DECDIVCXC ENDP
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -