注册 登录
编程论坛 汇编论坛

汇编 钢琴实验 要求键入1、2、3、4、5、6、7、8 得音 1、2、3、4、5、6、7、i

陛下 发布于 2010-12-29 15:13, 1762 次点击
我写了点
但到与门打开与关闭卡了
希望能帮助 谢谢
程序代码:
START:
      MOV AX,DATA
      MOV DS,AX
X1:   MOV,AH,01H
      INT 21H
KEY:  MOV AH,07H
      INT 21H
      CMP AL,'Q'
      JZ  EXIT

 
      CMP AL,O8H
      JZ X1
X2:
      SUB AL,31H
      MOV AH,00H
      MOV SI,AX
      SAL SI,1
;++++++++++++++++++++++++++
      MOV DX,0012H
      MOV AX,0000H
      MOV BH,00H
      MOV BL,AL
      DIV MOSIC[SI]
      MOV BX,AX
;++++++++++++++++++++++++
      MOV DX,43H
      MOV AL,0B6H
      OUT DX,AL
      IN AL,42H
      MOV AL,BL
      OUT 42H,AL
      MOV AL,BH
      OUT 42H,AL
;+++++++++++++++++++++
      IN AL,61H
      OR AL,03H
.....
下面的不会了     



      
     
4 回复
#2
陛下2010-12-29 16:00
程序代码:
前面的我忘记写上去了
不好意思
现在的是我写的完整程序
DATA SEGMENT
MUSIC DW 524,588,660,598,784,988,1048
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,CS:DATA
START:
      MOV AX,DATA
      MOV DS,AX
X1:   MOV,AH,01H
      INT 21H
KEY:  MOV AH,07H
      INT 21H
      CMP AL,'Q'
      JZ  EXIT

      CMP AL,O8H
      JZ X1
X2:
      SUB AL,31H
      MOV AH,00H
      MOV SI,AX
      SAL SI,1
;++++++++++++++++++++++++++
      MOV DX,0012H
      MOV AX,0000H
      MOV BH,00H
      MOV BL,AL
      DIV MOSIC[SI]
      MOV BX,AX
;++++++++++++++++++++++++
      MOV DX,43H
      MOV AL,0B6H
      OUT DX,AL
      IN AL,42H
      MOV AL,BL
      OUT 42H,AL
      MOV AL,BH
      OUT 42H,AL
;+++++++++++++++++++++
      IN AL,61H
      OR AL,03H
.....
#3
曲水流觞___2010-12-31 13:15
我这有个程序,不知道对你有用没

编写实模式应用程序:利用IN/OUT指令编写简单的音乐程序。运行时,当用户按下按键1-7,分别演奏音调dou,re,mi,fa,so,la,si
.model small
.data
table dw 2277,2138,1808,1709,1522,1356,1208,1139
    ;对应中音1 ~ 7和高音i的定时器记数值
    ;代码段
.code
.startup  
    mov al,0b6h   ;设置定时器2工作方式
    out 43h,al
again: mov ah,1    ;等待按键
    int 21h
    cmp al,'1'    ;判断是否为数字1~8
    jb next ;close the speaker
    cmp al,'8'
    ja next
    sub al,30h
    ;1~8的ASCII码转换为二进制数
    sub al,1
    ;再减1,将数字1~8变为0~7,以便查表
    xor ah,ah
    shl ax,1  ;乘以2
    mov bx,ax
    ;记数值表是16位数据,无法采用xlat指令
    mov ax,table[bx]    ;取出对应的记数值
    out 42h,al    ;设置定时器2的记数值
    mov al,ah
    out 42h,al
    in al,61h    ;打开扬声器声音
    or al,03h    ;使D1D0=PB1PB0=11b,其他位不变
    out 61h,al
    jmp again    ;连续发声,直到按下另一个键
next: push ax
    in al,61h    ;不是数字1~8,则关闭扬声器声音
    and al,0fch    ;使D1D0=PB1PB0=00b,其他位不变  
    out 61h,al
    pop ax
    cmp al,1bh    ;判断是否为ESC键(对应ASCII码1bh)
    jne again    ;不是ESC,继续;否则程序执行结束
.exit 0
#4
Alar302010-12-31 16:48
貌似这类型的从来没玩过哈
学习了
#5
你们都要疼我哦2010-12-31 22:50
这个音阶对应是怎么来的?
这样也可以把一首简单的歌曲让BEEP连续发出来。
有空要试一下。
1