cpubbs 发表于 2004-11-6 02:53:34

功能齐全的单片机音乐程序

<B>功能齐全的单片机音乐程序(dhd0)</B></P>
单片机最小系统,两位LED数码管由串口输出接两个164驱动,Lout,Rout为左右声道输出,
SET,ALT0, ALT1为三个按键,也可自己在开始的I/O定义改成你想用的I/O口;12M晶振
若用89C51则只可装下约14首歌曲,用89C52则可装下近40曲


源程序
;   Electronic Music
;   Version 4.50
;   Copyright (c) XAJ 2001
;============================
LOUTBIT P1.0 ;左声道输出
ROUTBIT P1.2 ;右声道输出
SET   BIT P3.3 ;SET按键
ALT0BIT P3.6 ;ALT0按键
ALT1BIT 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;通用时钟
SNSDCLKEQU 11H;搜、存显示时钟
GEN16T0EQU 12H;通用16位时钟
GEN16T1EQU 13H;
SETST0   EQU 14H;设置状态
SETST1   EQU 15H;定时时钟
DISNUM0EQU 16H;显示数值
DISNUM1EQU 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
          LJMPMAIN
;---------T0INT--------------
          ORG   000BH
          LJMPT0INT

;---------T1INT--------------
          ORG   001BH
          LJMPT1INT
;1.音频发生器
;---------YPFSQ(01)----------
          ORG   0030H
T0INT:    MOV TL0,R4
          MOV TH0,R5
          PUSH PSW
          PUSH ACC
          PUSH 01H
          JBLOCF,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:    JBROCF,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
          JZSTART
          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
      JBCSBESTOF,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:JCPSQNEXT1
          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
          JZCLRCSTOF
          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:JCCSBCMPCSN
CLRCSTOF: CLR CSBESTOF
          MOV R0,#BUFF
CSBCMP0:MOV A,@R0
          JZCSBRET
          INC R0
          INC R0
          INC R0
      CJNE R0,#7EH,CSBNEXT1
CSBNEXT1: JCCSBCMP0
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

cpubbs 发表于 2004-11-6 02:53:54

;13.音符显示子程序
;---------YFDSUP(13)--------
YFDSUP:   MOV A,STATU
          JNZ YFDRET
          JBSECHSTOF,YFDRET
          JNB CUYFD,YFSLED
XZFCLD:   MOV DISNUM0,#20H
          MOV DISNUM1,#20H
          SJMP YFDSPLAY
YFSLED:   MOV A,R6
          JZXZFCLD
          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
          JZPCOSPECL
          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
          RLA
          MOV R6,A
          MOV DPTR,#T_RAN
          MOVC A,@A+DPTR
          MOV TH0,A
          MOV R5,A
          MOV A,R6
          INC A
          MOVC A,@A+DPTR
          MOV TL0,A
          MOV R4,A
          POP DPH
          POP DPL
          SETB TR0
PCOSPECL: LCALL COSPECL
PJPWAIT:MOV JPCLK,#00H
PDELAY:   LCALL KCXCL
          JBNEXTSF,PRET
          MOV A,JPCLK
          CJNE A,01H,PNEXT
PNEXT:    JCPDELAY
          DJNZ R7,PJPWAIT
PRET:   CLR TR0
          RET
;---------TABSD-------------
T_SD:   DB01h;useless
          DB01H
          DB03H
          DB05H
          DB06H
          DB08H
          DB0AH
          DB0CH
          DB02H
          DB04H
          DB07H
          DB09H
          DB0bH
;---------TABRAN------------
T_RAN:    DW 0F111H;useless
   dw 0f111h; area 0
   dw 0f1e8h
   dw 0f2b2h
   dw 0f373h
   dw 0f426h
   dw 0f4eeh
   dw 0f571h
   dw 0f609h
   dw 0f699h
   dw 0f71fh
   dw 0f79fh
   dw 0f817h
   dw 0f889h; area 1
   dw 0f8f4h
   dw 0f95ah
   dw 0f9b9h
   dw 0fa13h
   dw 0fa68h
   dw 0fab9h
   dw 0fb04h
   dw 0fb4ch
   dw 0fb90h
   dw 0fbcfh
   dw 0fc0ch
   dw 0fc45h    ;area 2
   dw 0fc7ah
   dw 0fcadh
   dw 0fcdch
   dw 0fd0ah
   dw 0fd34h
   dw 0fd5ch
   dw 0fd82h
   dw 0fda6h
   dw 0fdc8h
   dw 0fde8h
   dw 0fe06h
   dw 0fe22h;area 3
   dw 0fe3dh
   dw 0fe56h
   dw 0fe6eh
   dw 0fe85h
   dw 0fe9ah
   dw 0feaeh
   dw 0fec1h
   dw 0fed3h
   dw 0fee3h
   dw 0fef4h
   dw 0ff02h
   dw 0ff11h    ;area 4
   dw 0ff1fh
   dw 0ff2bh
   dw 0ff37h
   dw 0ff42h
   dw 0ff4dh
   dw 0ff57h
   dw 0ff60h
   dw 0ff6ah
   dw 0ff72h
   dw 0ff7ah
   dw 0ff81h
   dw 0ff89h    ;    5
;15.共速处理
;---------COSPECL(15)-------
COSPECL:MOV R1,03H
          MOV A,COSPEEDN
          JZCOSPRET
          PUSH COSPEEDN
          MOV A,R1
COSPEGON: MOV B,#08H
          MUL AB
          CLR C
          SUBB A,R1
          JNC COSPNEXT
          DEC B
COSPNEXT: MOV R6,#03H
DIV8:   CLR C
          XCH A,B
          RRC A
          XCH A,B
          RRC A
          DJNZ R6,DIV8
          MOV R1,A
      DJNZ COSPEEDN,COSPEGON
          POP COSPEEDN
          MOV A,R1
          JNZ COSPRET
          MOV R1,#01H
COSPRET:RET
;16.键盘查询处理
;---------KCXCL(16)---------
KCXCL:    LCALL KSET
          LCALL KALT0
          LCALL KALT1
          JNB KSETF,KNEXT0
          LCALL KSETCL
KSETSTC:MOV SETST0,#00H
          MOV SETST1,#00H
          SETB KBDISF
          SJMP KDIS
KNEXT0:   JNB KALT0F,KNEXT1
          LCALL KALT0CL
          SJMP KSETSTC
KNEXT1:   JNB KALT1F,KDIS
          LCALL KALT1CL
          SJMP KSETSTC
KDIS:   MOV A,STATU
          JNZ KSSNSD
          JNB SECHSTOF,KRET
KSSNSD:   JNB KBDISF,KRET
          CLR KBDISF
          LCALL DISPLAY
KRET:   RET
;17.KSET键是否按下查询
;---------KSET(17)----------
KSET:   SETB SET
          JBSET,CSETRET
          MOV GENCLK,#00H
SETLOP:   MOV A,GENCLK
          CJNE A,#02,SETLOP
          SETB SET
          JBSET,CSETRET
          CLR TR0
SETWAIT:SETB SET
          JNB SET,SETWAIT
          MOV GENCLK,#00H
SETLOP1:MOV A,GENCLK
          CJNE A,#02,SETLOP1
          SETB TR0
          SETB KSETF
          RET
CSETRET:CLR KSETF
          RET
;18.KALT0键是否按下查询
;---------KALT0(18)---------
KALT0:    SETB ALT0
          JBALT0,CALT0RET
          MOV GENCLK,#00H
ALT0LOP:MOV A,GENCLK
          CJNE A,#02,ALT0LOP
          SETB ALT0
          JBALT0,CALT0RET
          CLR TR0
ALT0WAIT: SETB ALT0
          JNB ALT0,ALT0WAIT
          MOV GENCLK,#00H
ALT0LOP1: MOV A,GENCLK
          CJNE A,#02,ALT0LOP1
          SETB TR0
          SETB KALT0F
          RET
CALT0RET: CLR KALT0F
          RET
;19.KALT1键是否按下查询
;---------KALT1(19)---------
KALT1:    SETB ALT1
          JBALT1,CALT1RET
          MOV GENCLK,#00H
ALT1LOP:MOV A,GENCLK
          CJNE A,#02,ALT1LOP
          SETB ALT1
          JBALT1,CALT1RET
          CLR TR0
ALT1WAIT: SETB ALT1
          JNB ALT1,ALT1WAIT
          MOV GENCLK,#00H
ALT1LOP1: MOV A,GENCLK
          CJNE A,#02,ALT1LOP1
          SETB TR0
          SETB KALT1F
          RET
CALT1RET: CLR KALT1F
          RET
;20.SET键处理
;---------KSETCL(20)--------
KSETCL:   INC STATU
          MOV A,STATU
          CJNE A,#07H,STATUDIS
          MOV STATU,#00H
STATUDIS: MOV DISNUM0,#23H
          MOV DISNUM1,STATU
          RET
;21.KALT0键处理
;---------KALT0CL(21)-------
KALT0CL:MOV A,STATU
          JNZ CASEB1
KA0S0GINC DPTR
          INC DPTR
          LCALL RYFSUP
          MOV A,R7
          JNZ EQUFF
          MOV DPTR,#T_SONGS
          SJMP KA0NEXT
EQUFF:    INC A
          JNZ KA0S0GO
KA0NEXT:LCALL RYFSUP
          MOV CSN,R6
          LCALL CSNSDISN
          MOV A,DPL
          CLR C
          SUBB A,#02H
          JNC KA0NEXT1
          DEC DPH
KA0NEXT1: MOV DPL,A
          CLR REP0F
          CLR REP1F
          CLR REP2F
          CLR REP3F
          SETB NEXTSF
          SETB SECHSTOF
          RET
CASEB1:   CJNE A,#01H,CASEB2
          INC LDYDSR
          MOV A,LDYDSR
          CJNE A,#04H,LDYDSL4
          MOV LDYDSR,#00H
LDYDSL4:MOV DISNUM0,LDYDSR
          MOV DISNUM1,#26H
          RET

          HCOSPEEDN EQU 12H
CASEB2:   CJNE A,#02H,CASEB3
          MOV A,COSPEEDN
    CJNE A,#HCOSPEEDN,KA0NEXT4
KA0NEXT4: JNC KA0NEXT5
          INC COSPEEDN
KA0NEXT5: MOV SPENR,COSPEEDN
          LCALL SPENSDISN
          RET
CASEB3:   CJNE A,#03H,CASEB4
          CLR SPEEDF
          LCALL SPEEDCL
          RET
CASEB4:   CJNE A,#04H,CASEB5
          CLR TONEF
          LCALL TONECL
          RET
CASEB5:   CJNE A,#05H,CASEB6
          CPL LOCF
          JNB LOCF,KA0NEXT2
          MOV DISNUM0,#24H
          SJMP KA0NEXT3
KA0NEXT2: MOV DISNUM0,#25H
KA0NEXT3: MOV DISNUM1,#26H
          RET
CASEB6:   CJNE A,#06H,KA0RET
          CPL CUYFD
          JNB CUYFD,KA0NEXT6
          MOV DISNUM0,#24H
          SJMP KA0NEXT7
KA0NEXT6: MOV DISNUM0,#25H
KA0NEXT7: MOV DISNUM1,#28H
KA0RET:   RET
;22.速度数送显示寄存器
;---------SPENSDISN(22)----
SPENSDISN:MOV A,SPENR
          ANL A,#0FH
          MOV DISNUM0,A
          MOV A,SPENR
          SWAP A
          ANL A,#0FH
          MOV DISNUM1,A
          RET
;23.速度处理
;---------SPEEDCL(23)------
          HSPEEDEQU 02H;
          LSPEEDEQU 50H;
SPEEDCL:JBSPEEDF,DNSPEED
      CJNE R3,#HSPEED,SCLNEXT
SCLNEXT:JCSCLNEXT1
          DEC R3
          SJMP SCLNEXT1
DNSPEED:
CJNE R3,#LSPEED,SCLNEXT2
SCLNEXT2: JNC SCLNEXT1
          INC R3
SCLNEXT1: LCALL CSBESTOJG
      JNB CSBESTOF,SCLNEXT3
          INC R0
          INC R0
          MOV @R0,03H
SCLNEXT3: LCALL COSPECL
          MOV SPENR,R1
          LCALL SPENSDISN
          RET
;24.音调处理
;---------TONECL(24)---------
         ;LTONEEQU 00;C
          HTONEEQU 11;B
TONECL:   JBTONEF,DNTONE
      CJNE R2,#HTONE,TCLNEXT0
TCLNEXT0: JNC TCLNEXT
          INC R2
          SJMP TCLNEXT
DNTONE:   MOV A,R2
          JZTCLNEXT
          DEC R2
TCLNEXT:LCALL CSBESTOJG
      JNB CSBESTOF,TCLNEXT1
          INC R0
          MOV @R0,02H
TCLNEXT1: PUSH DPL
          PUSH DPH
          MOV DPTR,#T_TONDISC
          MOV A,R2
          RL A
          MOVC A,@A+DPTR
          MOV DISNUM1,A
          MOV A,R2
          RL A
          INC A
          MOVC A,@A+DPTR
          MOV DISNUM0,A
          POP DPH
          POP DPL
          RET
T_TONDISC:DW 200CH ; C
          DW 210CH ;#C
          DW 200DH ; D
          DW 210DH ;#D
          DW 200EH ; E
          DW 200FH ; F
          DW 210FH ;#F
          DW 2022H ; G
          DW 2122H ;#G
          DW 200AH ; A
          DW 210AH ;#A
          DW 200BH ; B
;25.KALT1键处理
;---------KALT1CL(25)--------
KALT1CL:MOV A,STATU
          JNZ CASE1
          LCALL CSBESTOJG
          JNB CSBESTOF,KA1NEXT
          MOV @R0,#00H
          DEC BUFF0
          SJMP KA1NEXT2
KA1NEXT: CJNE R0,#7EH,KA1NEXT1
KA1NEXT1: JNC KA1NEXT2
          MOV @R0,CSN
          INC R0
          MOV @R0,02H
          INC R0
          MOV @R0,03H
          INC BUFF0
KA1NEXT2: LCALL CSNSDISN
          SETB SECHSTOF
          RET
CASE1:    CJNE A,#01H,CASE2
          INC RDYDSR
          MOV A,RDYDSR
          CJNE A,#04H,RDYDSL4
          MOV RDYDSR,#00H
RDYDSL4:MOV DISNUM0,RDYDSR
          MOV DISNUM1,#27H
          RET
CASE2:    CJNE A,#02H,CASE3
          MOV A,COSPEEDN
          JZKA1NEXT5
          DEC COSPEEDN
KA1NEXT5: MOV SPENR,COSPEEDN
          LCALL SPENSDISN
          RET
CASE3:    CJNE A,#03H,CASE4
          SETB SPEEDF
          LCALL SPEEDCL
          RET
CASE4:    CJNE A,#04H,CASE5
          SETB TONEF
          LCALL TONECL
          RET
CASE5:    CJNE A,#05H,CASE6
          CPL ROCF
          JNB ROCF,KA1NEXT3
          MOV DISNUM0,#24H
          SJMP KA1NEXT4
KA1NEXT3: MOV DISNUM0,#25H
KA1NEXT4: MOV DISNUM1,#27H
          RET
CASE6:    CJNE A,#06H,KA1RET
          MOV DISNUM0,#23H
          MOV DISNUM1,#06H
KA1RET:   RET
;========= 乐曲表============
;---------SONGS--------------
T_SONGS:       乐曲表表首
dw 01ffh,;song1:xiao la ba...
   dw0b05h,
   dw2504h,
   dw2604h,
   dw2506h,
   dw0002h,
   dw2504h,
   dw2604h,
   dw2506h,
   dw0002h,
   dw2504h,
   dw2604h,
   dw2504h,
   dw2304h,
   dw2204h,
   dw2104h,
   dw2206h,

DW 16FFH;SONG16:Liang Zhi Lao Hu
   DW0715H
   DW0FF21H;REP21
   DW0FF01H;REP01
   DW2102H
   DW2202H
   DW2302H
   DW2102H
   DW0FF02H;REP02
   DW0FF03H;REP03
   DW2302H
   DW2402H
   DW2504H
   DW2302H
   DW2402H
   DW2504H
   DW0FF11H;REP11
   DW2501H
   DW2601H
   DW2501H
   DW2401H
   DW2302H
   DW2102H
   DW0FF12H;REP12
   DW0FF13H;REP13
   DW2202H
   DW1502H
   DW2104H
   DW2202H
   DW1502H
   DW2104H
   DW0FF22H;REP22
   DW0FF23H;REP23

   DW0000H;乐曲表表尾
          END
;=========END================
页: [1]
查看完整版本: 功能齐全的单片机音乐程序