📄 music_keyi.asm
字号:
;*******************************************************************************
; 基于AT89S51的多功能音乐演奏器的设计
;
;*******************************************************************************
M_BUF EQU 7FH ;曲目缓冲区
ALT_K EQU 0FH ;功能切换键号
NEXT_K EQU 0EH ;下一首功能键号
LAST_K EQU 0DH ;上一首功能键号
PAUSE_K EQU 0BH ;暂停功能键号
MUSIC_NUM EQU 03H ;总曲目数
F2 EQU 08H ;暂停标志位
TODAC EQU 6FH ;DAC0832缓冲区
;*******************************************************************************
ORG 0000H
LJMP MAIN ;转主程序
ORG 0003H
LJMP KEY_INT ;转键盘中断服务程序
ORG 000BH
LJMP T0_INT ;转定时器中断服务程序
;*******************************************************************************
; 主程序
;*******************************************************************************
MAIN:MOV M_BUF,#01H ;首先播放第一首乐曲
SETB PT0 ;设置定时器中断为高优先级
CLR PX0 ;设置外部中断0为低优先级
MAIN1:CLR EA ;关闭中断
CLR EX0
CLR ET0
CLR TR0 ;关闭定时器
MOV SP,#20H ;设置堆栈指针初值
MOV P1,#0FH ;键盘列线置低电平,准备读行线值
SETB EX0 ;开中断
SETB EA
JB F0,INT_WAIT ;功能判断
INT_MUSIC:LJMP MUSIC ;若F0=0,播放乐曲
INT_WAIT:SJMP $ ;若F0=1,等待电子琴键盘中断
;*******************************************************************************
; 乐曲发生子程序
;*******************************************************************************
MUSIC:MOV TMOD,#01H ;定时器工作在方式1
SETB ET0 ;定时器0中断允许
MOV A,M_BUF ;根据曲目缓冲区内容选曲
MT3:CJNE A,#03H,MT2
MOV DPTR,#MTAB3 ;MTAB3为第3首乐曲首地址
SJMP NEXT
MT2:CJNE A,#02H,MT1
MOV DPTR,#MTAB2 ;MTAB2为第2首乐曲首地址
SJMP NEXT
MT1:MOV DPTR,#MTAB1 ;MTAB1为第1首乐曲首地址
NEXT:CLR A ;准备查乐曲表
MOVC A,@A+DPTR ;查乐曲表音调部分
JZ REST ;若A=00H,则为休止符
CJNE A,#0FFH,CONTINUE ;若A=FFH,则为停止符
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -