下面是一段用汇编语言实现的模拟琴键的代码,使用数字键1~8模拟琴键1~1(高音),并通过PC扬声器发出相应的音调:
```
.MODEL SMALL
.STACK 100H
.DATA
NOTE1 DB 0C9H ;音调1的频率值
NOTE2 DB 0D1H ;音调2的频率值
NOTE3 DB 0D9H ;音调3的频率值
NOTE4 DB 0E1H ;音调4的频率值
NOTE5 DB 0E9H ;音调5的频率值
NOTE6 DB 0F1H ;音调6的频率值
NOTE7 DB 0F9H ;音调7的频率值
NOTE8 DB 101H ;音调8的频率值
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX ;初始化数据段寄存器
MOV DX, 61H
MOV AL, 0B6H
OUT DX, AL ;初始化PC扬声器控制寄存器
WAIT:
IN AL, 60H
CMP AL, 31H
JE PLAY1
CMP AL, 32H
JE PLAY2
CMP AL, 33H
JE PLAY3
CMP AL, 34H
JE PLAY4
CMP AL, 35H
JE PLAY5
CMP AL, 36H
JE PLAY6
CMP AL, 37H
JE PLAY7
CMP AL, 38H
JE PLAY8
JMP WAIT
PLAY1:
MOV AL, NOTE1
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
MOV AL, 0B6H
OUT DX, AL
JMP WAIT
PLAY2:
MOV AL, NOTE2
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
MOV AL, 0B6H
OUT DX, AL
JMP WAIT
PLAY3:
MOV AL, NOTE3
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
MOV AL, 0B6H
OUT DX, AL
JMP WAIT
PLAY4:
MOV AL, NOTE4
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
MOV AL, 0B6H
OUT DX, AL
JMP WAIT
PLAY5:
MOV AL, NOTE5
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
MOV AL, 0B6H
OUT DX, AL
JMP WAIT
PLAY6:
MOV AL, NOTE6
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
MOV AL, 0B6H
OUT DX, AL
JMP WAIT
PLAY7:
MOV AL, NOTE7
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
MOV AL, 0B6H
OUT DX, AL
JMP WAIT
PLAY8:
MOV AL, NOTE8
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
MOV AL, 0B6H
OUT DX, AL
JMP WAIT
MAIN ENDP
END MAIN
```
在这段代码中,我们使用了8254芯片控制PC扬声器的工作频率,通过按下数字键1~8来选择不同的音调,同时使用了循环来不断等待键盘输入。注意,这段代码只能在实模式下运行,而且需要在DOS或类DOS操作系统下运行。