?? zy11_programm is teacher's.asm
字號:
;選做題2
;編寫一個聲音程序,用鍵盤的1-8鍵發(fā)出樂音,以便可以自己演奏
;按鍵 字符 ASCII碼
;shift+1 ! 21h
;shift+2 @ 40h
;shift+3 # 23h
;shift+4 $ 24h
;shift+5 % 25h
;shift+6 ^ 5Eh
;shift+7 & 26h
;shift+8 * 2Ah
data segment para
Table_L dw 131,147,165,175,196,220,247,262 ;低音1-7的頻率
Table_M dw 262,294,330,349,392,440,494,523 ;高音1-7的頻率
shift_1 equ 21h
shift_2 equ 40h
shift_3 equ 23h
shift_4 equ 24h
shift_5 equ 25h
shift_6 equ 5Eh
shift_7 equ 26h
shift_8 equ 2Ah
data ends
ss_seg segment stack
db 256 dup(?)
ss_seg ends
code segment
assume cs:code,ds:data,ss:ss_seg
main proc far
push ds ;將psp+0h處的段地址和偏移量壓入堆棧以便返回操作系統(tǒng)
xor ax, ax
push ax
mov ax, data ;裝載數(shù)據(jù)段寄存器ds,使之指向當(dāng)前數(shù)據(jù)段
mov ds, ax
main_1: mov ah, 0 ;利用bios的16號中斷,掃描鍵盤按鍵
int 16h ;AL中返回按鍵的ASCII碼,AH中返回按鍵的掃描碼
cmp al, 0dh ;判斷是否為回車鍵,是回車鍵就退出
jz main_exit
cmp al, '1'
jb main_2
cmp al, '8'
ja main_2
and ax, 000fh ;說明按下的是低音1-7,與操作將ASCII碼轉(zhuǎn)換到數(shù)字1-8
dec al ;將數(shù)值轉(zhuǎn)換成以0開始的數(shù)字,以便從表中查找頻率值
shl al, 1 ;將數(shù)值乘以2,因為每個頻率值是字型變量,這樣才能查表準(zhǔn)確
lea bx, Table_L
main_12:mov si, ax
mov di, [bx+si] ;從表中取頻率值
mov bx, 5000 ;發(fā)聲時間
call GenSound
jmp main_1
main_2: cmp al, shift_1 ;判斷是否按下shift+1鍵
jnz main_3
mov ax, 0
jmp main_11
main_3: cmp al, shift_2 ;判斷是否按下shift+2鍵
jnz main_4
mov ax, 2
jmp main_11
main_4: cmp al, shift_3 ;判斷是否按下shift+3鍵
jnz main_5
mov ax, 4
jmp main_11
main_5: cmp al, shift_4 ;判斷是否按下shift+4鍵
jnz main_6
mov ax, 6
jmp main_11
main_6: cmp al, shift_5 ;判斷是否按下shift+5鍵
jnz main_7
mov ax, 8
jmp main_11
main_7: cmp al, shift_6 ;判斷是否按下shift+6鍵
jnz main_8
mov ax, 10
jmp main_11
main_8: cmp al, shift_7 ;判斷是否按下shift+7鍵
jnz main_9
mov ax, 12
jmp main_11
main_9: cmp al, shift_8 ;判斷是否按下shift+8鍵
jnz main_10
mov ax, 14
jmp main_11
main_10:jmp main_1
main_11:lea bx, Table_M
jmp main_12
main_exit:
ret
main endp
;發(fā)聲程序
;入口:di中存放的是定時器2的計數(shù)值
; bx中存放的是延時的時間
;出口:無
GenSound proc
push ax ;保護現(xiàn)場
push bx
push cx
push dx
push si
push di
mov al, 0b6h ;寫定時器模式
out 43h, al
mov dx, 12h ;定時器分頻,533h*896=123280h
mov ax, 3280h
div di ;533h*896/給定頻率
out 42h, al ;寫定時器2的低字節(jié)
mov al, ah
out 42h, al ;寫定時器2的高字節(jié)
in al, 61h ;得到當(dāng)前61h端口的設(shè)置,并保存在ah中
mov ah, al
or al, 03h ;打開揚聲器發(fā)聲
out 61h, al
GenSound_2:
mov cx, 3000
GenSound_1:
nop
loop GenSound_1
dec bx
jnz GenSound_2
mov al, ah ;關(guān)閉揚聲器
out 61h, al
pop di ;恢復(fù)現(xiàn)場
pop si
pop dx
pop cx
pop bx
pop ax
ret
GenSound endp
code ends
end main
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -