📄 music.asm
字号:
data segment ; 数据段
table dw 2277, 1993, 1808, 1709, 1522, 1356, 1208, 1139
data ends ; 对应中音1~7和高音i的定时器计数值
code segment ; 代码段
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
mov al, 0b6h ; 设置定时器2工作方式
out 43h, al
again: mov ah, 1 ; 等待按键
int 21h
cmp al, '1' ; 判断是否为数字1~8
jb next
cmp al, '8'
ja next
sub al, 30h ; 1~8的ASCII码转换为二进制数
sub al, 1 ; 再减1,将按键数字1~8变为0~7,以便查表
xor ah, ah
shl ax, 1 ; 乘以2
mov bx, ax
mov ax, table[bx] ; 在表中取出对应的计数值
out 42h, al ; 设置定时器2的计数值
mov al, ah
out 42h, al
in al, 61h ; 打开扬声器声音
or al, 03h ; 使D1D0=PB1PB0=11b,其他位不变
out 61h, al
jmp again ; 连续发声,直到按下另一个键
next: push ax
in al, 61h ; 不是数字1~8,则关闭扬声器声音
and al, 0fch ; 使D1D0=PB1PB0=00b,其他位不变
out 61h, al
pop ax
cmp al, 1bh ; 判断是否为Esc键 (对应ASCII码1bh)
jne again ; 不是Esc,继续;否则程序执行结束
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -