音乐发生器接口程序

更新时间:2023-05-28 09:48:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微机原理实验 音乐发生器接口程序

;*------------------------------------------------------*/

;* Music.asm(音乐发生器接口实验) */

;* 音乐发生器程序Source File */

;* Copyright (c) 2005 by HUST */

;*------------------------------------------------------*/

sstack segment stack

dw 200 dup(?)

sstack ends

data segment

bg db 'hou lai...'

db 0ah,0dh

db 'press any key to stop! ',0ah,0dh,'$'

freq dw 2 dup(330,294,330) ;"后来乐曲中,音符的频率(音阶) dw 2 dup(262,262,262,294,330,349) ;其中,0频率表示结尾 dw 2 dup(330,330,349,294,262,294,294,247,247)

dw 2 dup(262,262,220,220,247,262,262,294)

dw 2 dup(330,247,247,247,262,247,220)

dw 2 dup(220,440,392,349,330,349)

dw 2 dup(392,247,262,349,330)

dw 2 dup(349,349,349,330,249,262,247,294,262)0

time dw 10 dup(4,2,2) ; "后来"乐曲中,音符的延时(节拍) dw 2 dup(16,4,4,4,4,4) ;其中4,8,16表示延时的次数 dw 2 dup(16,2,2,4,2,2,4,2,2)

dw 2 dup(8,2,2,2,2,8,4,4)

dw 2 dup(4,2,2,1,4,2,2)

dw 2 dup(16,4,4,4,4,4)

dw 2 dup(8,4,1,4,4)

dw 2 dup(8,2,2,4,4,4,2,2,24)0

old_seg dw ?

old_off dw ?

data ends

code segment

assume cs:code, ds:data, ss:sstack

star proc far ;程序开始

mov ax,data

mov ds,ax

mov ax,sstack

mov ss,ax

微机原理实验 音乐发生器接口程序

push di ;寄存器压栈

push si

push bp

push bx

mov al,80h ;8255初始化0

mov dx,303h

out dx,al

mov al,06h

mov dx,303h

out dx,al

mov al,0eh

mov dx,303h

out dx,al

mov al,36h

mov dx,307h

out dx,al

mov dx,offset bg

mov ah,9

int 21h

mov si,offset freq

mov bp,offset time

pp: mov ah, 0bh

int 21h

cmp al,00

jne end_sing

mov di,[si]

cmp di,0

je end_sing

mov dx,12h

mov ax,34dch

div di

mov dx,304h

out dx,al

mov al,ah

out dx,al

mov dx,303h ;关闭8253的T2计数器(8255的PC6=0) ;关闭喇叭(8255的PC0=0) 初始化0 ;显示提示信息 ;设置频率指针→si ;设置延时指针→bp ;检测是否有任意键按下? ;若有,则结束演凑 ;取1个音符的频率→di ;检测是否是乐曲结尾 ;若是,则结束演凑 ;计算音符的频率所对应的8253计数初值;1.19318MHz ;向8253装入计数初值 ;先装低字节 ;再装高字节 ;打开喇叭(8255的PC0=1) ;8253

微机原理实验 音乐发生器接口程序

mov al,0fh

out dx,al

mov al,07h ;打开8253的T2(PC6=1),开始发声 out dx,al

mov bx,ds:[bp] ;取1个音符的延时次数→bx

call time_delay ;调用延时子程

mov dx,303h ;关闭8253的T2(PC6=0)

mov al,06h

out dx,al

mov al,0eh

out dx,al

add si,2

add bp,2

jmp pp

end_sing:

mov dx, 303h

mov al,06h

out dx, al

mov al, 0eh

out dx, al

pop bx

pop bp

pop si

pop di

mov ax,4c00h

int 21h

star endp

new_intr proc

dec bx

iret

new_intr endp

time_delay proc near

pushf

push ds

push es

push bx ;关闭喇叭(PC0=0) ;取下1 个音符的频率 ;取下1 个音符的延时次数 继续 ;关闭8253的T2 ;关闭喇叭 ;寄存器出栈 ;返回DOS ;新中断服务程序 ;该服务程序只将延时次数-1 ;延时子程序 ;压栈 ;

微机原理实验 音乐发生器接口程序

mov ah,35h ;取原中断(INT1CH)的向量,并保存 mov al,1ch

int 21h

mov old_off, bx

mov bx, es

mov old_seg, bx

pop bx

pop es

push ds

mov ah, 25h

mov al, 1ch

mov dx, seg new_intr

mov ds,dx

lea dx, new_intr

int 21h

pop ds

TD: cmp bx,0h

jnz TD

mov ah,25h

mov al,1ch

mov dx,old_seg

push dx

mov dx,old_off

pop ds

int 21h

pop ds

popf

;time delay end

ret

time_delay endp

code ends

end star ;设置新中断服务程序的向量 ;延时次数已到? ;未到,则继续 已到,则恢复原中断向量 ;程序结束 ;

本文来源:https://www.bwwdw.com/article/td84.html

Top