关闭

基于汇编语言的电子琴设计(4)

标签: 汇编语言goaudio音乐
1895人阅读 评论(1) 收藏 举报
分类:

LOAD PROC NEAR

;载入键在屏幕上的位置

CMP KEYFLAG,00H                         ;判断是否是低音键

       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                         ;载入高音键结束坐标首地址

       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                         ;判断是否是自动播放键(大键盘数字键1~5)

       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,01H

    CMP DH,01H   

    JE SLOW                                         ;是则进行低音处理

       MOV DH,AL                                    ;不是判断是否是左shift键

       AND DH,02H

       CMP DH,02H 

       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,4FH                                    ;是否是1

       JNE KEY_2                                       ;继续判断

       MOV KEYNUM,0                              ;不是则保存标志

       JMP SCAN_END                               ;键扫描结束

KEY_2: 

       CMP DL,50H                                    是否是2

       JNE KEY_3

       MOV KEYNUM,2

       JMP SCAN_END

KEY_3:

       CMP DL,51H                                    是否是3

       JNE KEY_4

       MOV KEYNUM,4

       JMP SCAN_END

KEY_4: 

       CMP DL,4BH                             是否是4

       JNE KEY_5

       MOV KEYNUM,6

       JMP SCAN_END

KEY_5:

       CMP DL,48H                                    是否是5

       JNE KEY_6

       MOV KEYNUM,8

       JMP SCAN_END

KEY_6:

    CMP DL,4DH                                  是否是6

       JNE KEY_7

       MOV KEYNUM,10

       JMP SCAN_END

KEY_7:

       CMP DL,47H                                    是否是7

       JNE SCAN_END

       MOV KEYNUM,12

SCAN_END:

       RET

SCAN_KEY ENDP

 

SCAN_SONG PROC NEAR

;判断是否是自动播放键(键1~5),并保存标志变量(song)

IN: AH    键扫描码

       PUSH AX

       MOV SONG,100                                       ;赋初始值

       CMP AH,3BH                                    ;与1比较

       JB  SONG_END                                      ;小于1则结束

       CMP AH,3FH                                    ;与5比较

       JA SONG_END                                        ;大于则结束

       SUB AH  3B                                             ;转换成1~5

       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               ;灯1~5灭

       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

 

GO4:

       CMP SONG,04H                                              ;判断是否是歌4

       JNE GO5

       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键

       JNZ CONTINUE                                              ;不是继续

       JMP PLAY_END                                             ;是结自动播放

CONTINUE:

       MOV AH,0CH                                                ;清除键盘缓冲区字符

       MOV AL,06H

       INT 21H

       MOV DI,[SI]

       CMP DI,-1                                                      ;判断结束否

    JE  PLAY_END                                            

       MOV BX,[BP]

       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

 

〈未完〉

0
0
查看评论

51单片机实训-4×4矩阵键盘电子琴

51单片机实训-4×4矩阵键盘电子琴
  • myifeng1
  • myifeng1
  • 2016-12-17 15:29
  • 301

51单片机 汇编语言电子琴

以前写过一个 C 语言的:http://hi.baidu.com/do_sermon/item/c5e55bc1fc2dc30ec710b2f9应网友要求,再写个汇编的。另外,还增加了显示按键号码的功能。题目链接:http://zhidao.baidu.com/question/1818901024...
  • baidu_33836580
  • baidu_33836580
  • 2016-01-25 12:12
  • 831

基于VHDL的具有自动乐曲演奏功能的电子琴设计

具有自动乐曲演奏功能的电子琴设计 先给出设计结果视频链接:    具有自动乐曲演奏功能的电子琴-视频实录 优酷:具有自动乐曲演奏功能的电子琴-视频实录        本文为本人于2012年下学期做的ED...
  • u011335616
  • u011335616
  • 2013-09-12 16:35
  • 5726

基于汇编语言的电子琴设计(1)

[调试环境:TASM 5.0+ winxp] 一、基本要求:    利用PC键盘和CRT显示器设计一个电子琴,首先在CRT显示器上模拟出琴键的画面,然后要求在不同的情况下按下键盘上“1~7”中任意数字键,可弹奏出与之相应的音调,且在模拟键盘上标示出对应的那个键...
  • mythma
  • mythma
  • 2004-03-29 10:13
  • 4000

基于汇编语言的电子琴设计(3)

;代码段CODE SEGMENT     ASSUME DS:DATA,CS:CODEMAIN PROC FAR;主程序START:         CALL INIT  ...
  • mythma
  • mythma
  • 2004-03-29 10:13
  • 3155

【电子DIY】基于NE555制作的简易电子琴

自多次利用51单片机+无源蜂鸣器制作电子琴多次以后,突然领悟蜂鸣器产生声波的原理,无非是产生一定频率占空比50%的PWM而已。然后,联想到之前用NE555制作过几个小电路,靠的是555产生一定频率的波,于是在想是否可以不通过单片机控制直接制作按键电子琴。原理上看,只要每个按键对应R2的电阻不同,即可...
  • u011619535
  • u011619535
  • 2017-07-30 22:49
  • 1401

独创Arduino电子琴

一.目标: 实现一个简单电子琴的功能 二.原理:       用按键作为钢琴的键盘,结合蜂鸣器实验,用蜂鸣器的一个pwm引脚作为输出。          不同的按键 被按...
  • V__KING__
  • V__KING__
  • 2014-01-25 11:43
  • 2114

基于汇编语言的电子琴设计(5)

LOAD_AUDIO PROC NEAR;C/D调及对应的低、中、高频率分别载入;OUT:BX;IN:TUNE,AUDIOTUNE_D:             ...
  • mythma
  • mythma
  • 2004-03-29 10:13
  • 2262

基于汇编语言的电子琴设计(2)

六、程序清单:主要程序代码如下:;宏定义DRAW MACRO START_X,START_Y,END_X,END_Y,COLOR        LOCAL DRAW_NEXT;local :避免宏重复调用时,标号的重复;功能:画填...
  • mythma
  • mythma
  • 2004-03-29 10:13
  • 3958

基于fpga的niosii PS2电子琴

1 概述 1.1 作品简介 本设计是基于NIOSII软核的PS2键盘电子琴,通过ps2键盘上的21个按键来控制蜂鸣器发出高音,中音与低音的(DO,RE,MI,FA,SO,LA,SI)音调,并通过三个数码管来显示相应的音调值,通过两个拨码开关控制节拍(即一个音持续的时间)。 1.2 作品目的与意...
  • baidu_37472307
  • baidu_37472307
  • 2017-03-31 15:53
  • 458
    个人资料
    • 访问:537747次
    • 积分:7145
    • 等级:
    • 排名:第3783名
    • 原创:173篇
    • 转载:4篇
    • 译文:2篇
    • 评论:187条
    最新评论