📄 yinyue.asm
字号:
LOUT BIT P1.0 ;左声道输出
ROUT BIT P1.2 ;右声道输出
SET BIT P3.3 ;SET按键
ALT0 BIT P3.6 ;ALT0按键
ALT1 BIT P3.7 ;ALT1按键
;REPNUM EQU 09H重复段编号
STATU EQU 0AH;状态寄存器
LDYDSR EQU 0BH;左低音度数
RDYDSR EQU 0CH;右低音度数
LDYAR EQU 0DH;左低音协助
RDYAR EQU 0EH;右低音协助
JPCLK EQU 0FH;节拍时钟
GENCLK EQU 10H;通用时钟
SNSDCLK EQU 11H;搜、存显示时钟
GEN16T0 EQU 12H;通用16位时钟
GEN16T1 EQU 13H;
SETST0 EQU 14H;设置状态
SETST1 EQU 15H; 定时时钟
DISNUM0 EQU 16H;显示数值
DISNUM1 EQU 17H;寄存器(2位)
CSN EQU 18H;当前曲曲号
REP0L EQU 19H;0号重复段地址
REP0H EQU 1AH;
REP1L EQU 1BH;1号重复段地址
REP1H EQU 1CH;
REP2L EQU 1DH;2号重复段地址
REP2H EQU 1EH
REP3L EQU 1FH;3号重复段地址
REP3H EQU 23H;
COSPEEDN EQU 24H;
SPENR EQU 25H;
LOCF BIT 00H;左声道开关标志
ROCF BIT 01H;右声道开关标志
SECHSTOF BIT 02H;搜索、存储标志
NEXTSF BIT 03H;下一曲标志
CSBESTOF BIT 04H;当前曲锁存/释放
CUYFD BIT 05H;当前音符显示
KSETF BIT 06H;SET键按下标志
KALT0F BIT 07H;ALT0键按下标志
KALT1F BIT 08H;ALT1键按下标志
SPEEDF BIT 09H;速度增/减标志
TONEF BIT 0AH;音调增/减标志
YPBIT BIT 0BH;音频逻辑输出
KBDISF BIT 0CH;键盘显示标志
REP0F BIT 0DH;0号重复段控制
REP1F BIT 0EH;1号重复段控制
REP2F BIT 0FH;2号重复段控制
REP3F BIT 10H;3号重复段控制
SBOTM EQU 25H;堆栈区(栈底)
BUFF0 EQU 43H;锁存曲数
BUFF EQU 44H;锁存曲缓冲区
;============================
;=========BEGIN==============
ORG 0000H
LJMP MAIN
;---------T0INT--------------
ORG 000BH
LJMP T0INT
;---------T1INT--------------
ORG 001BH
LJMP T1INT
;1.音频发生器
;---------YPFSQ(01)----------
ORG 0030H
T0INT: MOV TL0,R4
MOV TH0,R5
PUSH PSW
PUSH ACC
PUSH 01H
JB LOCF,ROPER
MOV R1,#00H
MOV A,LDYAR
T0LLOP: RRC A
MOV YPBIT,C
XCH A,R1
CJNE A,LDYDSR,T0LNEXT
MOV C,YPBIT
MOV LOUT,C
INC LDYAR
; INC P0
SJMP ROPER
T0LNEXT: XCH A,R1
INC R1
SJMP T0LLOP
ROPER: JB ROCF,T0RETI
MOV R1,#00H
MOV A,RDYAR
T0RLOP: RRC A
MOV YPBIT,C
XCH A,R1
CJNE A,RDYDSR,T0RNEXT
MOV C,YPBIT
MOV ROUT,C
INC RDYAR
; INC P2
SJMP T0RETI
T0RNEXT: XCH A,R1
INC R1
SJMP T0RLOP
T0RETI: POP 01H
POP ACC
POP PSW
RETI
;2.通用时钟
;---------CLOCK(02)----------
T1INT: MOV TL1,#0F0H
MOV TH1,#0D8H
PUSH PSW
PUSH ACC
INC JPCLK
INC GENCLK
INC SNSDCLK
MOV A,SNSDCLK
CJNE A,#0FFH,T1NEXT
CLR SECHSTOF
T1NEXT: INC GEN16T0
MOV A,GEN16T0
CJNE A,#100,T1NEXT0
MOV GEN16T0,#00H
INC GEN16T1
T1NEXT0: INC SETST0
MOV A,SETST0
CJNE A,#100,T1RETI
MOV SETST0,#00H
INC SETST1
MOV A,SETST1
CJNE A,#20,T1RETI
MOV SETST1,#00H
MOV STATU,#00H
T1RETI: POP ACC
POP PSW
RETI
;3.显示子程序
;---------DISPLAY(03)--------
DISPLAY: PUSH ACC
PUSH DPL
PUSH DPH
MOV DPTR,#T_FIGCODE
MOV A,DISNUM0
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,DISNUM1
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
POP DPH
POP DPL
POP ACC
RET
T_FIGCODE:
DB 088H,0EBH,04CH,049H
; 0 1 2 3
DB 02BH,019H,018H,0CBH
; 4 5 6 7
DB 008H,009H,00AH,038H
; 8 9 A B
DB 09CH,068H,01CH,01EH
; C D E F
DB 080H,0E3H,044H,041H
; 0. 1. 2. 3.
DB 023H,011H,010H,0C3H
; 4. 5. 6. 7.
DB 000H,001H,002H,030H
; 8. 9. A. B.
DB 094H,060H,014H,016H
; C. D. E. F.
DB 0FFH,02FH,098H,07FH
; 熄灭 # G -
DB 07CH,078H,0BCH,00AH
; c o L R
DB 029H
; Y
;4.主程序MAIN
;---------MAIN(04)-----------
MAIN: MOV R0,#01H
CLR A
CLRAM: MOV @R0,A
INC R0
CJNE R0,#80H,CLRAM
MOV R0,A
MOV SP,#SBOTM
MOV 08H,#BUFF
;MOV 09H,#BUFF
MOV SCON,#00H
MOV TMOD,#11H
MOV TL1,#0F0H
MOV TH1,#0D8H
SETB EA
SETB ET0
SETB ET1
SETB TR1
START: MOV DPTR,#T_SONGS
RYF: LCALL RYFSUP
MOV A,R7
JZ START
CJNE R7,#0FFH,SYF
JBC NEXTSF,NEXTSCL
MOV A,STATU
JNZ GONSBQ
MOV A,BUFF0
JNZ MPSQCL
LCALL PAQSCL
SJMP MQNFD
MPSQCL: LCALL PSQSCL
MQNFD: LCALL QNFDSUP
MOVPJRYF: INC DPTR
INC DPTR
SJMP RYF
NEXTSCL: LCALL CSBESTOJG
JB CSBESTOF,CALLPSCL
LCALL PAQSCL
SJMP MOVPJRYF
CALLPSCL: LCALL PSQSCL
SJMP MOVPJRYF
GONSBQ: LCALL CSDPTR
INC DPTR
INC DPTR
SJMP MOVPJRYF
SYF: CJNE R6,#0FFH,CALLPLAY
LCALL REPCLSUP
SJMP MOVPJRYF
CALLPLAY: LCALL YFDSUP
LCALL PLAY
SJMP MOVPJRYF
;5.读音符子程序
;---------RYFSUP(05)--------
RYFSUP: CLR A
MOVC A,@A+DPTR
MOV R6,A
MOV A,#01H
MOVC A,@A+DPTR
MOV R7,A
RET
;6.统唱曲首处理
;---------PAQSCL(06)--------
PAQSCL: MOV CSN,R6
INC DPTR
INC DPTR
LCALL RYFSUP
MOV 02H,R6
MOV 03H,R7
RET
;7.存唱曲首处理
;---------PSQSCL(07)--------
PSQSCL: PUSH PSW
SETB RS0
CLR RS1
PSQC7E: CJNE R0,#7EH,PSQNEXT
PSQNEXT: JC PSQNEXT1
MOV R0,#BUFF
SJMP PSQC7E
PSQNEXT1: MOV A,@R0
JNZ PSQNEXT2
INC R0
INC R0
INC R0
SJMP PSQC7E
PSQNEXT2: MOV CSN,@R0
INC R0
MOV 02H,@R0
INC R0
MOV 03H,@R0
INC R0
POP PSW
LCALL CSDPTR
INC DPTR
INC DPTR
RET
;8.曲号闪显子程序
;---------QNFDSUP(08)-------
QNFDSUP: PUSH ACC
MOV GEN16T0,#00H
MOV GEN16T1,#00H
QNGON: LCALL CSNSDISN
LCALL DISPLAY
MOV GENCLK,#00H
QNWAIT: MOV A,GENCLK
CJNE A,#35,QNWAIT
MOV DISNUM0,#20H
MOV DISNUM1,#20H
LCALL DISPLAY
MOV GENCLK,#00H
QNWAIT1: MOV A,GENCLK
CJNE A,#15,QNWAIT1
MOV A,GEN16T1
CJNE A,#02,QNGON
POP ACC
RET
;9.曲号送显示寄存器
;---------CSNSDISN(09)------
CSNSDISN: MOV A,CSN
ANL A,#0FH
LCALL CSBESTOJG
JNB CSBESTOF,NADP
ADD A,#10H
NADP: MOV DISNUM0,A
MOV A,CSN
SWAP A
ANL A,#0FH
MOV DISNUM1,A
RET
;10.当前曲是否被存储判断
;---------CSBESTOJG(10)-----
CSBESTOJG:PUSH ACC
PUSH PSW
MOV A,BUFF0
JZ CLRCSTOF
MOV R0,#BUFF
CSBCMPCSN:MOV A,@R0
CJNE A,CSN,CSBGSCAN
SETB CSBESTOF
SJMP CSBRET
CSBGSCAN: INC R0
INC R0
INC R0
CJNE R0,#7EH,CSBNEXT
CSBNEXT: JC CSBCMPCSN
CLRCSTOF: CLR CSBESTOF
MOV R0,#BUFF
CSBCMP0: MOV A,@R0
JZ CSBRET
INC R0
INC R0
INC R0
CJNE R0,#7EH,CSBNEXT1
CSBNEXT1: JC CSBCMP0
CSBRET: POP PSW
POP ACC
RET
;11.找当前曲首址
;---------CSDPTR(11)--------
CSDPTR: MOV DPTR,#T_SONGS
CSDSCAN: LCALL RYFSUP
CJNE R7,#0FFH,CSDNEXT
MOV A,R6
CJNE A,CSN,CSDNEXT
SJMP CSDRET
CSDNEXT: INC DPTR
INC DPTR
SJMP CSDSCAN
CSDRET: RET
;12.重复段处理子程序
;---------REPCLSUP(12)------
REPCLSUP: MOV A,R7
ANL A,#0FH
CJNE A,#02H,CMPA3
MOV A,R7
SWAP A
ANL A,#0FH
JNZ H4CMP1
JNB REP0F,REPRET0
CLR REP0F
MOV DPL,REP0L
MOV DPH,REP0H
REPRET0: RET
H4CMP1: CJNE A,#01H,H4CMP2
JNB REP1F,REPRET
CLR REP1F
MOV DPL,REP1L
MOV DPH,REP1H
RET
H4CMP2: CJNE A,#02H,H4CMP3
JNB REP2F,REPRET
CLR REP2F
MOV DPL,REP2L
MOV DPH,REP2H
RET
H4CMP3: CJNE A,#03H,REPRET
JNB REP3F,REPRET
CLR REP3F
MOV DPL,REP3L
MOV DPH,REP3H
RET
CMPA3: CJNE A,#03H,REPRET
MOV A,R7
SWAP A
ANL A,#0FH
JNZ H4VS1
SETB REP0F
MOV REP0L,DPL
MOV REP0H,DPH
SJMP SREPHAD
H4VS1: CJNE A,#01H,H4VS2
SETB REP1F
MOV REP1L,DPL
MOV REP1H,DPH
SJMP SREPHAD
H4VS2: CJNE A,#02H,H4VS3
SETB REP2F
MOV REP2L,DPL
MOV REP2H,DPH
SJMP SREPHAD
H4VS3: CJNE A,#03H,REPRET
SETB REP3F
MOV REP3L,DPL
MOV REP3H,DPH
SREPHAD: MOV 09H,A
LCALL CSDPTR
REPGON: INC DPTR
INC DPTR
LCALL RYFSUP
CJNE R6,#0FFH,REPGON
MOV A,R7
SWAP A
ANL A,#0FH
CJNE A,09H,REPGON
REPRET: RET
;13.音符显示子程序
;---------YFDSUP(13)--------
YFDSUP: MOV A,STATU
JNZ YFDRET
JB SECHSTOF,YFDRET
JNB CUYFD,YFSLED
XZFCLD: MOV DISNUM0,#20H
MOV DISNUM1,#20H
SJMP YFDSPLAY
YFSLED: MOV A,R6
JZ XZFCLD
ANL A,#0FH
PUSH DPL
PUSH DPH
MOV DPTR,#T_YFDCOD
MOVC A,@A+DPTR
MOV DISNUM0,A
POP DPH
POP DPL
MOV A,R6
SWAP A
ANL A,#0FH
MOV DISNUM1,A
YFDSPLAY: LCALL DISPLAY
YFDRET: RET
T_YFDCOD: DB 20H ;--
DB 01H ; 1
DB 02H ; 2
DB 03H ; 3
DB 04H ; 4
DB 05H ; 5
DB 06H ; 6
DB 07H ; 7
DB 11H ;#1
DB 12H ;#2
DB 14H ;#4
DB 15H ;#5
DB 16H ;#6
;14.唱音符子程序
;---------PLAY(14)----------
PLAY: MOV A,R6
JZ PCOSPECL
PUSH DPL
PUSH DPH
MOV DPTR,#T_SD
ANL A,#0FH
MOVC A,@A+DPTR
XCH A,R6
SWAP A
ANL A,#0FH
MOV B,#12
MUL AB
ADD A,R6
ADD A,R2
RL A
MOV R6,A
MOV DPTR,#T_RAN
MOVC A,@A+DPTR
MOV TH0,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -