?? musicpro.asm
字號:
dseg segment para 'data'
dw 0 ;反向取頻率的結束標志
musf dw 262,294,330,349,392,440,494,523,0 ;頻率
;0是正向取頻率1的結束標志
must dw 7 dup(5000),10000 ;發聲時間
flag dw -1 ;-1正向取頻率,0反向取頻率,1結束
dseg ends
;******************************************************
cseg segment para 'data'
assume cs:cseg,ds:dseg
tone proc far
push ds
sub ax,ax
push ax
mov ax,dseg
mov ds,ax
lea si,musf ;si<-頻率首址
next: lea bp,must ;bp<-時間首址
freq: mov di,[si] ;取一個頻率
cmp di,0 ;頻率為0(是結束符轉)
je endf
mov bx,ds:[bp] ;取一個時間(數據段中用bp)
mov al,0b6h ;(al)=1011 0110
out 43h,al ;設置計數器2輸出方波
;求計數值
mov dx,12h ;(dx,ax)=1234deH
mov ax,34deh ;時鐘頻率=1.1931818MHZ
div di ;(dx,ax)/di商ax是計數值
;寫計數值
out 42h,al ;先寫低字節計數值
mov al,ah ;后寫高字節計數值
out 42h,al
in al,61h ;置61H口b0,b1位為1
mov ah,al ;保存61H口原值
or al,3 ;b0為1打開定時器2
out 61h,al ;b1為1打開與門
long: mov cx,2801*10 ;延時(發聲期間)
delay: loop delay
dec bx
jnz long
mov al,ah ;恢復61H口
out 61h,al
test flag,1 ;flag的b0為轉反方向取頻率
jz lower
add si,2 ;頻率偏移加2(正取向)
jmp cont
lower: sub si,2 ;頻率偏移減2(反取向)
cont: add bp,2 ;時間偏移加2
jmp freq
endf: inc flag ;正向發聲結束flag+1(為0)
;反向發聲結束falg+1(為1)
jnz exit ;為1轉結束
sub si,2 ;偏移減2(反向取)
jmp next
exit: mov al,48h
out 61h,al
ret
tone endp
;-------------------------------------------------------
cseg ends
;********************************************************
end tone
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -