📄 七键电子琴.asm
字号:
dispmsg macro message ;用来调用显示字符串的宏
mov dx,offset message
mov ah,9
int 21h
endm
data segment
freq1 dw 441,-1
time1 dw 800
freq2 dw 495,-1
time2 dw 800
freq3 dw 556,-1
time3 dw 800
freq4 dw 589,-1
time4 dw 800
freq5 dw 661,-1
time5 dw 800
freq6 dw 742,-1
time6 dw 800
freq7 dw 833,-1
time7 dw 800
data ends
code segment
assume cs:code,ds:data
;main proc far
start:
mov ax,data
mov ds,ax
l0:
inputagain: mov ah,1 ;等待按键
int 21h
cmp al,'q' ;输入是否q,是则退出
je exit
cmp al,'1' ;数字<1?
jb doagain
je play1
cmp al,'2'
je play2
cmp al,'3'
je play3
cmp al,'4'
je play4
cmp al,'5'
je play5
cmp al,'6'
je play6
cmp al,'7' ;数字>7?
je play7
ja doagain
doagain:jmp inputagain
play1:mov si,offset freq1
mov di,offset time1
jmp l1
play2:mov si,offset freq2
mov di,offset time2
jmp l1
play3:mov si,offset freq3
mov di,offset time3
jmp l1
play4:mov si,offset freq4
mov di,offset time4
jmp l1
play5:mov si,offset freq5
mov di,offset time5
jmp l1
play6:mov si,offset freq6
mov di,offset time6
jmp l1
play7:mov si,offset freq7
mov di,offset time7
jmp l1
l1: mov cx,[si]
cmp cx,-1
je l0
mov bx,[di]
call gensound
add si,2
add di,2
jmp l1
exit:mov ax,4c00h
int 21h
;main endp
gensound proc near
push dx
mov al,0b6h;初始化PC机内的8254,10110110
out 43h,al ;计数器2||读写/计数器16位数||方式3||2进制
mov dx,08h
mov ax,3208h
div cx ;CX中存放的是某个音符对应的频率.DX'AX/CX:DX中存余数,AX中存商
out 42h,al ;将上述AX中的商输出到8254的计数器2端口,做为计数初值
mov al,ah
out 42h,al
in al,61h ;将PC机内的8255端口B的状态读入AL
mov ah,al
or al,3 ;将AL中的第0位和第1位置1
out 61h,al ;将AL中的值输出到PC机内8255的端口B,此时PB0和PB1都为1,
;从而使8255计数器2的OUT2可以输出到PC机内的扬声器
l2: push dx ;此处的l2相当于一个延时程序
push ax
mov dx,8h
mov ax,0f05h
s1: sub ax,1
sbb dx,0 ;SBB:带借位减法
jnz s1
pop ax
pop dx
dec bx
jnz l2
mov al,ah ;恢复PC机内8255端口B的状态
out 61h,al
pop dx
ret
gensound endp
code ends
end start
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;小结:本程序是通过使用PC机的8254 8255和扬声器来完成音乐演奏的.如果要用实验箱上的的器件,只需要相应地修改各个端口的地址; 即可.
; 本程序比较简单,只能演奏一首音乐,且程序一旦运行,音乐便开始播放直到播放结束,无法人为控制音乐的开始\暂停和停止.
; 因此如果想做的更完美,需要再对程序加以完善.
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -