📄 01.txt
字号:
stack segment
dw 200 dup (?)
stack ends
data segment
message db 'You are driving a so beautiful car,please keep taking care of your steering wheel and road!',0ah,0dh;系统提示信息
db 'Turn on switchs and watch the light glint!',0ah,0dh
db 'Switch1 is for zuozhuan,switch2 is for youzhuan,switch3 is for jinji,switch4 is for tingkao,switch5 is for shache!'
db 0ah,0dh
db 'If you want to quit, please hit ''q'' or ''Q''!',0ah,0dh,'$'
err db 'You have a mistake in your operation!',0ah,0dh,'$'
flag db 0 ;初始化状态标志变量为0
t dw 0 ;初始化延时变量为0
num dw 0 ;初始化数字变量为0
data1 db 15h,00h,15h,00h,15h,00h ;左转/左转刹车
data2 db 2ah,00h,2ah,00h,2ah,00h ;右转/右转刹车
data ends
code segment
assume ss:stack,cs:code,ds:data
m proc far
start: mov ax,ds
push ax
mov ax,00h
push ax ;保留程序数据段地址
mov ah,09h ;显示系统提示信息
mov dx,seg message
mov ds,dx
mov dx,offset message
int 21h
;初始化8255
mov dx,303h ;取8255的控制端口的地址
mov al,83h ;初始化8255的A口和C口高四位为输出模式
out dx,al ;B口和C口低四位为输入模式
;初始化灯LED全灭
mov dx,300h ;取8255的端口A的地址
mov al,00h ;使8255的PA0-PA7全为0
out dx,al ;使所有的灯LED全灭
wait: ;检测"q"或者"Q"键
mov ah,0bh
int 21h ;调用DOS 21H 功能0BH 进行键盘判断
inc al
jnz readpc ;检测是否有键按下
mov ah,08h
int 21h ;调用DOS 21H 功能08H 进行键盘输入判断
cmp al,'q'
jz quit ;检测到"q",退出
cmp al,'Q'
jz quit ;检测到"Q",退出
readpc: mov dx,302h ;取8255的端口C的地址
in al,dx ;读端口C的值
test al,04h ;检测PC2口状态
jnz case
lp: in al,dx
test al,04h
jz lp ;循环检测直至放开
xor flag,01h ;将状态值取反
case: cmp flag,01h ;进行状态值比较
jne stop
begin: call ledflash ;调用灯光变幻过程
call delay2
jmp wait
;灯LED全灭
stop: mov dx,300h ;取8255的端口A的地址
mov al,00h ;使8255的PA0-PA7全为0
out dx,al ;使所有的灯LED全灭
jmp wait
quit: ;灯LED全灭
mov dx,300h ;取8255的端口A的地址
mov al,00h ;使8255的PA0-PA7全为0
out dx,al ;使所有的灯LED全灭
;返回DOS
mov ah,4ch ;DOS功能调用
int 21h ;返回DOS
m endp
delay2 proc
push cx
push bx
mov cx,02ffh
dl4: mov bx,0ffffh
dl3: dec bx
jnz dl3
dec cx
jnz dl4
pop bx
pop cx
ret
delay2 endp
;检测开关switch的状态,以便产生八种不同的灯光变幻
ledflash proc
mov dx,301h ;取8255的端口B的地址
in al,dx ;读端口B的值
cmp al,81h ;检测PB0口switch1是否为1(是否左转)
jne choice1
mov si,offset data1 ;置第一种灯光变幻组合
jmp here
choice1: cmp al,82h ;检测PB1口switch2是否为1(是否右转或)
jne choice10
mov si,offset data2 ;置第二种灯光变幻组合
jmp here
choice10: mov dx,OFFSET err ;若状态均不符合,则为违规
mov ah,09H ;操作,输出错误信息
int 21H
jmp choice0
;choice0: call m0 ;调用声光变幻过程
choice0: jmp wait
;送加电数据
here: ;8253输出方波控制闪烁频率;
mov dx,287h ;8253控制口地址;
mov al,36h ;通道0,工作方式3,二进制计数;
out dx,al ;8253控制字送控制口;
mov dx,284h ;8253通道0地址;
mov al,96h
out dx,al
add si,num
mov al,[si] ;取当前加电数据
mov dx,300h ;取8255的端口A的地址
out dx,al ;输出加电数据到端口A
inc num ;改变数字变量的值
cmp num,08h
jne next
mov num,00h
next: ret
ledflash endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -