io0832a equ 290h
data segment
sin db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波數據
mesg db '1. sanjiao',0dh,0ah,'$'
db'2. fangbo',0dh,0ah,'$'
db'3. sinbo',0dh,0ah,'$'
data ends
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
AG: MOV DX,OFFSET mesg;顯示字符串
MOV AH,9
INT 21H
;MOV BL,00H
LOOP1: MOV AH,01H ;判斷是否有按鍵按下
INT 21h
cmp al,'1'
JNZ N1
CALL sanjiao ;三角波
N1: CMP AL,'2'
JNZ N2
CALL fangbo ;方波
N2: CMP AL,'3'
JNZ N3
CALL sin ;正弦波
push dx
mov ah,06h ;判斷是否有鍵按下
mov dl,0ffh
int 21h
pop dx
je AG
MOV AH,4CH
INT 21H
;三角波
sanjiao proc
start: mov cl,0
mov dx,io0832a
lll: mov al,cl
out dx,al
add cl,10
push dx
mov ah,06h ;判斷是否有鍵按下
mov dl,0ffh
int 21h
sub cl,10
push dx
mov ah,06h ;判斷是否有鍵按下
mov dl,0ffh
int 21h
pop dx
jz lll ;若無則轉LLL
ret
sanjiao endp
;方波
fangbo proc
start: mov cl,10
mov dx,io0832a
lll: mov al,cl
out dx,al
mov cx,2 ;延遲
delay: loop delay
sub cl,10
mov cx,2 ;延遲
delay: loop delay
push dx
mov ah,06h ;判斷是否有鍵按下
mov dl,0ffh
int 21h
pop dx
jz lll ;若無則轉LLL
ret
fangbo endp
;正弦波
sin PROC
start: mov ax,data
mov ds,ax
ll: mov si,offset sin ;置正弦波數據的偏移地址為SI
mov bh,32 ;一組輸出32個數據
lll: mov al,[si] ;將數據輸出到D/A轉換器
mov dx,io0832a
out dx,al
mov ah,06h
mov dl,0ffh
int 21h
jne exit
mov cx,1
delay: loop delay ;延時
inc si ;取下一個數據
dec bh
jnz lll ;若未取完32個數據則轉lll
jmp ll
ret
code ends
end start
|