📄 tan.asm
字号:
data segment
;对应中音1 ~ 7和高音i的定时器记数初值
table dw 2277,2138,1808,1709
dw 1522,1356,1208,1139
data ends
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 ;ah清0
shl ax,1 ;乘以2
mov bx,ax ;记数值表是16位数据,无法采用xlat指令
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 + -