shift_8 equ 2Ah
ends
stack
data
ss_seg segment
db 256 dup(?)
ss_seg ends code
segment
assume cs:code,ds:data,ss:ss_seg main
proc push xor push mov mov
far ds ax, ax ax
ax, data ds, ax ah, 0
;利用bios的16号中断,扫描键盘按键 ;AL中返回按键ASCII码,AH中返回按键扫描码 ;判断是否为回车键,是回车键就退出 ;装载数据段寄存器ds,使之指向当前数据段
;将psp+0h处段地址和偏移量压入堆栈以便返回OS
main_1: mov
int cmp jz cmp jb cmp ja and
16h
al, 0dh
main_exit
al, '1'
main_2
al, '8'
main_2 ax, 000fh
;说明按下的是低音1-7,与操作将ASCII ;码转换到数字1-8
dec shl lea
al al, 1
;将数值转换成以0开始的数字,以便从表中查找频率值 ;将数值乘以2,因每个频率值是字变量
bx, Table_L
si, ax di, [bx+si] bx, 5000
;从表中取频率值 ;发声时间
main_12:mov
mov mov
call GenSound jmp
main_1
al, shift_1
;判断是否按下shift+1键
main_2: cmp
jnz mov
main_3
ax, 0
16
jmp main_11 main_3: cmp jnz mov
jmp
main_4: cmp jnz mov
jmp
main_5: cmp jnz mov
jmp
main_6: cmp jnz mov
jmp
main_7: cmp jnz mov
jmp
main_8: cmp jnz mov
jmp
main_9: cmp jnz mov
jmp
main_10:jmp main_11:lea
jmp
main_exit:
ret
al, shift_2
main_4
ax, 2
main_11
al, shift_3
main_5
ax, 4
main_11
al, shift_4
main_6
ax, 6
main_11
al, shift_5
main_7
ax, 8
main_11
al, shift_6
main_8
ax, 10
main_11
al, shift_7
main_9
ax, 12
main_11
al, shift_8
main_10
ax, 14
main_11
main_1
bx, Table_M main_12
;判断是否按下shift+2键
;判断是否按下shift+3键
;判断是否按下shift+4键
;判断是否按下shift+5键
;判断是否按下shift+6键
;判断是否按下shift+7键
;判断是否按下shift+8键
17
main endp
;发声程序
;入口:di中存放的是定时器2的计数值 ; bx中存放的是延时的时间 ;出口:无 GenSound proc push push push push push push mov out mov mov div out mov out in mov or
out
GenSound_2:
mov
GenSound_1: nop loop dec jnz mov out
pop
ax
;保护现场
bx cx dx si di
al, 0b6h ;写定时器模式
43h, al dx, 12h ;定时器分频,533h*896=123280h
ax, 3280h
di
;533h*896/给定频率 42h, al ;写定时器2的低字节
al, ah
42h, al ;写定时器2的高字节
al, 61h ;得到当前61h端口的设置,并保存在ah中
ah, al
al, 03h ;打开扬声器发声
61h, al
cx, 3000
GenSound_1 bx
GenSound_2
al, ah
;关闭扬声器
61h, al di
;恢复现场
18
pop si pop dx pop cx pop bx pop ax
ret
GenSound endp
code ends
end
main
19