电子琴软件设计源程序.doc

上传人:星星 文档编号:1038638 上传时间:2024-03-28 格式:DOC 页数:17 大小:110KB
下载 相关 举报
电子琴软件设计源程序.doc_第1页
第1页 / 共17页
电子琴软件设计源程序.doc_第2页
第2页 / 共17页
电子琴软件设计源程序.doc_第3页
第3页 / 共17页
电子琴软件设计源程序.doc_第4页
第4页 / 共17页
电子琴软件设计源程序.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、data segment;-进度条字符-st_load db 10 ;起始行db 4 ;起始列db 0bh ;字体颜色db *db 00;-字符定义-start_col db ? ;存储起始行text db 14 ;起始行db 2 ;起始列db 0fh ;字体颜色db AUTOMATION 0902 herun ,0ffh,0ffh ;显示字db happy new year!,0ffh ;以0ffh来判断是否换行db -1-2-3-4-5-6-7-,0ffhdb H q w e r t y u p: play,0ffhdb M a s d f g h j enter: stop,0ffhdb

2、 L z x c v b n m Esc: exit,0ffhdb 1/2: speed down/up,0ffhdb 00;-白色琴键坐标-st_lx dw 50,61,72,83,94,105,116 ;起点横坐标dw 127,138,149,160,171,182,193dw 204,215,226,237,248,259,270st_y dw 50 ;起点纵坐标ed_lx dw 60,71,82,93,104,115,126 ;终点横坐标dw 137,148,159,170,181,192,203dw 214,225,236,247,258,269,280ed_y dw 90 ;终点纵

3、坐标;-黑色琴键坐标-bt_x dw 57,68,90,101,112 ;起点横坐标dw 134,145,167,178,189dw 211,222,244,254,265bt_y dw 50 ;起点纵坐标bd_x dw 64,75,97,108,119 ;终点横坐标dw 141,152,174,185,196dw 218,229,251,262,273bd_y dw 70 ;终点纵坐标;-音乐频率值-tune dw 220,247,278,294,330,371,416 ;低音dw 441,495,556,589,661,742,833 ;中音dw 882,990,1112,1178,132

4、2,1484,1655 ;高音soundcolor dw 0 ;音色缓存,用于改变播放或弹奏时琴上音响和琴面上点阵的颜色key_tune dw 0 ;按键状态缓存,用于判断是否有手动按键,1为有,0为无keynum dw 1 ;按键编号缓存,用于提取对应的按键位置delay_time dw 7000 ;延时缓存,用于播放时存入bx中来计数;-自动演奏的歌曲频率和延时-新年好mus_freq dw 441,441,441,330,556,556,556,441 dw 441,556,661,661,589,556,495 dw 495,556,589,589,556,495,556,441 dw

5、 441,556,495,330,416,495,441 dw -1 ;以后以-1来判断是否结束;-声音节拍部分,32为一拍-mus_time dw 4,4,8,8,4,4,8,8dw 4,4,8,8,4,4,16dw 4,4,8,8,4,4,8,8dw 4,4,8,8,4,4,32data ends ;*代码段*code segmentassume ds:data,cs:code;-主程序-;-依次调用:开场效果-初始化-键盘扫描-按键处理程序-main proc farstart: call show_load ;调用进度条显示程序;-延时20*waitf-push bx mov bx,2

6、0del: call waitfdec bxjnz delpop bx;-重新开始-restart: ;自动播放音乐时,按enter键或音乐完全结束后会返回这里call init ;调用初始化程序new_scan: ;键盘扫描程序没有检测到功能键被按下时,会返回这里call scan_key ;调用键盘扫描程序,扫描所按下的键;-按键处理-call do_key;-重新扫描-jmp new_scan ;重新扫描有无键按下,直到按下esc键main endp;*矩形绘制宏*draw macro start_x,start_y,end_x,end_y,colorlocal draw_next;lo

7、cal:避免宏重复调用时?56946 .标号的重复;功能:画填充的矩形;使用条件:start_x end_x ,start_y end_ypush ax ;堆栈push bxpush cxpush dxmov ah,0ch ;12号功能,像素mov al,color ;取颜色值mov bh,0 ;页号0mov cx,start_x ;列起始点mov dx,start_y ;行起始点draw_next:int 10h ;画点inc cx ;画横线cmp cx,end_x ;比较行是否画完jne draw_next ;画另一行mov cx, start_x ;另一行的起始点inc dx ;下一行c

8、mp dx,end_y ;比较列是否画完jne draw_next ;未完继续画pop dx ;出栈pop cxpop bxpop axendm;*矩形点阵绘制宏*draw_point macro start_x,start_y,end_x,end_y,colorlocal draw_next;local:避免宏重复调用时,标号的重复;功能:画矩形点阵;使用条件:start_x end_x ,start_y 80htest al,80h ;al和80h相与,影响标志位jz wait1 ;未放开则继续延时mov al,ah ;恢复8255端口61h的状态,关扬声器out 61h,al;-pop

9、di ;恢复寄存器状态pop dxpop cxpop bxpop ax;-retplay_hand endp;*自动播放发声程序*;-功能:自动播放音乐时发声。play_auto proc near;-push ax ;保存寄存器状态push bxpush cxpush dxpush di;-mov al,0b6h ;在8253的43端送出一个控制字0b6h(10110110b)out 43h,al ;从而对定时器2初始化,准备接收计数初值mov dx,12h ;1.1931Mhz/给定频率=12348h/给定频率=计数初值mov ax,348ch ;12348h存入DX:AX中,作32位运算

10、,商存入AX,余数存入DXdiv di ;di中存放给定频率out 42h,alin al,61h ;给定时器2写入AX中存放的计数初值mov al,ahout 42h,alin al,61hmov ah,al ;把8255输出端的61h的0、1两位置1,并把端口状态存入ahor al,3 ;打开扬声器out 61h,al;-音响和琴面点阵闪烁程序-cmp soundcolor,1 ;取音色缓存值:与1比,为0则用color1方案,为1则用color2方案jnz color1 ;跳到color1方案jmp color2 ;跳到color2方案;-color1方案-color1:draw_poi

11、nt 40,52,44,92,0fh ;调用矩形点阵宏,绘制音响孔左draw_point 288,52,292,92,0fh ;调用矩形点阵宏,绘制音响孔右draw_point 150,34,282,38,07h ;调用矩形点阵宏,绘制正面音孔mov soundcolor,1 ;此时音色缓存值从0变1jmp wait2 ;延时;-color2方案-color2:draw_point 40,52,44,92,07h ;调用矩形点阵宏,绘制音响孔左draw_point 288,52,292,92,07h ;调用矩形点阵宏,绘制音响孔右draw_point 150,34,282,38,0fh ;调用

12、矩形点阵宏,绘制正面音孔mov soundcolor,0 ;此时音色缓存值从1变0wait2: ;延时t=bx*delay_time*15.08uscall waitf ;调用延时程序dec bx ;bx存的是节拍值,在play_sound程序中赋值jnz wait2 ;判断是否播放完毕mov al,ah ;完毕则关闭扬声器out 61h,al;-pop di ;恢复寄存器状态pop dxpop cxpop bxpop ax;-retplay_auto endp;*任意时间延时程序*waitf proc nearpush ax ;ax入栈mov cx,delay_time ;t=delay_t

13、ime*15.08us;-15.08us硬件延时-waitf1:in al,61hand al,10h ;检查pb4口cmp al,ah ;判断al变化否je waitf1 ;等待al变化mov ah,al ;保存pb4的新状态(al中)loop waitf1 ;cx-1不为0则回到waitfpop ax ;ax出栈;-retwaitf endp;*按下显示程序*;-功能:显示按下键盘时相应键盘状态。key_down proc nearpush sipush dilea si,st_lx ;载入音键起始坐标首地址lea di,ed_lx ;载入音键结束坐标首地址draw si+bx,90,di

14、+bx,92,0fh ;调用矩形绘制宏,bx为按键标号缓存值,画一小块琴键色方块draw si+bx,92,di+bx,94,07h ;调用矩形绘制宏,bx为按键标号缓存值,画一小块琴键阴影色方块pop dipop siretkey_down endp;*弹起显示程序*;-功能:显示按下键盘后相应键盘恢复以前状态。key_up proc nearpush sipush dilea si,st_lx ;载入音键起始坐标首地址lea di,ed_lx ;载入音键结束坐标首地址draw si+bx,90,di+bx,93,07h ;调用矩形绘制宏,恢复阴影draw si+bx,93,di+bx,94

15、,08h ;调用矩形绘制宏,恢复背景色pop dipop siretkey_up endp;*键盘扫描程序*;-功能:扫描键盘,检测是否功能键被按下。;如果按下,则改变相应的按键编号缓存和按键状态缓存。scan_key proc nearmov ah,0 ;读键盘,键盘扫描码存入ah,ASCII码存入alint 16hmov dl,al ;al中的ASCII码存入dl,为了便于修改,通过ASCII码来检测;-检测是否为结束键-cmp ah,01h ;是否是结束键,Esc键作为结束键,其扫描码为01hjne flag_scan ;若不是继续检测call exit ;若是则退出;-扫描琴键-; d

16、o re mi fa so la xi;低音:z x c v b n m;中音:a s d f g h j;高音:q w e r t y uflag_scan:key_l1:cmp dl,z ;是否是zjne key_l2 ;不是则继续扫描mov keynum,0 ;是则改变按键编号缓存mov key_tune,1 ;改变按键状态缓存jmp scan_end ;键扫描结束key_l2:cmp dl,x ;是否是xjne key_l3mov keynum,2mov key_tune,1jmp scan_endkey_l3:cmp dl,c ;是否是yjne key_l4mov keynum,4m

17、ov key_tune,1jmp scan_endkey_l4:cmp dl,v ;是否是vjne key_l5mov keynum,6mov key_tune,1jmp scan_endkey_l5:cmp dl,b ;是否是bjne key_l6mov keynum,8mov key_tune,1jmp scan_endkey_l6:cmp dl,n ;是否是njne key_l7mov keynum,10mov key_tune,1jmp scan_endkey_l7:cmp dl,m ;是否是mjne key_1mov keynum,12mov key_tune,1jmp scan_e

18、ndkey_1:cmp dl,a ;是否是ajne key_2mov keynum,14mov key_tune,1jmp scan_endkey_2:cmp dl,s ;是否是sjne key_3mov keynum,16mov key_tune,1jmp scan_endkey_3:cmp dl,d ;是否是djne key_4mov keynum,18mov key_tune,1jmp scan_endkey_4:cmp dl,f ;是否是fjne key_5mov keynum,20mov key_tune,1jmp scan_endkey_5:cmp dl,g ;是否是gjne ke

19、y_6mov keynum,22mov key_tune,1jmp scan_endkey_6:cmp dl,h ;是否是hjne key_7mov keynum,24mov key_tune,1jmp scan_endkey_7:cmp dl,j ;是否是jjne key_h1mov keynum,26mov key_tune,1jmp scan_endkey_h1:cmp dl,q ;是否是qjne key_h2mov keynum,28mov key_tune,1jmp scan_endkey_h2:cmp dl,w ;是否是wjne key_h3mov keynum,30mov key

20、_tune,1jmp scan_endkey_h3:cmp dl,e ;是否是ejne key_h4mov keynum,32mov key_tune,1jmp scan_endkey_h4:cmp dl,r ;是否是rjne key_h5mov keynum,34mov key_tune,1jmp scan_endkey_h5:cmp dl,t ;是否是tjne key_h6mov keynum,36mov key_tune,1jmp scan_endkey_h6:cmp dl,y ;是否是yjne key_h7mov keynum,38mov key_tune,1jmp scan_endk

21、ey_h7:cmp dl,u ;是否是ujne scan_endmov keynum,40mov key_tune,1scan_end:cmp dl,p ;判断是否按下了自动播放键jnz hand_play ;若不是,继续扫描call do_song ;若是,调用演奏音乐子程序jmp restart ;演奏结束,返回restarthand_play:cmp key_tune,1 ;取按键状态缓存值,判断是否手动演奏,1为有,0为无jnz again ;若不是,重新扫描有无键按下ret ;若是音键,则返回并继续进行音键处理again:jmp new_scanscan_key endp;*播放音乐

22、程序*;-功能:播放存放好的音乐。do_song proc near;-push bppush sipush bxpush dipush axdraw 247,42,251,46,0bh ;调用矩形绘制宏,绘制灯1亮lea bp,mus_time ;载入延时数据首地址lea si,mus_freq ;载入频率数据首地址freq:mov ah,01h ;读键盘缓冲区字符int 16hcmp ah,1ch ;是否是enter键,1ch为enter键的扫描码jnz continue ;不是继续jmp play_end ;是结自动播放continue:mov ah,0ch ;清除键盘缓冲区字符mov

23、al,06h ;dos6号调用,当dl中为ASCII码时,输出dl对应的字符,这里是输出Imov dl,I ;自行修改显示字符int 21h ;可自行打开mov di,si ;把频率数据放入dicmp di,-1 ;判断结束否je play_endmov bx,bp ;bx存入节拍值call play_auto ;发声add si,2add bp,2 ;下一频率jmp freqplay_end:pop axpop dipop bxpop sipop bpretdo_song endp;*在屏幕上显示字符*;-功能:显示字符和说明。show_text proc near;-初始化光标的位置-lea di,text ;载入字符串首地址mov dh,di ;2号功能,赋行值inc di ;取得列mov dl,di ;2号功能,赋列值mov start_col,dl ;保存开始列mov ah,2 ;2号功能:设置光标位置:dh=行号,dl=列号,bh=页号mov bh,0 ;0页int 10h;-取颜色值-inc di

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922