模拟电子琴演奏程序设计。微机中扬声器控制发声原理如练习图10.1所示 其中用到8255与8253两个芯片。 程
模拟电子琴演奏程序设计。微机中扬声器控制发声原理如练习图10.1所示,其中用到8255与8253两个芯片。

程序设计流程该程序设计可以分解成两个部分:如何控制计算机的扬声器发音、如何使不同按键对应约定的声音。
模拟演奏程序算法如下:
第一步:初始化,建立分频数与发音键表。
第二步:清屏,并显示“PIANO 2004.8.15.$”。
第三步:等待按键,有键按下则往下执行。
第四步:若判断是退出键,则返回操作系统。
第五步:若判断是停止发音键,则断开送往扬声器的电平信号,并转第三步。
第六步:若判断不是退出、停止发音、发音键,转第三步。
第七步:查出与发音键对应的发音分频数,并启动8253的通道2,转第三步。
第三步采用DOS的中断调用“键盘无回显”方式输入,即按下键时,不会在屏幕上出现相应的显示。
第四步可约定回车键为退出键。
第五步可约定空格键为停止发音键。
第七步为了对8253通道2进行初始化。可向43H端口送控制字B6H,含意是:选择通道2,使其按方式3工作(送出方波信号),向通道2送16位分频数,先送低8位,后送高8位,通道2按二进制计数。
-
程序如下:
DATA SEGMENT
D1 DW 131,147,165,175,196,220,247
DW 252,294,330,349,392,440,494
D2 DW 139,156,175,185,208,233,262
DW 277,311,349,370,415,466,523
D3 DW 123,139,156,165,185,208,233
DW 247,277,311,330,370,415,466
DD1 DW 14 DUP(?)
DD2 DW 14 DUP(?)
DD3 DW 14 DUP(?)
DDD1 DB'zxcvbnmasdfghjqwertyul234567ZXCVBNMASDFGHJ'
DISP DB'PIAN02004.8.15.$'
DATA ENDS
PROGRAM SEGMENT
ASSUMECS:PROGRAM,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,0
MOV BH,07
MOV CX,0
MOV DH,24
MOV DL,79
MOV AH,6
INT 10H ;以上部分功能是清屏
MOV AL,0
MOV BH,47H
MOV CX,0914H
MOV DH,14
MOV DL,60
MOV AH,6
INT 10H ;以上部分功能是开屏幕窗口,红底白字
MOV AH,2
MOV BH,0
MOV DH,13
MOV DL,30
INT 10H ;以上是定位光标
MOV AH,9
MOV DX,OFFSET DISP
INT 21H ;显示字符串
MOV SI,0
MOV CX,42
AG1: MOV DX,12H
MOV AX,3280H
DIV D1 [SI]
MOVD D1[SI],AX
ADD SI,2
LOOP AG1 ;根据42个频率求相应的42个分频数
AG2: MOV AH,8
INT 21H ;等待按键
CMP AL,0DH
JZ LAST ;是退出键
CMP AL,20H
JNZ NEXT ;是发音键
IN AL,61H ;是停止发音键,停止发音
AND AL,0FCH
OUT 61H,AL
JMP AG2
NEXT: MOV CX,42 ;查发音键对应的分频数的地址
MOV BX,OFFSET DDD1
SCAN: CMP AL,[BX]
JZ FIND
INC BX
LOOP SCAN
JMP AG2
FIND: MOV SI,42
SUB SI,CX
SHL SI,1
MOV AL,086H ;启动8253通道2,并置新的分频数
OUT 43H,AL
MOV AX,DD1[SI]
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
OR AL,3
OUT 61H,AL
JMP AG2
LAST: IN AL,61H ;关闭扬声器,退回到操作系统
AND AL,0FCH
OUT 61H,AL
MOV AH,4CH
INT 21H
PROGRAM ENDS
END START
