在8086系统中用汇编语言写一个钢琴键盘,利用中断实现,要求只需要8个键位按键盘上的顺序从‘A'到’K',对应C调的C到B
时间: 2023-06-17 18:04:21 浏览: 161
汇编语言编写钢琴程序
以下是一个简单的实现,仅供参考:
```
.model small
.stack 100h
.data
; 定义中断向量表
org 0
dw isr
times 256-2-($-$$) db 0
; 定义键位对应的频率
freqs db 29h, 33h, 3Ch, 42h, 4Ch, 55h, 5Fh, 66h, 70h, 7Ah, 83h
.code
; 初始化段寄存器
mov ax, @data
mov ds, ax
; 初始化计数器
mov cx, 0
; 初始化音频输出
mov al, 0B6h
out 43h, al
mov ax, 1D00h
out 42h, al
mov al, ah
out 42h, al
; 启用中断
mov al, 11000000b
out 21h, al
; 无限循环
main:
jmp main
; 中断处理程序
isr proc
push ax
; 获取按键值
in al, 60h
; 判断按键是否有效
cmp al, 1Ah
jl end_isr
cmp al, 25h
jg end_isr
; 计算频率
sub al, 1Ah
mov bl, freqs[al]
mov al, bl
mov bl, 0
mov bh, 0
mov cx, 18356
div cx
mov bx, ax
; 输出频率
mov al, bh
out 43h, al
mov al, bl
out 42h, al
mov al, ah
out 42h, al
end_isr:
pop ax
iret
isr endp
end
```
以上代码定义了一个中断处理程序,可以在键盘按下时播放相应的音符。具体实现如下:
1. 定义中断向量表,将第8号中断的向量指向isr处理程序;
2. 初始化音频输出,使用0x42和0x43端口控制8254计数器,将控制字写入0x43端口,将频率分量写入0x42端口,使计数器按计算出的频率开始工作;
3. 启用中断,使用0x21端口控制中断控制器,将中断掩码写入0x21端口,使第8号中断允许响应;
4. 在主函数中使用一个无限循环,等待中断响应;
5. 中断处理程序isr读取键盘状态,获取按键值,按键值在0x1A到0x25之间,若有效则计算对应音符的频率,然后使用0x42和0x43端口输出频率,使计数器开始工作。
需要注意的是,计算频率的方法是将音符频率除以计数器的计数值,计算结果为16位整数,需要使用16位寄存器存储。
阅读全文