![汇编梦幻钢琴程序设计报告.(精编版)_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/3370e43f-2eaf-46f9-b16e-12f92b43b4c1/3370e43f-2eaf-46f9-b16e-12f92b43b4c11.gif)
![汇编梦幻钢琴程序设计报告.(精编版)_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/3370e43f-2eaf-46f9-b16e-12f92b43b4c1/3370e43f-2eaf-46f9-b16e-12f92b43b4c12.gif)
![汇编梦幻钢琴程序设计报告.(精编版)_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-12/2/3370e43f-2eaf-46f9-b16e-12f92b43b4c1/3370e43f-2eaf-46f9-b16e-12f92b43b4c13.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言程序设计综合程序设计实验报告题目:梦幻钢琴一、项目简介利用汇编语言设计一个模拟钢琴演奏程序。在显示器上显示出钢琴的键盘, 以计算机键盘的相应键模拟钢琴键盘进行乐曲的演奏。在pc机键盘上按键,屏幕上对应的钢琴键出现跳动,并发出相应音符的声音,例如:按字母“a”,发 c大调do按字母“s”,发 c大调re按字母“d”,发 c大调me按字母“f”,发 c大调fa按下 f1 、f2 、f3 、f4 、f5 会依次播放程序中所添加的歌曲;如果想要使该歌曲加速播放, 可以同时按住“shift”键和“ +”键;若要减速播放, 则按“ shift” 键和“- ”键。在弹奏钢琴曲时, 直接按动“a”、“
2、s”、“d”、“f”、“g”、“ h”、“ j”键表示的是中音区, 高音区用右 shift键加以上键弹奏, 低音区用左 shift键加以上键弹奏,也可以通过c、d 转换是弹奏变为 c 大调或 d 大调。二、小组成员具体分工1、界面设计 - 刘静(1) 、屏幕设置 mov ah,00h mov al,0dh int 10hmov ah,0bh;11号功能,设置背景颜色mov bl,00h int 10h(2) 、钢琴绘制,绘制键盘时的坐标的确定:白色琴键坐标:st_lx dw 50,61,72,83,94,105,116 ;起点横坐标st_mx dw 127,138,149,160,171,18
3、2,193st_hx dw 204,215,226,237,248,259,270st_ydw 50;起点纵坐标ed_lx dw 60,71,82,93,104,115,126;终点纵坐标ed_mx dw 137,148,159,170,181,192,203ed_hx dw 214,225,236,247,258,269,280ed_ydw 90;终点纵坐标黑色琴键坐标bt_xdw 57,68,90,101,112;起点横坐标dw 134,145,167,178,189dw 211,222,244,254,265bt_ydw 50;起点纵坐标bd_x dw 64,75,97,108,119;
4、终点横坐标dw 141,152,174,185,196dw 218,229,251,262,273bd_ydw 70;终点纵坐标宏定义绘制填充矩形:draw macro start_x,start_y,end_x,end_y,color宏定义绘制不填充矩形:drawsqre macro start_x,start_y,end_x,end_y,color最后在主程序 init proc near调用以上定义的宏来绘制琴键。(3) 、琴键绘制 piano_drawproc near(4) 、屏幕显示字符 show_char proc n、esahrow_text proc near2、功能调试 -
5、 刘铸辉通过调用子程序来实现各个功能:(1) 、手动演奏 gen_hand proc near(2) 、自动播放发声程序gen_auto proc near(3) 、延时程序 waitf proc near(4) 、自动播放歌曲scan_song proc n、eaprlay_song proc near(5) 、c/d 调及对应的低、中、高频率分别载入load_audio proc near(6) 、c/d 调判断及其状态在屏幕上的显示scan_tune proc near;三、需求分析与设计1、钢琴绘制。这部分主要实现画钢琴键盘键身的功能。它是由二十一个白 色的长方块和十五个黑色的长方块构
6、成的,要在屏幕上画出有立体效果的长方形白色和黑色键盘,我们需要用bios调用编织线使程序。显示适配器都自带显示服务的 bios,利用它所提供的bios调用来编写程序,对于我们编程应用者来说是透明的,我们只需要调用显示驱动程序int10h。钢琴主要是由矩形、直线等规则几何形状构成,通过画点、画线等基本程序完成钢琴的绘制。对于绘制钢琴键盘,为使其有立体感,还需要先在excel表中绘制一个简单的钢琴键盘,准确对应其各个边界的坐标。钢琴键盘的动态显示则是同步于键盘的按键有按下和弹起的动画。这部分功能需要也可以用绘制钢琴的方法来实现这个效果。绘制琴键: piano_drawproc near白色琴键:
7、lea si,st_lx ; 取白色琴键起始点有效地址lea di,ed_lx ;取白色琴键结束点有效地址mov cx,21 ;白色琴键数目 21next_draw:draw si,st_y,di,ed_y,0fh;调用宏定义画白键draw si,90,di,93,07h ;阴影add si,2;下一个键add di,2loop next_draw ;cx-1不为 0 继续画黑色琴键: lea si,bt_x; 取黑色琴键起始点的有效地址lea di,bd_x; 取黑色琴键结束点的有效地址mov cx,15; 黑 色 琴 键 15 个next_block:draw si,bt_y,di,bd_
8、y,00h;调用宏定义画黑色琴键add si,2;下一个键add di,2loop next_block;cx-1不为 0 继续画黑键2、发声程序。该发生程序是在修改beep发声程序的基础上, 以实现为 8088/86编写一个任意频率和任意持续时间的通用发声程序。该程序包括以下三个步骤:( 1)在 8253/54中的 43 端口送一个控制字0b6h(10110110b),该控制字对定时器 2 进行初始化,使得定时器2 准备接受计数初值。(2) )在 8253/54 中的 42h端口装入一个16 位计数值,已建立将要产生的声音频率。(3) )把输出端口 61h 的 0、1 两位置 1,发出声音。
9、具体实现如下:gen_hand proc nea手r动;in :di push ax push bx push cx push dx演奏发声程序push di; 定时器初始化程序mov al,0b6h ;定时器初始化,;选择计数器 2,工作在方式 3 out 43h,al;out 43h,al ;向定时器送初值mov dx,12h ;1.1931mhz/给定的频率 =12348h/给定频率 =计数初值mov ax,348ch ;12348h存入 dx:ax中,商存 ax,余数存 dxdiv di;di为给定的频率out 42h,al;定时器送处值in al,61h ;开扬声器mov al,ah
10、;给定时器 2 写入 ax中存放的计数初值out 42h,alin al,61hmovah,al;把 8255 输出端的 61h的 0、1 位置 1,并把端口状态写入ahor al,3 out 61h,alwait1:call waitf ;调用延时程序in al,60h;读取键盘扫描码,按下和放开都有相应的扫描码,放开码=按下码+80h>80htest al,80h ;查询键是否放开jz wait1;未放开继续查询, al不等于 80h则继续延时mov al,ah ;恢复 8255 端口 61h的状态(即按键放开) ,关扬声器out 61h,al;通过监控端口 61h 的 pb4固定不
11、变的触发时间来产生延迟时间pop di;恢复寄存器状态pop dx pop cx pop bx pop axret gen_hand endp3、延时程序。 80x86 的各种处理器采取了666mhz的工作频率, loop 指令的执行时间在这些处理器上也不相同。为了建立一个与处理器无关的延时,ibm采用了一种利用硬件产生时间延时的方法,即通过监控端口61h和 pb4,使 pb4每15.08 微秒触发一次,一产生一个固定不变的时间基准。在ibm pc at bios 的waitf子程序,就是一个产生nx15.08 微秒时间演示的程序。调用waitf子程序时, cx寄存器必须装入15.08 微秒的
12、倍数 n。利用 waitf子程序能获得任意的时间延时,而不必在考虑cpu的型号和工作频率。具体实现如下:waitf proc near; 延时程序push axmov cx,delay_time waitf1:in al,61hand al,10h ;检查 pb4口cmp al,ah;判断 al变化否je waitf1;没有变化则等待al 变化mov ah,al ;保存 pb4的新状态 (al 中)loop waitf1;cx-1不为 0 就回到 waitf1 pop ax;ax出栈ret waitf endp4、音符的演奏。在pc系列机上, 8254 的三个计数器各有其作用,计数器0用于维护
13、系统时钟; 计数器 1 用于周期性的向dma发送数据请求信号, 供存储器刷新使用; 计数器 2 接到扬声器用来产生声音。 各计数器的输入时钟脉冲频率均为 1.19318mhz。通过设置计数值可以产生各种频率的声音。与此同时,许多输入输出操作都是由8255a 可编程外设接口来控制的。利用cpu支持的外围电路8254 与 8255,通过汇编程序改变8255 的 pb0, pb1口,接通扬声器,使得计算机能够发出一定频率的声音, 同时通过 8254 的与 8255 连接的 2 号计数器控制指定频率,从而达到控制扬声器的音调的效果。具体实现如下:gen_hand proc nea手r动;in : di
14、push ax push bx push cx push dx push di; 定时器初始化程序演奏发声程序mov al,0b6h ;定时器初始化,;选择计数器 2,工作在方式 3 out 43h,al;out 43h,al ;向定时器送初值mov dx,12h ;1.1931mhz/给定的频率 =12348h/给定频率 =计数初值mov ax,348ch ;12348h存入 dx:ax中,商存 ax,余数存 dxdiv di;di为给定的频率out 42h,al;定时器送处值in al,61h ;开扬声器mov al,ah;给定时器 2 写入 ax中存放的计数初值out 42h,al in
15、 al,61hmovah,al;把 8255 输出端的 61h的 0、1 位置 1,并把端口状态写入ahor al,3out 61h,al wait1:call waitf ;调用延时程序inal,60h;读取键盘扫描码,按下和放开都有相应的扫描码,放开码=按下码+80h>80htest al,80h ;查询键是否放开jz wait1;未放开继续查询, al不等于 80h则继续延时mov al,ah ;恢复 8255 端口 61h的状态(即按键放开) ,关扬声器out61h,al; 通过监控端口 61h的 pb4固定不变的触发时间来产生延迟时间pop di;恢复寄存器状态pop dx p
16、op cx pop bx pop ax retgen_hand endp5、自动播放歌曲。(1) 、为所要播放的乐曲的定义一个频率表和节拍表。以所播放的第二首歌曲两只老虎为例:频率表:mus_freq2 dw 262,294,330,262,262,294,330,262 ;两只老虎dw 330,349,392,330,349,392,392,440dw 392,349,330,262,392,440,392,349dw 330,262,294,196,262,294,196,262dw 262,294,330,262,262,294,330,262dw 330,349,392,330,349
17、,392,392,440dw 392,349,330,262,392,440,392,349dw 330,262,294,196,262,294,196,262dw 0节拍表:mus_time2 dw 25,25,25,25,25,25,25,25,25,25dw 50,25,25,50,12,12,12,12,25,25dw 12,12,12,12,25,25,25,25,50,25,25,50dw 25,25,25,25,25,25,25,25,25,25dw 50,25,25,50,12,12,12,12,25,25dw 12,12,12,12,25,25,25,25,50,25,25,
18、50(2) 、分表将两个表的偏移地址放入si和bp中lea bp,mus_time2lea si,mus_freq2(3) 、从表中读出的音符频率放入di 中,取出音符的持续时间(10s的倍数)放入 bx中。mov di,simov bx,bp(4) )、最后调用 gen_aut子o程序发出声音。6、c、d调的转换。从 c调向d调进行转换,先判断当前音符为哪种调,若为c 调,则进行跳转,跳转的过程中开 d灯,关c灯;反之同原理。调用的是 scan_tune 子程序。scan_tune proc near;c/d 调判断及其状态在屏幕上的显示;in:dl键盘扫描码;out:tunecmp dl,
19、2eh ;判断是 c否jnz next_d ;不是则判断是 d否mov tune,'c'draw 55,38,60,41,0eh;关d灯draw 65,38,70,41,0ah ;开 c 灯 jmp tune_end;结束next_d:cmp dl,20h;判断d否jnz tune_end mov tune,'d'draw 55,38,60,41,0ah ;开d灯draw 65,38,70,41,0eh;关c灯tune_end:retscan_tune endp四、代码及分析; 宏定义draw macro start_x,start_y,end_x,end_y,
20、color local draw_next;local:避免宏重复调用时,标号的重复; 功能:画填充的矩形; 使用条件: start_x < end_x ,start_y < end_y push axpush bx push cx push dxmov ah,0ch;写像素点, 12 号功能,写图形像素mov al,color mov bh,0mov cx,start_x;设置颜色,像素值选用页号 0列起始点mov dx,start_y;行起始点draw_next:int 10h;画点inc cxcmp cx,end_x;开始画横线比较行是否画完jne draw_next;画另一
21、行mov cx, start_x;另一行的起始点inc dx;下一行cmp dx,end_y;比较列是否画完jne draw_next;未完继续画pop dx;出栈pop cx pop bx pop ax endmdrawsqre macro start_x,start_y,end_x,end_y,color local row_up,row_down,rank_left,rank_right; 功能:画不填充的矩形push ax push bx push cx push dx push simov ah,0chmov al,color mov bh,0号 0mov cx,start_xmov
22、 dx,start_y;写像素点设置颜色选用页列起始点行起始点row_up:;int 10h;inc cx;画横线cmp cx,end_x ;比较行是否画完jne row_up;画另一边画上边画点rank_right:;画右边int 10h;画点inc dx;画横线cmp dx,end_y;比较行是否画完jne rank_right;画另一边mov cx, start_x;下边起始点mov si,end_x inc sirow_down:;画下边int 10h;画点inc cx;画横线cmp cx,si;比较行是否画完jne row_down; 画另一边mov dx,start_y;右边起始点
23、mov cx,start_xrank_left:;画右边int 10h;画点inc dx;画横线cmp dx, end_y;比较行是否画完jne rank_left;画另一边pop si pop dx pop cx pop bx pop ax endm; 数据段data segment;定义在屏幕绘制字start_col db ?;存储起始行text db 13;起始行db 4;起始列db 0ahdb'*thisispiano*',0ffh,'* welcome!haveagoodtime!*',0ffh;字体颜色,设置颜色db'dreampiano
24、39;,0ffh,'liuzhuhuiandliujing 2013-11-22',0ffh,0ffh;显示字db 0ffh,'1 a.s.d.f.g.h.j to make music' db 0ffh,'2 f2f5 to play a muisc'db 0ffh,'3 shift and +/- to up/down the music' db 0ffh,'4 l/r shift to hight/low.'db10dup(4dup(0dbh),4dup(20h),0ffh;颜色交叉矩形;db 10 dup(
25、4 dup(20h),4 dup(0dbh),0ffh;db 10 dup(2 dup(0dbh),2 dup(20h),0ffh;db 10 dup(2 dup(20h),2 dup(0dbh),0ffh;db 10 dup(2 dup(0dbh),2 dup(20h),0ffh; db 10 dup(2 dup(20h),2 dup(0dbh),0ffh db 00;白色琴键坐标st_lx dw 50,61,72,83,94,105,116 ;起点横坐标st_mx dw 127,138,149,160,171,182,193st_hx dw 204,215,226,237,248,259,
26、270st_ydw 50;起点纵坐标ed_lx dw 60,71,82,93,104,115,126;终点纵坐标ed_mx dw 137,148,159,170,181,192,203ed_hx dw 214,225,236,247,258,269,280ed_ydw 90;终点纵坐标;黑色琴键坐标bt_xdw 57,68,90,101,112;起点横坐标dw 134,145,167,178,189dw 211,222,244,254,265bt_ydw 50;起点纵坐标bd_x dw 64,75,97,108,119;终点横坐标dw 141,152,174,185,196dw 218,229
27、,251,262,273bd_ydw 70;终点纵坐标; 音乐频率值lowd dw 131lowdd dw 221,248,278,294,330,371,416 ;低音middw 262midd dw 441,495,556,589,661,742,833 ;中音hgh dw 523hghd dw 882,990,1112,1178,1322,1484,1665 ;高音keyflag db 1;标记低( 0)、中( 1)、高( 2 )音键 keynum dw 1;存储 17, 按键编号缓存,提取对应的按键位置delay_time dw 7000 ;延时缓存,用于播放时存如bx计数song d
28、w 100 ;保存所选的自动演奏的曲目tune dw 1;标记 c 调或 d 调, 按键状态缓存audio dw 1;标记低音 1 ,中音2 ,高音3; 自动演奏的歌曲频率和延时mus_freq1 dw 196,220dw 262,262,262,262,262,220,196dw 262,262,262,262,294,262,220,262dw 294,294,294,294,294,262,220dw 294,294,294,294,330,294,330,392dw 440,440,392,440,392,330dw 294,294,330,294,262,220,196,220dw
29、262,262,262,262,262,220dw 262,196,220dw 440,440,392,440,524,440dw 392,330,294,262,220,196,220dw 262,262,262,262,294,262dw 262,330,392dw 440,440,440,440,524,440dw 392,392,392,440,392,330,294dw 262,262,262,262,294dw 330,330,294dw 262,262,262,262,524,440dw 392,392,392,440,392,330,392dw 440,524,524,440,
30、392dw 392,330,392dw 440,440,440,440,524,440dw 392,392,392,440,392,330,294dw 262,262,262,262,392dw 330,330,294dw 262,262,262,262,294,330dw 392,392,330,392,330,392dw 440dw 9,9,196,660,294,294,262dw 262,-1mus_time1 dw 40,40dw 40,20,40,40,80,40,40dw 40,20,40,20,20,80,40,40dw 40,20,40,40,80,40,40dw 40,20
31、,40,20,20,80,40,40dw 40,80,40,80,40,40dw 40,20,20,40,40,80,40,40dw 40,20,40,40,80,80dw 10,80,80dw 40,80,40,80,40,40dw 40,40,40,40,80,40,40dw 40,80,40,80,40,20dw 20,40,40dw 40,80,40,80,40,40dw 40,80,20,20,80,40,40dw 40,80,40,80,80dw 24,40,40dw 40,80,40,80,40,40dw 40,80,20,20,80,40,40dw 80,40,80,40,20
32、dw 20,40,40dw 40,80,40,80,40,40dw 40,80,20,20,80,40,40dw 40,80,40,80,80dw 20,40,40dw 40,80,40,80,40,40dw 40,80,40,80,40,40dw 30dw 80,40,40,40,40,40,40dw 40mus_freq2 dw 262,294,330,262,262,294,330,262 ; 两只老虎dw 330,349,392,330,349,392,392,440dw 392,349,330,262,392,440,392,349dw 330,262,294,196,262,294
33、,196,262dw 262,294,330,262,262,294,330,262dw 330,349,392,330,349,392,392,440dw 392,349,330,262,392,440,392,349dw 330,262,294,196,262,294,196,262dw 0mus_time2 dw 25,25,25,25,25,25,25,25,25,25dw 50,25,25,50,12,12,12,12,25,25dw 12,12,12,12,25,25,25,25,50,25,25,50dw 25,25,25,25,25,25,25,25,25,25dw 50,25
34、,25,50,12,12,12,12,25,25dw 12,12,12,12,25,25,25,25,50,25,25,50mus_freq3 dw 262,262,294,330,330,349,392,440,392,330dw 392,349,330,294,349,330,294,262dw 262,262,294,330,330,349,392,440,392,330dw 392,349,330,294,330,294,262,196dw 392,349,330,294,196,196,349,330,294,262dw 392,349,330,294,196,196,349,330
35、,294,262dw 262,262,294,330,330,349,392,440,392,330dw 392,349,330,294,330,294,262dw 0mus_time3 dw 3 dup(25,2 dup(12),50 dw 2 dup(25,2 dup(12),50)dw 3 dup(25,2 dup(12),50dw 2 dup(25,2 dup(12),2 dup (50) dw 3 dup(25,2 dup(12),50dw 3 dup(25,2 dup(12),50 dw 3 dup(25,2 dup(12),50 dw 2 dup(25,2 dup(12),50m
36、us_freq4 dw 262,262,294,330,330,294,262,262,220,196dw 262,294,330,294,262,294dw 262,294,330,330,294,294,262,220,220,294,262,262,220,196dw 196,220,220,262,262,294,294,262,220dw 294,330,294,262,262,294,262,220,196,220dw 196,220,262,294,330,392,294,330,262,294,262,220dw 220,294,247,220,196,196dw 4 dup(
37、392),330,392,440,440,392,330dw 5 dup(440),392,392,330,294dw 440,392,440,392,330,294,330,294,262,220dw 4 dup(294),262,220,196dw 2 dup(440,392),2 dup(330,294),262,220dw 3 dup(294),262,220,392dw 0mus_time4 dw 3 dup(20,10,10),50 dw 20,10,20,10,10,80dw 20,10,20,10,10,3 dup(20,10),20,20,80dw 20,10,10,20,2
38、0,20,10,10,40dw 20,10,20,20,10,5,5,10,10,40dw 20,10,2 dup(20,10,10),10,5,5,20dw 20,20,20,10,10,80dw 10,20,10,20,10,10,40,10,10,20dw 8 dup(10),80dw 20,10,10,20,20,4 dup(10),40dw 15,5,10,10,20,20,80dw 20,10,10,20,20,4 dup(10),40dw 40,20,20,40,40,100mus_freq5 dw 330,392,440,330,392,294dw 330,392,440,52
39、3,440,392,220,262,330,294dw 294,330,392,294,330,294,220,220dw 220,262,294,330,294,247,220,262,196dw 294,330,294,247,220,196,262dw523,523,440,523,440,523,440,392dw392,330,440,392,262,294,262,292,330dw330,330,294,330dw523,523,494,440dw 330,330,294,330,523,494,440,330,392dw 0mus_time5 dw 2 dup(12,12,75
40、),3 dup(12),25,12,25,6,6,12,75 ;#1,2 dw 12,12,75,4 dup(12),75,12,12,37,5 dup(12),75dw 37,12,12,12,12,12,50dw 12,12,12,50,12,12,12,75dw 12,12,37,12,25,6,6,12,50,12,12,12,50,12,12,12,75dw 12,12,37,12,12,12,12,12,75 data ends; 代码段code segmentassume ds:data,cs:code main proc far; 主程序call init;调用初始化程序new
41、_scan:call scan_key ;扫描所按下的键cmp song,100;判断是否按下了自动播放的歌曲键jehand_play ;若不是,手动播放call play_song ;若是,则播放音乐jmp new_scan;演奏结束,重新扫描有无键按下hand_play:cmp keynum,100;判断是否手动演奏jznew_scan ;若不是,重新扫描有无键按下;若是,进行按键处理push bx;若为手动,则进行键盘清理mov bx,keynumcall key_down ;调用显示按下程序pop bxcall load_audio ;判断高低音、 c/d 调,并装入对应频率段地址到b
42、x中push simov si,keynum mov di,bx+sicall gen_hand ;发声pop si push bxmov bx,keynum;在屏幕上显示弹起状态call key_up pop bxjmp new_scan ;重新扫描有无键按下,直到按下esc键main endpgen_hand proc ne手ar动; 演奏发声程序;in : dipush ax push bx push cx push dx push di; 定时器初始化程序mov al,0b6h ;定时器初始化,;选择计数器 2,工作在方式 3 out 43h,al;out 43h,al ;向定时器送初
43、值mov dx,12h ;1.1931mhz/给定的频率 =12348h/给定频率 =计数初值mov ax,348ch ;12348h存入 dx:ax中,商存 ax,余数存 dxdiv di;di为给定的频率out 42h,al;定时器送处值in al,61h ;开扬声器mov al,ah;给定时器 2 写入 ax中存放的计数初值out 42h,alin al,61hmov ah,al;把 8255 输出端的 61h的 0、1 位置 1,并把端口状态写入ahor al,3 out 61h,alwait1:call waitf ;调用延时程序inal,60h;读取键盘扫描码,按下和放开都有相应的
44、扫描码,放开码=按下码+80h>80htest al,80h ;查询键是否放开jz wait1;未放开继续查询, al不等于 80h则继续延时mov al,ah ;恢复 8255 端口 61h的状态(即按键放开) ,关扬声器out61h,al; 通过监控端口 61h的 pb4固定不变的触发时间来产生延迟时间pop di;恢复寄存器状态pop dx pop cx pop bx pop axretgen_hand endpgen_auto proc near; 自动播放发声程序push ax push bx push cx push dx push di;定时器初始化程序mov al,0b6
45、h;定时器的初始化,选择计数器2,工作在方式 3 out 43h,almov dx,12h ;1.1931mhz/给定的频率 =12348h/给定频率 =计数初值mov ax,348ch;12348h存入 dx:ax中,商存 ax,余数存 dxdiv di;di为给定的频率out 42h,al;定时器送初值in al,61h;开扬声器mov al,ah;给定时器 2 写入 ax中存放的计数初值out 42h,al;定时器送初值in al,61h;开扬声器mov ah,al;把 8255 输出端的 61h的 0、1 位置 1,并把端口状态写入ahor al,3 out 61h,alwait2:c
46、all waitf;调用延时程序dec bx;bx存放节拍值jnz wait2;判断是否播放完毕mov al,ah;完毕则关闭扬声器out 61h,alpop di;恢复寄存器状态pop dx pop cx pop bx pop ax retgen_auto endpwaitf proc near; 延时程序push axmov cx,delay_time waitf1:in al,61hand al,10h ;检查 pb4口cmp al,ah;判断 al变化否je waitf1;没有变化则等待al 变化mov ah,al ;保存 pb4的新状态 (al 中)loop waitf1;cx-1不
47、为 0 就回到 waitf1 pop ax;ax出栈ret waitf endppiano_drawproc near; 绘制琴键lea si,st_lx ;取白色琴键起始点有效地址 lea di,ed_lx ;取白色琴键结束点有效地址mov cx,21 ;白色琴键数目 21next_draw:draw si,st_y,di,ed_y,0fh;调用宏定义画白键draw si,90,di,93,07h ;阴影add si,2;下一个键add di,2loop next_draw ;cx-1 不为 0 继续画lea si,bt_x; 取黑色琴键起始点的有效地址lea di,bd_x; 取黑色琴键结
48、束点的有效地址mov cx,15; 黑色琴键 15 个next_block:draw si,bt_y,di,bd_y,00h;调用宏定义画黑色琴键add si,2;下一个键add di,2loop next_block;cx-1不为 0 继续画黑键retpiano_draw endpkey_down proc near; 键按下时,在屏幕上显示push si push dicall load;载入所按下键在屏幕上的位置draw si+bx,90,di+bx,92,0fh;调用矩形绘制宏, bx 为案件标号缓存值draw si+bx,92,di+bx,94,07h pop dipop si re
49、tkey_down endpkey_up proc near; 键弹起时,恢复正常状态push si push dicall load ;载入所弹起键在屏幕上的位置draw si+bx,90,di+bx,93,07h;恢复阴影draw si+bx,93,di+bx,94,05h;恢复背景色pop dipop si retkey_up endpload proc near; 载入键在屏幕上的位置cmp keyflag,00h判; 断是否是低音键 jnz load_hgh; 继续判断lea si,st_lx; 载入低音键起始坐标首地址lea di,ed_lx; 载入低音键结束坐标首地址jmp lo
50、ad_end; 载入结束load_hgh:cmp keyflag,02h;判断是否是高音键jnz load_mid;继续判断lea si,st_hx ;载入高音键起始坐标首地址lea di,ed_hx;载入高音键结束坐标首地址jmp load_end;结束load_mid:lea si,st_mx;载入中音键起始坐标首地址lea di,ed_mx;载入中音键结束坐标首地址load_end:retload endpscan_key proc near; 检查按键状态,并存入对应的变量和寄存器mov si,100 mov di,100mov keynum,100 ;赋初值mov ah,0;读键盘i
51、nt 16hmov dl,ahcall scan_song; 判断是否是自动播放键(大键盘数字键15) call scan_tune ;判断是否是 c/d 调选择键call freq_change ; 判断是否按下频率改变键: (+/-符号)cmp ah,01h ;是否是结束键jne flag_scan;若不是继续检测call exit ;若是则退出flag_scan:mov ah,02h;读键盘状态字节int 16hmov dh,al ;判断是否是右 shift键and dh,02h cmp dh,02hje slow ;是则进行低音处理mov dh,al ;不是判断是否是左shift键an
52、d dh,01h cmp dh,01hje shgh ;是则进行高音处理jmp smid;都不是进行中音处理slow:;低音处理mov audio,1 mov keyflag,0jmp key_1;跳转到音键处理shgh:;高音处理mov audio,3 mov keyflag,2jmp key_1;跳转到音键处理smid :;中音处理mov audio,2mov keyflag,1 key_1:cmp dl,1eh ;是否是 ajne key_2;继续判断mov keynum,0 ;不是则保存标志jmp scan_end ;键扫描结束key_2:cmp dl,1fh;是否是 s jne ke
53、y_3mov keynum,2 jmp scan_endkey_3:cmp dl,20h ;是否是 d jne key_4mov keynum,4 jmp scan_endkey_4:cmp dl,21h ;是否是 f jne key_5mov keynum,6 jmp scan_endkey_5:cmp dl,22h;是否是 g jne key_6mov keynum,8 jmp scan_endkey_6:cmp dl,23h ;是否是 h jne key_7mov keynum,10 jmp scan_endkey_7:cmp dl,24h ;是否是 j jne scan_endmov keynum,12 scan_end:ret scan_key endpscan_song proc near; 判断是否是自动播放键(键15),并保存标志变量 (song);in: ah键扫描码push
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生产线的设备检修与生产效率提升
- 现代办公环境下的会议组织策略
- 环保理念在艺术空间设计中的应用
- 国庆节爱国实践活动方案
- 9 古诗三首《秋夜将晓出篱门迎凉有感》(说课稿)-2024-2025学年统编版语文五年级下册
- 2024年五年级语文下册 第六单元 15 自相矛盾说课稿 新人教版
- 6 我们神圣的国土第一课时 (说课稿)- 2024-2025学年统编版道德与法治五年级上册001
- Unit 3 After School Activities Let's Check(说课稿)-2023-2024学年人教新起点版英语三年级下册
- 2024-2025学年高中物理 第六章 万有引力与航天 2 太阳与行星间的引力(1)说课稿 新人教版必修2
- Unit5 Clothes (第六课时)(说课稿)-2024-2025学年人教新起点版英语三年级上册001
- 2025福建新华发行(集团)限责任公司校园招聘30人高频重点提升(共500题)附带答案详解
- 油气长输管道检查标准清单
- 山东铁投集团招聘笔试冲刺题2025
- 图像叙事的跨学科视野-洞察分析
- 急性缺血性卒中再灌注治疗指南2024解读
- 暑假假期安全教育(课件)-小学生主题班会
- 2025年中考英语总复习:阅读理解练习题30篇(含答案解析)
- 陕西省英语中考试卷与参考答案(2024年)
- 2024年潍坊护理职业学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 西藏自治区建筑与市政工程竣工验收报告
- 编外人员录用审批表
评论
0/150
提交评论