⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yinyue.asm

📁 单片机最小系统
💻 ASM
📖 第 1 页 / 共 2 页
字号:
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 + -