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
|