|          |    功能齐全的单片机音乐程序 文章长度[ ] 加入时间[ 2007/7/14]  更新时间[ 2025/10/30 11:06:27] 级别[ 0] [ 评论] [ 收藏]  单片机最小系统,两位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 ;============================ 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           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           JB  NEXTSF,PRET           MOV A,JPCLK           CJNE A,01H,PNEXT PNEXT:    JC  PDELAY           DJNZ R7,PJPWAIT PRET:     CLR TR0           RET ;---------TABSD------------- T_SD:     DB  01h  ;useless           DB  01H           DB  03H           DB  05H           DB  06H           DB  08H           DB  0AH           DB  0CH           DB  02H           DB  04H           DB  07H           DB  09H           DB  0bH ;---------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           JZ  COSPRET           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           JB  SET,CSETRET           MOV GENCLK,#00H SETLOP:   MOV A,GENCLK           CJNE A,#02,SETLOP           SETB SET           JB  SET,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           JB  ALT0,CALT0RET           MOV GENCLK,#00H ALT0LOP:  MOV A,GENCLK           CJNE A,#02,ALT0LOP           SETB ALT0           JB  ALT0,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           JB  ALT1,CALT1RET           MOV GENCLK,#00H ALT1LOP:  MOV A,GENCLK           CJNE A,#02,ALT1LOP           SETB ALT1           JB  ALT1,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 KA0S0GO:  INC 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)------           HSPEED  EQU 02H;           LSPEED  EQU 50H; SPEEDCL:  JB  SPEEDF,DNSPEED       CJNE R3,#HSPEED,SCLNEXT SCLNEXT:  JC  SCLNEXT1           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)---------          ;LTONE  EQU 00  ;C           HTONE  EQU 11  ;B TONECL:   JB  TONEF,DNTONE       CJNE R2,#HTONE,TCLNEXT0 TCLNEXT0: JNC TCLNEXT           INC R2           SJMP TCLNEXT DNTONE:   MOV A,R2           JZ  TCLNEXT           DEC R2 TCLNEXT:  LCALL CSBESTOJG         JNB CSBESTOF,TCLNEXT1           INC R0           MOV @R0,02H TCLNEXT1: PUSH DPL           PUSH DPH           MOV DPTR,#T_TONDISC           MOV A,ROV 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           JZ  KA1NEXT5           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...      dw  0b05h,      dw  2504h,      dw  2604h,      dw  2506h,      dw  0002h,      dw  2504h,      dw  2604h,      dw  2506h,      dw  0002h,      dw  2504h,      dw  2604h,      dw  2504h,      dw  2304h,      dw  2204h,      dw  2104h,      dw  2206h,
  DW 16FFH;SONG16:Liang Zhi Lao Hu      DW  0715H      DW  0FF21H  ;REP21      DW  0FF01H  ;REP01      DW  2102H      DW  2202H      DW  2302H      DW  2102H      DW  0FF02H  ;REP02      DW  0FF03H  ;REP03      DW  2302H      DW  2402H      DW  2504H      DW  2302H      DW  2402H      DW  2504H      DW  0FF11H  ;REP11      DW  2501H      DW  2601H      DW  2501H      DW  2401H      DW  2302H      DW  2102H      DW  0FF12H  ;REP12      DW  0FF13H  ;REP13      DW  2202H      DW  1502H      DW  2104H      DW  2202H      DW  1502H      DW  2104H      DW  0FF22H  ;REP22      DW  0FF23H  ;REP23
       DW  0000H  ;乐曲表表尾           END ;=========END================ 注:设计者手头有近40首曲子的音乐数据(花了大量时间对简谱进行手工转换!),而每块 AT89C51的4KROM种除指令外剩下空间只可放14首左右。     这里给出第一曲和第16曲《两只老虎》作一示例。
 
 
 
  (文章推荐人:电池)
 
 2           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           JZ  KA1NEXT5           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...      dw  0b05h,      dw  2504h,      dw  2604h,      dw  2506h,      dw  0002h,      dw  2504h,      dw  2604h,      dw  2506h,      dw  0002h,      dw  2504h,      dw  2604h,      dw  2504h,      dw  2304h,      dw  2204h,      dw  2104h,      dw  2206h, DW 16FFH;SONG16:Liang Zhi Lao Hu      DW  0715H      DW  0FF21H  ;REP21      DW  0FF01H  ;REP01      DW  2102H      DW  2202H      DW  2302H      DW  2102H      DW  0FF02H  ;REP02      DW  0FF03H  ;REP03      DW  2302H      DW  2402H      DW  2504H      DW  2302H      DW  2402H      DW  2504H      DW  0FF11H  ;REP11      DW  2501H      DW  2601H      DW  2501H      DW  2401H      DW  2302H      DW  2102H      DW  0FF12H  ;REP12      DW  0FF13H  ;REP13      DW  2202H      DW  1502H      DW  2104H      DW  2202H      DW  1502H      DW  2104H      DW  0FF22H  ;REP22      DW  0FF23H  ;REP23      DW  0000H  ;乐曲表表尾           END ;=========END================ 注:设计者手头有近40首曲子的音乐数据(花了大量时间对简谱进行手工转换!),而每块 AT89C51的4KROM种除指令外剩下空间只可放14首左右。     这里给出第一曲和第16曲《两只老虎》作一示例。 (文章推荐人:电池)  1、  本站不保证以上观点正确,就算是本站原创作品,本站也不保证内容正确。  2、如果您拥有本文版权,并且不想在本站转载,请书面通知本站立即删除并且向您公开道歉!  |