汇编梦幻钢琴程序设计报告.

上传人:ya****h 文档编号:46115896 上传时间:2021-12-10 格式:DOC 页数:28 大小:179KB
返回 下载 相关 举报
汇编梦幻钢琴程序设计报告._第1页
第1页 / 共28页
汇编梦幻钢琴程序设计报告._第2页
第2页 / 共28页
汇编梦幻钢琴程序设计报告._第3页
第3页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
汇编语言程序设计 综合程序设计实验报告 题 目: 梦幻钢琴 一、项目简介 利用汇编语言设计一个模拟钢琴演奏程序。在显示器上显示出钢琴的键盘, 以计算机键盘的相应键模拟钢琴键盘进行乐曲的演奏。在 PC 机键盘上按键,屏 幕上对应的钢琴键出现跳动,并发出相应音符的声音,例如: 按字母 “A” 发 C 大 do 按字母 “S”, 发 C 大 re 按字母 “D”, 发 C 大调 me 按字母 厂, 发 C 大调 fa 按下 fl、 f2、 f3、f4、f5 会依次播放程序中所添加的歌曲;如果想要使该 歌曲加速播放,可以同时按住“shift ”键和“+”键;若要减速播放,则按“shift 键和“-”键。 在弹奏钢琴曲时, 直接按动“A”、“S”、“D”、“F”、“G、“H、“J” 键表示的是中音区,高音区用右 shift 键加以上键弹奏,低音区用左 shift 键加 以上键弹奏,也可以通过 C、D 转换是弹奏变为 C 大调或 D 大调。 二、小组成员具体分工 1、 界面设计-刘静 (1) 、屏幕设置 MOV AH,00H MOV AL,0DH INT 10H MOV 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,182,193 ST_HX DW 204,215,226,237,248,259,270 ST_Y DW 50 ; 起点纵坐标 ED_LX DW 60,71,82,93,104,115,126 ; 终点纵坐标 ED_MX DW 137,148,159,170,181,192,203 ED_HX DW 214,225,236,247,258,269,280 ED_Y DW 90 ; 终点纵坐标 黑色琴键坐标 BT_X DW 57,68,90,101,112 ; 起点横坐标 DW 134,145,167,178,189 DW 211,222,244,254,265 BT_Y DW 50 ; 起点纵坐标 BD_X DW 64,75,97,108,119 ; 终点横坐标 DW 141,152,174,185,196 DW 218,229,251,262,273 BD_Y DW 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 NEAF 调用以上定义的宏来绘制琴键。 (3) 、琴键绘制 PIANO_DRAW PROC NEAR (4) 、屏幕显示字符 SHOW_CHAR PROC NEAROW_TEXT PROC NEAR 2、 功能调试-刘铸辉 通过调用子程序来实现各个功能: (1) 、手动演奏 GEN_HAND PROC NEAR (2) 、自动播放发声程序 GEN_AUTO PROC NEAR (3) 、延时程序 WAITF PROC NEAR (4) 、自动播放歌曲 SCAN_SONG PROC NEPILAY_SONG PROC NEAR (5) 、C/D 调及对应的低、中高频率分别载入 LOAD_AUDIO PROC NEAR (6)、C/D 调判断及其状态在屏幕上的显示 SCAN_TUNE PROC NEAR; 三、需求分析与设计 1、钢琴绘制。这部分主要实现画钢琴键盘键身的功能。它是由二一个白 色的长方块和十五个黑色的长方块构成的, 要在屏幕上画出有立体效果的长方形 白色和黑色键盘,我们需要用 BIOS 调用编织线使程序。显示适配器都自带显示 服务的 BIOS 利用它所提供的 BIOS 调用来编写程序,对于我们编程应用者来说 是透明的,我们只需要调用显示驱动程序 INT 10 耳 钢琴主要是由矩形、直 线等规则几何形状构成,通过画点、画线等基本程序完成钢琴的绘制。 对于绘制钢琴键盘,为使其有立体感,还需要先在 excel 表中绘制一个简 单的钢琴键盘,准确对应其各个边界的坐标。 钢琴键盘的动态显示则是同步于键盘的按键有按下和弹起的动画。这部分 功能需要也可以用绘制钢琴的方法来实现这个效果。 绘制琴键:PIANO_DRAW PROC NEAR 白色琴键:LEA SI,ST_LX ;取白色琴键起始点有效地址 LEA DI,ED_LX ; 取白色琴键结束点有效地址 MOV CX,21 ; 白色琴键数目 21 NEXT_DRAW: DRAW SI,ST_Y,DI,ED_Y,0FH ; 调用宏定义画白键 DRAW SI,90,DI,93,07H ; 阴影 ADD SI,2; 下一个键 ADD DI,2 LOOP 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_Y,00H; 调用宏定义画黑色琴键 ADD SI,2; 下一个键 ADD DI,2 LOOP 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,发出声音。 具体实现如下: GEN_HAND PROC NEAR 动演奏发声程序 ;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 余数存 DX DIV 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,并把端口状态写入 AH OR AL,3 OUT 61H,AL WAIT1: CALL WAITF ; 调用延时程序 IN AL,60H ; 读取键盘扫描码,按下和放开都有相应的扫描码,放 开码二按下码+80h80h TEST AL,80H ; 查询键是否放开 JZ WAIT1 ; 未放开继续查询,AL 不等于 80H 则继续延时 MOV AL,AH ; 恢复 8255 端口 61H 的状态(即按键放开),关扬声器 OUT 61H,AL; 通过监控端口 61H 的 PB4 固定不变的触发时间来产生延 迟时间 POP DI ; 恢复寄存器状态 POP DX POP CX POP BX POP AX RET GEN_HAND ENDP 3、延时程序。80 x86 的各种处理器采取了 666MHZ 勺工作频率,loop 指令的 执行时间在这些处理器上也不相同。为了建立一个与处理器无关的延时, IBM 采 用了一种利用硬件产生时间延时的方法,即通过监控端口 61H 和 PB4,使 PB4 每 15.08微秒触发一次,一产生一个固定不变的时间基准。在 IBM PC AT BIOS 的 WAITF 子程序,就是一个产生 NX15.08 微秒时间演示的程序。调用 WAITF 子程序 时,CX 寄存器必须装入 15.08 微秒的倍数 No 利用 WAITF 子程序能获得任意的时间延时,而不必在考虑 CPU 的型号和工 作频率。 具体实现如下: WAITF PROC NEAR ;延时程序 PUSH AX MOV CX,DELAY_TIME WAITF1: IN AL,61H AND 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 ENDP 4、音符的演奏。在 PC 系列机上,8254 的三个计数器各有其作用,计数器 0 用于维护系统时钟;计数器 1 用于周期性的向 DMAS 送数据请求信号,供存储器 刷新使用;计数器 2 接到扬声器用来产生声音。各计数器的输入时钟脉冲频率均 为 1.19318MHz通过设置计数值可以产生各种频率的声音。与此同时,许多输 入输出操作都是由 8255A可编程外设接口来控制的。利用 CPU 支持的外围电路 8254 与 8255,通过汇编程序改变 8255 的 PBQ PB1 口,接通扬声器,使得计算 机能够发出一定频率的声音,同时通过 8254 的与 8255 连接的 2 号计数器控制指 定频率,从而达到控制扬声器的音调的效果。 具体实现如下: GEN_HAND PROC NEAR 动演奏发声程序 ;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,余数存 DX DIV 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,并把端口状态写入 AH OR AL,3 OUT 61H,AL WAIT1: CALL WAITF ; 调用延时程序 IN AL,60H ;读取键盘扫描码,按下和放开都有相应的扫描码,放开码 =按下码+80h80h TEST AL,80H ; 查询键是否放开 JZ WAIT1 ; 未放开继续查询,AL 不等于 80H 则继续延时 MOV AL,AH ;恢复 8255 端口 61H 的状态(即按键放开),关扬声器 OUT 61H,AL;通过监控端口 61H 的 PB4 固定不变的触发时间来产生延迟时 间 POP DI ; 恢复寄存器状态 POP DX POP CX POP BX POP AX RET GEN_HAND ENDP 5、自动播放歌曲。 (1) 、为所要播放的乐曲的定义一个频率表和节拍表。 以所播放的第二首歌曲两只老虎为例: 频率表: MUS_FREQ2 DW 262,294,330,262,262,294,330,262 ; 两只老虎 DW 330,349,392,330,349,392,392,440 DW 392,349,330,262,392,440,392,349 DW 330,262,294,196,262,294,196,262 DW 262,294,330,262,262,294,330,262 DW 330,349,392,330,349,392,392,440 DW 392,349,330,262,392,440,392,349 DW 330,262,294,196,262,294,196,262 DW 0 节拍表: MUS_TIME2 DW 25,25,25,25,25,25,25,25,25,25 DW 50,25,25,50,12,12,12,12,25,25 DW 12,12,12,12,25,25,25,25,50,25,25,50 DW 25,25,25,25,25,25,25,25,25,25 DW 50,25,25,50,12,12,12,12,25,25 DW 12,12,12,12,25,25,25,25,50,25,25,50 (2) 、分表将两个表的偏移地址放入 SI 和 BP 中 LEA BP,MUS_TIME2 LEA SI,MUS_FREQ2 (3) 、从表中卖出的音符频率放入 DI 中,取出音符的持续时间(10s 的 倍数)放入 BX 中 0 MOV DI,SI MOV BX,BP (4) 、最后调用 GEN_AUT 子程序发出声音。 6 C、D 调的转换。从 C 调向 D 调进行转换,先判断当前音符为哪种调,若为 C调,则进行跳转,跳转的过程中开 D 丁,关 C 灯;反之同原理。调用的是 SCAN_TUNE程序。 SCAN_TUNE PROC NEAR; ;C/D 调判断及其状态在屏幕上的显示 ;IN:DL 键盘扫描码 ;OUT:TUNE CMP DL,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 灯 T TUNE_END: RET SCAN_TUNE ENDP 四、代码及分析 ;宏定义 DRAW MACRO START_X,START_Y,END_X,END_Y,COLOR LOCAL DRAW_NEXT ;local :避免宏重复调用时,标号的重复 ;功能:画填充的矩形 ;使用条件:START X END X ,START Y 80h TEST AL,80H ; 查询键是否放开 JZ WAIT1 ; 未放开继续查询,AL 不等于 80H 则继续延时 MOV AL,AH ; 恢复 8255 端口 61H 的状态(即按键放开),关扬声器 OUT 61H,AL;通过监控端口 61H 的 PB4 固定不变的触发时间来产生延迟时 间 POP DI ; 恢复寄存器状态 POP DX POP CX POP BX POP AX RET GEN_HAND ENDP GEN_AUTO PROC NEAR ;自动播放发声程序 PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI ;定时器初始化程序 MOV AL,0B6H ; 定时器的初始化,选择计数器 2, 工作在方式 3 OUT 43H,AL MOV DX,12H ;1.1931Mhz/ 给定的频率=12348h/给定频率二计数初值 MOV AX,348CH ;12348h 存入 DX:AX 中,商存 AX,余数存 DX DIV 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,并把端口状态写入 AH OR AL,3 OUT 61H,AL WAIT2: CALL WAITF ; 调用延时程序 DEC BX ;BX 存放节拍值 JNZ WAIT2 ; 判断是否播放完毕 MOV AL,AH ; 完毕则关闭扬声器 OUT 61H,AL POP DI ;恢复寄存器状态 POP DX POP CX POP BX POP AX RET GEN_AUTO ENDP WAITF PROC NEAR ;延时程序 PUSH AX MOV CX,DELAY_TIME WAITF1: IN AL,61H AND 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 ENDP PIANO_DRAW PROC NEAR ;绘制琴键 LEA SI,ST_LX ;取白色琴键起始点有效地址 LEA DI,ED_LX ; 取白色琴键结束点有效地址 MOV CX,21 ; 白色琴键数目 21 NEXT_DRAW: DRAW SI,ST_Y,DI,ED_Y,0FH ; 调用宏定义画白键 DRAW SI,90,DI,93,07H ; 阴影 ADD SI,2; 下一个键 ADD DI,2 LOOP 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_Y,00H; 调用宏定义画黑色琴键 ADD Sl,2; 下一个键 ADD Dl,2 LOOP NEXT_BLOCK;CX-1 不为 0 继续画黑键 RET PIANO_DRAW ENDP KEY_DOWN PROC NEAR ;键按下时,在屏幕上显示 PUSH SI PUSH DI CALL LOAD;载入所按下键在屏幕上的位置 DRAW SI+BX,90,DI+BX,92,0FH; 调用矩形绘制宏, 存值 DRAW SI+BX,92,DI+BX,94,07H POP DI POP SI RET KEY_DOWN ENDP KEY_UP PROC NEAR ;键弹起时,恢复正常状态 PUSH SI PUSH DI CALL LOAD ; 载入所弹起键在屏幕上的位置 DRAW SI+BX,90,DI+BX,93,07H ; 恢复阴影 DRAW SI+BX,93,DI+BX,94,05H ; 恢复背景色 POP DI POP SI RET KEY_UP ENDP LOAD PROC NEAR ;载入键在屏幕上的位置 CMP KEYFLAG,00 判断是否是低音键 JNZ LOAD_HGH; 继续判断 LEA SI,ST_LX; 载入低音键起始坐标首地址 LEA DI,ED_LX; 载入低音键结束坐标首地址 JMP LOAD_END;载入结束 LOAD_HGH: CMP KEYFLAG,02H;判断是否是高音键 JNZ LOAD_MID; 继续判断 LEA SI,ST_HX ; 载入高音键起始坐标首地址 LEA DI,ED_HX; 载入高音键结束坐标首地址 BX 为案件标号缓 JMP LOAD_END;结束 LOAD_MID: LEA SI,ST_MX; 载入中音键起始坐标首地址 LEA DI,ED_MX; 载入中音键结束坐标首地址 LOAD_END: RET LOAD ENDP SCAN_KEY PROC NEAR; ;检查按键状态,并存入对应的变量和寄存器 MOV SI,100 MOV DI,100 MOV KEYNUM,100 ;赋初值 MOV AH,0; 读键盘 INT 16H MOV DL,AH CALL 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 16H MOV DH,AL ; 判断是否是右 shift 键 AND DH,02H CMP DH,02H JE SLOW ;是则进行低音处理 MOV DH,AL ; 不是判断是否是左 shift 键 AND DH,01H CMP DH,01H JE SHGH ; 是则进行高音处理 JMP SMID; 都不是进行中音处理 SLOW:; 低音处理 MOV AUDIO,1 MOV KEYFLAG,0 JMP KEY_1 ; 跳转到音键处理 SHGH:;高音处理 MOV AUDIO,3 MOV KEYFLAG,2 JMP KEY_1 ; 跳转到音键处理 SMID :; 中音处理 MOV AUDIO,2 MOV KEYFLAG,1 KEY_1: CMP DL,1EH ;是否是 a JNE KEY_2 ; 继续判断 MOV KEYNUM,0 ;不是则保存标志 JMP SCAN_END ;键扫描结束 KEY_2: CMP DL,1FH; 是否是 s JNE KEY_3 MOV KEYNUM,2 JMP SCAN_END KEY_3: CMP DL,20H ; 是否是 d JNE KEY_4 MOV KEYNUM,4 JMP SCAN_END KEY_4: CMP DL,21H ; 是否是 f JNE KEY_5 MOV KEYNUM,6 JMP SCAN_END KEY_5: CMP DL,22H; 是否是 g JNE KEY_6 MOV KEYNUM,8 JMP SCAN_END KEY_6: CMP DL,23H ; 是否是 h JNE KEY_7 MOV KEYNUM,10 JMP SCAN_END KEY_7: CMP DL,24H ; 是否是 j JNE SCAN_END MOV KEYNUM,12 SCAN_END: RET SCAN_KEY ENDP SCAN_SONG PROC NEAR ;判断是否是自动播放键(键 15),并保存标志变量(song) ;IN: AH 键扫描码 PUSH AX MOV SONG,100 ; 赋初始值 CMP AH,3BH ; 与 1 比较 JB SONG_END ; 小于 1 贝 U 结束 CMP AH,3FH ; 与 5 比较 JA SONG_END ; 大于则结束 SUB AH,3BH ; 转换成 15 MOV AL,AH MOV AH,00H MOV SONG,AX ;存入标志码 SONG_END: POP AX RET SCAN_SONG ENDP PLAY_SONG PROC NEAR ;选择并播放音乐 PUSH BP PUSH SI PUSH BX PUSH DI PUSH AX CMP SONG,01H ; 判断是否是歌 1 JNE GO2 ; 不是继续判断 CALL SONG_LIGHT_OFF ;灯 15 灭 DRAW 247,42,251,46,0EH ; 灯 1 亮 LEA BP,MUS_TIME1 ; 载入延时数据首地址 LEA SI,MUS_FREQ1 ; 载入频率数据首地址 JMP FREQ GO2: CMP SONG,02H ; 判断是否是歌 2 JNE GO3 CALL SONG_LIGHT_OFF DRAW 253,42,257,46,0EH LEA BP,MUS_TIME2 LEA SI,MUS_FREQ2 JMP FREQ GO3: CMP SONG,03H ; 判断是否是歌 3 JNE GO4 CALL SONG_LIGHT_OFF DRAW 259,42,263,46,0EH LEA BP,MUS_TIME3 LEA SI,MUS_FREQ3 JMP FREQ G04: CMP SONG,04H;判断是否是歌 4 JNE G05 CALL SONG_LIGHT_OFF DRAW 265,42,269,46,0EH LEA BP,MUS_TIME4 LEA SI,MUS_FREQ4 JMP FREQ GO5: CMP SONG,05H ; 判断是否是歌 5 JNE FREQ CALL SONG_LIGHT_OFF DRAW 271,42,275,46,0EH LEA BP,MUS_TIME5 LEA SI,MUS_FREQ5 FREQ: MOV AH,01H INT 16H CMP AH,1CH ; 判断是否为 enter 键(1CH 为 enter 键的扫描码) JNZ CONTINUE; 不是继续 JMP PLAY_END ; 是就结束自动播放 CONTINUE: MOV AH,0CH ; 清除键盘缓冲区字符 MOV AL,06H ;DOS 6 号功能调用 INT 21H MOV DI,SI; 把频率放在 DI 中 CMP DI,0; 判断是否结束 JE PLAY_END MOV BX,BP ;BX 中存放节拍数 CALL GEN_AUTO;发声 ADD SI,2 ADD BP,2 ; 下一频率 JMP FREQ PLAY_END: CALL SONG_LIGHT_OFF POP AX POP DI POP BX POP SI POP BP RET PLAY_SONG ENDP LOAD_AUDIO PROC NEAR ;C/D 调及对应的低、中、高频率分别载入 ;OUT:BX ;IN:TUNE,AUDIO TUNE_D: ;D 大调判断 CMP TUNE,D JNZ TUNE_CL ; 不是判断是否是 C 调 TUNE_DL: CMP AUDIO,1 ; 低频判断 JNETUNE_CM LEA BX,L OWDD JMP AUDIO_END TUNE_DM: CMP AUDIO,2 ; 中频判断 JNETUNE_CH LEA BX,MIDD JMP AUDIO_END TUNE_DH: LEA BX,HGHD ; 高频判断 JMP AUDIO_END TUNE_CL: ;C 调处理 CMP AUDIO,1 JNETUNE_CM LEA BX,L OWD JMP AUDIO_END TUNE_CM: CMP AUDIO,2 JNETUNE_CH LEA BX,MID JMP AUDIO_END TUNE_CH: LEA BX,HGH AUDIO_END: RET LOAD_AUDIO ENDP SCAN_TUNE PROC NEAR; ;C/D 调判断及其状态在屏幕上的显示 ;IN:DL 键盘扫描码 ;OUT:TUNE CMP DL,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: RET SCAN_TUNE 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 号功能,设置光标位置,DHW 亍号,DL=l号,BH顼号 MOV BH,00H ;0 页 INT 10H INC DI ; 取得颜色值 MOV BL,DI; 赋颜色值 CHAR_WRITE:;显示字符 INC DI ; 取得要显示的字符 MOV AL,DI CMP AL,0FFH; 行结束否 JE BUMP_ROW;下一行 CMP AL,0 ; 结束否 JZ END_TEXT CALL SHOW_CHAR ;调用显示字符 JMP CHAR_WRITE ;下一个字符 END_TEXT: RET BUMP_ROW:光标下移一行 INC DH ;2 号功能,下一行 MOV DL,START_COL;2 号功能,赋开始值 MOV AH,2 ;2 号功能,设光标位置 MOV BH,00H INT 10H JMP CHAR_WRITE SHOW_TEXT ENDP SHOW_CHAR PROC NEAR ;显示字符 MOV AH,9 ;9 号功能,显示字符 BL=?符属性,BH 顼号,AL=?符 ASCII 码,CX=;写入字符数 MOV BH,00H MOV CX,1 ; 写入一个字符 INT 10H INC DL ;2 号功能,赋列值,这里为光标右移一个字符位 MOV AH,2 ; 设置光标位置 MOV BH,00H ;0 页 INT 10H RET SHOW_CHAR ENDP INIT PROC NEAR ;初始化屏幕:画琴键 MOV AX,DATA MOV DS,AX MOV AH,00H ;设置屏幕 MOV AL,0DH INT 10H MOV AH,0BH ;11 号功能,设置背景颜色 MOV BL,02H INT 10H CALL SHOW_TEXT;显示字符串 DRAW 45,30,285,94,05H DRAWSQRE 45,30,285,94,0DH DRAWSQRE 49,48,280,49,00H DRAW 55,38,60,41,0EH ;C 调灯 DRAW 65,38,70,41,0AH ;D 调灯 CALL SONG_LIGHT_OFF;自动播放歌指示灯关 LEA SI,ST_LX ; 画 21 个白色键 LEA DI,ED_LX MOV CX,21 INIT_DRAW: DRAW SI,ST_Y,DI,ED_Y,0FH DRAW SI,90,DI,93,07H ; 阴影 ADD SI,2 ADD DI,2 LOOP INIT_DRAW LEA SI,BT_X ; 画 15 个黑色键 LEA DI,BD_X
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!