汇编语言C大调电子琴程序,用51单片机 汇编语言 做简单的电子琴
时间: 2023-07-11 12:05:50 浏览: 314
这是一个简单的汇编语言C大调电子琴程序,使用51单片机。
```
ORG 0000H ; 定义程序起始地址
MOV P0, #0FFH ; 将P0口设为输出
MAIN:
MOV A, P1 ; 读取P1口状态
CJNE A, #1, MAIN ; 如果P1口没有按键则继续等待
MOV A, P1 ; 读取P1口状态
ANL A, #0FH ; 只取低4位
MOV P0, A ; 输出到P0口
CALL PLAY_NOTE ; 播放音符
JMP MAIN ; 继续等待按键
PLAY_NOTE:
PUSH ACC ; 保存ACC寄存器
PUSH PSW ; 保存PSW寄存器
MOV A, P1 ; 读取按键状态
ANL A, #0FH ; 只取低4位
CPL A ; 取反
ADD A, #1 ; 加1
MOV R0, A ; 存储音符编号
MOV A, R0 ; 读取音符编号
MOV R1, A ; 存储到R1寄存器
MOV A, #0FFH ; 发送高电平到蜂鸣器
MOV P0, A ; 输出到P0口
MOV A, R1 ; 读取音符编号
CJNE A, #01H, NOT_C ; 如果不是C,则跳转到NOT_C
MOV R2, #38H ; C3
JMP PLAY
NOT_C:
CJNE A, #02H, NOT_D ; 如果不是D,则跳转到NOT_D
MOV R2, #34H ; D3
JMP PLAY
NOT_D:
CJNE A, #03H, NOT_E ; 如果不是E,则跳转到NOT_E
MOV R2, #30H ; E3
JMP PLAY
NOT_E:
CJNE A, #04H, NOT_F ; 如果不是F,则跳转到NOT_F
MOV R2, #2CH ; F3
JMP PLAY
NOT_F:
CJNE A, #05H, NOT_G ; 如果不是G,则跳转到NOT_G
MOV R2, #28H ; G3
JMP PLAY
NOT_G:
CJNE A, #06H, NOT_A ; 如果不是A,则跳转到NOT_A
MOV R2, #24H ; A3
JMP PLAY
NOT_A:
CJNE A, #07H, NOT_B ; 如果不是B,则跳转到NOT_B
MOV R2, #20H ; B3
JMP PLAY
NOT_B:
CJNE A, #08H, NOT_C_2 ; 如果不是C,则跳转到NOT_C_2
MOV R2, #1CH ; C4
JMP PLAY
NOT_C_2:
CJNE A, #09H, NOT_D_2 ; 如果不是D,则跳转到NOT_D_2
MOV R2, #18H ; D4
JMP PLAY
NOT_D_2:
CJNE A, #0AH, NOT_E_2 ; 如果不是E,则跳转到NOT_E_2
MOV R2, #14H ; E4
JMP PLAY
NOT_E_2:
CJNE A, #0BH, NOT_F_2 ; 如果不是F,则跳转到NOT_F_2
MOV R2, #10H ; F4
JMP PLAY
NOT_F_2:
CJNE A, #0CH, NOT_G_2 ; 如果不是G,则跳转到NOT_G_2
MOV R2, #0CH ; G4
JMP PLAY
NOT_G_2:
CJNE A, #0DH, NOT_A_2 ; 如果不是A,则跳转到NOT_A_2
MOV R2, #08H ; A4
JMP PLAY
NOT_A_2:
CJNE A, #0EH, NOT_B_2 ; 如果不是B,则跳转到NOT_B_2
MOV R2, #04H ; B4
JMP PLAY
NOT_B_2:
MOV R2, #00H ; 没有按键,静音
PLAY:
MOV A, R2 ; 读取音符频率
MOV R3, A ; 存储到R3寄存器
MOV A, #0 ; 清空ACC寄存器
MOV B, #1 ; 设置B为1
LOOP:
DJNZ B, LOOP ; 延时
MOV A, R3 ; 读取音符频率
XRL P0, #0FFH ; 取反输出
DJNZ ACC, LOOP ; 延时
POP PSW ; 恢复PSW寄存器
POP ACC ; 恢复ACC寄存器
RET ; 返回
```
该程序使用P1口读取按键状态,将按键编号转换为音符频率,并通过P0口输出音符信号。该程序只支持C大调音阶,如果需要支持其他音阶,需要修改对应的音符频率。
阅读全文