?? aexp8.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 80h,40h,20h,10h,08h,04h,02h,01h ;八種不同的燈光變幻組合
data2 db 01h,02h,04h,08h,10h,20h,40h,80h
data3 db 80h,20h,08h,02h,40h,10h,04h,01h
data4 db 01h,04h,10h,40h,02h,08h,20h,80h
data5 db 0c0h,30h,0ch,03h,0c0h,30h,0ch,03h
data6 db 03h,0ch,30h,0c0h,03h,0ch,30h,0c0h
data7 db 81h,42h,24h,18h,81h,42h,24h,18h
data8 db 18h,24h,42h,81h,18h,24h,42h,81h
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全滅
;返回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
;送加電數據0
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 + -