电子琴软件设计源程序Word下载.docx
- 文档编号:17873643
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:25
- 大小:21.68KB
电子琴软件设计源程序Word下载.docx
《电子琴软件设计源程序Word下载.docx》由会员分享,可在线阅读,更多相关《电子琴软件设计源程序Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
------------------------------黑色琴键坐标--------------------------
bt_xdw57,68,90,101,112;
dw134,145,167,178,189
dw211,222,244,254,265
bt_ydw50;
bd_xdw64,75,97,108,119;
dw141,152,174,185,196
dw218,229,251,262,273
bd_ydw70;
------------------------------音乐频率值----------------------------
tunedw220,247,278,294,330,371,416;
低音
dw441,495,556,589,661,742,833;
中音
dw882,990,1112,1178,1322,1484,1655;
高音
soundcolordw0;
音色缓存,用于改变播放或弹奏时琴上音响和琴面上点阵的颜色
key_tunedw0;
按键状态缓存,用于判断是否有手动按键,1为有,0为无
keynumdw1;
按键编号缓存,用于提取对应的按键位置
delay_timedw7000;
延时缓存,用于播放时存入bx中来计数
------------自动演奏的歌曲频率和延时---------《新年好》
mus_freqdw441,441,441,330,556,556,556,441
dw441,556,661,661,589,556,495
dw495,556,589,589,556,495,556,441
dw441,556,495,330,416,495,441
dw-1;
以后以-1来判断是否结束
------------------声音节拍部分,32为一拍------------------------
mus_timedw4,4,8,8,4,4,8,8
dw4,4,8,8,4,4,16
dw4,4,8,8,4,4,8,8
dw4,4,8,8,4,4,32
dataends
************************代码段**************************
codesegment
assumeds:
data,cs:
code
-------------------------主程序-----------------------
---依次调用:
开场效果--初始化--键盘扫描--按键处理程序-------------
mainprocfar
start:
callshow_load;
调用进度条显示程序
---延时20*waitf----
pushbx
movbx,20
del:
callwaitf
decbx
jnzdel
popbx
------------重新开始-------
restart:
自动播放音乐时,按‘enter’键或音乐完全结束后会返回这里
callinit;
调用初始化程序
new_scan:
键盘扫描程序没有检测到功能键被按下时,会返回这里
callscan_key;
调用键盘扫描程序,扫描所按下的键
-----------按键处理-------
calldo_key
----重新扫描---
jmpnew_scan;
重新扫描有无键按下,直到按下esc键
mainendp
**************************矩形绘制宏**************************
drawmacrostart_x,start_y,end_x,end_y,color
localdraw_next
local:
避免宏重复调用时?
56946.标号的重复
功能:
画填充的矩形
使用条件:
start_x<
end_x,start_y<
end_y
pushax;
堆栈
pushbx
pushcx
pushdx
movah,0ch;
12号功能,像素
moval,color;
取颜色值
movbh,0;
页号0
movcx,start_x;
列起始点
movdx,start_y;
行起始点
draw_next:
int10h;
画点
inccx;
画横线
cmpcx,end_x;
比较行是否画完
jnedraw_next;
画另一行
movcx,start_x;
另一行的起始点
incdx;
下一行
cmpdx,end_y;
比较列是否画完
未完继续画
popdx;
出栈
popcx
popax
endm
**********************矩形点阵绘制宏****************************
draw_pointmacrostart_x,start_y,end_x,end_y,color
避免宏重复调用时,标号的重复
画矩形点阵
pushax
12号功能,写像素
设置颜色
inccx
隔一点
incdx
隔一行
popdx
****************************矩形框绘制宏****************************
drawsqremacrostart_x,start_y,end_x,end_y,color
localrow_up,row_down,rank_left,rank_right
--功能:
画矩形框。
pushsi
moval,color
movbh,0
movcx,start_x
movdx,start_y
row_up:
画上边
int10h
cmpcx,end_x
jnerow_up
rank_right:
画右边
cmpdx,end_y
jnerank_right
下边起始点
movsi,end_x
incsi
row_down:
画下边
cmpcx,si
jnerow_down
左边起始点
rank_left:
画左边
cmpdx,end_y
jnerank_left
popsi
********************琴键处理程序********************
do_keyprocnear
---显示按下---
pushbx;
bx入栈
movbx,keynum;
取按键编号缓存值?
56946.存入bx
callkey_down;
在屏幕上显示按下状态
----按下时琴身点阵颜色改变--纯白--
draw_point40,52,44,92,0fh;
调用矩形点阵宏,绘制音响孔左点阵
draw_point288,52,292,92,0fh;
调用矩形点阵宏,绘制音响孔右点阵
draw_point150,34,282,38,0fh;
调用矩形点阵宏,绘制正面音孔点阵
popbx;
bx出栈
---发出声音---
leabx,tune;
装入对应频率段地址到bx中
pushsi;
si入栈
movsi,keynum;
取按键编号缓存值,存入si
movdi,[bx+si];
取对应编号的音符频率值,存入di
callplay_hand;
调用手动发声程序
popsi;
---显示弹起---
在屏幕上显示弹起状态
callkey_up
----按下时琴身点阵颜色恢复--灰色--
draw_point40,52,44,92,07h;
调用矩形点阵宏,绘制音响孔左
draw_point288,52,292,92,07h;
调用矩形点阵宏,绘制音响孔右
draw_point150,34,282,38,07h;
调用矩形点阵宏,绘制正面音孔
movkey_tune,0;
恢复按键状态缓存
ret
do_keyendp
*************************手动演奏发声程序**************************
当手动按键时,播放相应键的声音,只要不放开,就会一直播放。
--在di中存放发声频率。
play_handprocnear
-----------
pushdi
moval,0b6h;
在8253的43端送出一个控制字0b6h(10110110b)
out43h,al;
从而对定时器2初始化,准备接收计数初值
movdx,12h;
1.1931Mhz/给定频率=12348h/给定频率=计数初值
movax,348ch;
12348h存入DX:
AX中,作32位运算,商存入AX,余数存入DX
divdi;
di中存放给定频率
out42h,al
inal,61h;
开扬声器
moval,ah;
给定时器2写入AX中存放的计数初值
inal,61h
movah,al;
把8255输出端的61h的0、1两位置1,并把端口状态存入ah
oral,3;
打开扬声器
out61h,al
----------------按键等待------------
wait1:
callwaitf;
调用延时
inal,60h;
读取键盘扫描码,按下和放开都有相应的扫描码,放开码=按下码+80h>
80h
testal,80h;
al和80h相与,影响标志位
jzwait1;
未放开则继续延时
恢复8255端口61h的状态,关扬声器
----------------
popdi;
恢复寄存器状态
----------
play_handendp
**********************自动播放发声程序**************************
自动播放音乐时发声。
play_autoprocnear
-----------------
保存寄存器状态
moval,ah
---------------------音响和琴面点阵闪烁程序----------------
cmpsoundcolor,1;
取音色缓存值:
与1比,为0则用color1方案,为1则用color2方案
jnzcolor1;
跳到color1方案
jmpcolor2;
跳到color2方案
-----------color1方案---
color1:
movsoundcolor,1;
此时音色缓存值从0变1
jmpwait2;
延时
-----------color2方案---
color2:
movsoundcolor,0;
此时音色缓存值从1变0
wait2:
延时t=bx*delay_time*15.08us
调用延时程序
decbx;
bx存的是节拍值,在play_sound程序中赋值
jnzwait2;
判断是否播放完毕
完毕则关闭扬声器
play_autoendp
************************任意时间延时程序************************
waitfprocnear
ax入栈
movcx,delay_time;
t=delay_time*15.08us
-----------15.08us硬件延时------------
waitf1:
andal,10h;
检查pb4口
cmpal,ah;
判断al变化否
jewaitf1;
等待al变化
保存pb4的新状态(al中)
loopwaitf1;
cx-1不为0则回到waitf
popax;
ax出栈
waitfendp
***************************按下显示程序************************
显示按下键盘时相应键盘状态。
key_downprocnear
leasi,st_lx;
载入音键起始坐标首地址
leadi,ed_lx;
载入音键结束坐标首地址
draw[si+bx],90,[di+bx],92,0fh;
调用矩形绘制宏,bx为按键标号缓存值,画一小块琴键色方块
draw[si+bx],92,[di+bx],94,07h;
调用矩形绘制宏,bx为按键标号缓存值,画一小块琴键阴影色方块
popdi
key_downendp
***************************弹起显示程序************************
显示按下键盘后相应键盘恢复以前状态。
key_upprocnear
draw[si+bx],90,[di+bx],93,07h;
调用矩形绘制宏,恢复阴影
draw[si+bx],93,[di+bx],94,08h;
调用矩形绘制宏,恢复背景色
key_upendp
***********************键盘扫描程序****************************
扫描键盘,检测是否功能键被按下。
如果按下,则改变相应的按键编号缓存和按键状态缓存。
scan_keyprocnear
movah,0;
读键盘,键盘扫描码存入ah,ASCII码存入al
int16h
movdl,al;
al中的ASCII码存入dl,为了便于修改,通过ASCII码来检测
--------------检测是否为结束键--------------
cmpah,01h;
是否是结束键,Esc键作为结束键,其扫描码为01h
jneflag_scan;
若不是继续检测
callexit;
若是则退出
----------扫描琴键--------
doremifasolaxi
低音:
zxcvbnm
中音:
asdfghj
高音:
qwertyu
flag_scan:
key_l1:
cmpdl,'
z'
是否是z
jnekey_l2;
不是则继续扫描
movkeynum,0;
是则改变按键编号缓存
movkey_tune,1;
改变按键状态缓存
jmpscan_end;
键扫描结束
key_l2:
x'
是否是x
jnekey_l3
movkeynum,2
movkey_tune,1
jmpscan_end
key_l3:
c'
是否是y
jnekey_l4
movkeynum,4
key_l4:
v'
是否是v
jnekey_l5
movkeynum,6
key_l5:
b'
是否是b
jnekey_l6
movkeynum,8
key_l6:
n'
是否是n
jnekey_l7
movkeynum,10
key_l7:
m'
是否是m
jnekey_1
movkeynum,12
key_1:
a'
是否是a
jnekey_2
movkeynum,14
key_2:
s'
是否是s
jnekey_3
movkeynum,16
key_3:
d'
是否是d
jnekey_4
movkeynum,18
key_4:
f'
是否是f
jnekey_5
movkeynum,20
key_5:
g'
是否是g
jnekey_6
movkeynum,22
key_6:
h'
是否是h
jnekey_7
movkeynum,24
key_7:
j'
是否是j
jnekey_h1
movkeynum,26
key_h1:
q'
是否是q
jnekey_h2
movkeynum,28
key_h2:
w'
是否是w
jnekey_h3
movkeynum,30
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子琴 软件设计 源程序