📄 asm81.asm
字号:
;*********************************************************************
; Aexp8.asm 走马灯(灯光变幻)程序 *
; 内容:用DIP的8位开关控制走马灯的花样,用SW3控制走马灯的起/停
; 运行步骤:1.按下一次开关SW3,开始灯光变幻,再按下一次则停止; 可重复进行 *
; 2.按下SW3后,拨动不同的数码开关DIP,就会出现不同的灯光变幻 *
; 3.按下"q"或者"Q",退出 *
;*********************************************************************
sseg segment para stack 'stack'
dw 200 dup (?)
sseg ends
dseg segment para public 'data'
message db 'press SW3 to start and then press SW3 to stop,and so on!',0ah,0dh;系统提示信息
db 'turn on DIP one by one and display various soud-op patterns!'
db 0ah,0dh
db 'if you want to quit, please hit ''q'' or ''Q''!',0ah,0dh,'$'
flag db 0 ;初始化状态标志变量为0
t dw 0 ;初始化延时变量为0
num dw 0 ;初始化数字变量为0
data1 db 0a0h,50h,28h,14h,0ah,05h,82h,41h ;八种不同的灯光变幻组合
data2 db 41h,82h,05h,0ah,14h,28h,50h,0a0h
data3 db 81h,42h,24h,18h,18h,24h,42h,81h
data4 db 18h,24h,42h,81h,81h,42h,24h,18h
data5 db 92h,49h,24h,92h,49h,24h,92h,49h
data6 db 49h,92h,24h,49h,92h,24h,49h,92h
data7 db 0c0h,60h,30h,18h,0ch,0bh,03h,0ffh
data8 db 03h,06h,0ch,18h,30h,60h,0c0h,00h
dseg ends
cseg segment para public 'code'
assume ss:sseg,cs:cseg,ds:dseg
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: ;判断开关SW3的状态
mov dx,302h ;取8255的端口C的地址
in al,dx ;读端口C的值
;当按下开关SW3时,PC2口为低电平
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全灭
0
;返回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
;检测数码开关DIP的状态,以便产生八种不同的灯光变幻
ledflash proc
mov dx,301h ;取8255的端口B的地址
in al,dx ;读端口B的值
cmp al,0feh ;检测PB0口是否为0
jne choice1
mov si,offset data1 ;置第一种灯光变幻组合
jmp here
choice1: cmp al,0fdh ;检测PB1口是否为0
jne choice2
mov si,offset data2 ;置第二种灯光变幻组合
jmp here
choice2: cmp al,0fbh ;检测PB2口是否为0
jne choice3
mov si,offset data3 ;置第三种灯光变幻组合
jmp here
choice3: cmp al,0f7h ;检测PB3口是否为0
jne choice4
mov si,offset data4 ;置第四种灯光变幻组合
jmp here
choice4: cmp al,0efh ;检测PB4口是否为0
jne choice5
mov si,offset data5 ;置第五种灯光变幻组合
jmp here
choice5: cmp al,0dfh ;检测PB5口是否为0
jne choice6
mov si,offset data6 ;置第六种灯光变幻组合
jmp here
choice6: cmp al,0bfh ;检测PB6口是否为0
jne choice7
mov si,offset data7 ;置第七种灯光变幻组合
jmp here
choice7: cmp al,7fh ;检测PB7口是否为0
jne choice0
mov si,offset data8 ;置第八种灯光变幻组合
jmp here
;choice0: call m0 ;调用声光变幻过程
choice0: jmp wait
;送加电数据
here: 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
cseg ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -