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

📄 rem.asm

📁 10首儿歌音乐的程序源码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;****** MCU: HT48RA0A  ***  Remote 48KEY
; ** OSC:455K   T1= 4/455KHz = 8.79121 uS       CARRY:38K
; ** WDT:ENABLE  ; PA: NMOS OUT ;  PB: WAKE-UP INPUT ;   PC0:CARRY OUT  ;

; System memory map ==  #include ht48ra0.inc
IAR	EQU	[00H]                      ; Indirect addressing register
MP	EQU	[01H]                      ; Data Memory point
ACC	EQU	[05H]                      ; Accumulator
PCL	EQU	[06H]                      ; Program Counter Lower-order
TBLP	EQU	[07H]                  ; Table Pointer
TBLH	EQU	[08H]                  ; Table Higher-order byte
STATUS	EQU	[0AH]                  ; Micro controll status
PA	EQU	[012H]             		   ; PA I/O register
PB	EQU	[014H]             		   ; PB I/O register
PC	EQU	[016H]                     ; PC Output register
; --- System FLAG define ---
STA_C	EQU	[0AH].0                ; C Flag
STA_AC	EQU	[0AH].1
STA_Z	EQU	[0AH].2                ; ZERO Flag
STA_OV	EQU	[0AH].3
STA_PDF	EQU	[0AH].4
STA_TO	EQU	[0AH].5
SPK	EQU	[012H].0
PA1	EQU	[012H].1
PA2	EQU	[012H].2
PA3	EQU	[012H].3
PA4	EQU	[012H].4
PA5	EQU	[012H].5
PA6	EQU	[012H].6
PA7	EQU	[012H].7
PB0	EQU	[014H].0
PB1	EQU	[014H].1
PB2	EQU	[014H].2
PB3	EQU	[014H].3
PB4	EQU	[014H].4
PB5	EQU	[014H].5
PB6	EQU	[014H].6
PB7	EQU	[014H].7
REM	EQU	[016H].0                   ; Carry Output Port
STA_RAM EQU       20H              ; HT48RA0A RAM 20H-3FH
NOP2    EQU     JMP  $+1           ; Long NOP Define = NOP+NOP
   ; --- Temp RAM ---
RAMA    EQU     [26H]              ; WORK Temp Register
RAMB    EQU     [27H]
RAMC    EQU     [28H]
RAMD    EQU     [29H]
SCANSTEP   EQU     [2AH]           ; Scan Key Colummn Step Number
PREKEY     EQU     [2BH]           ; Save Previous Key Number
NOWKEY     EQU     [2CH]           ; Scan Key Number
PBVALUE    EQU     [2DH]           ; Read on column value to PBVALUE
KDTIME     EQU     [2EH]           ; Key Debounce Check Times
NKDTIME    EQU     [2FH]           ; Key Release Confirm Times
PASTEP     EQU     [3EH]           ; PA Temp register
SendBIT    EQU     [31H].1         ; VALIDITY KEY Flag
ReckeyBIT  EQU     [32H].1         ; Check Column Multi_Key Flag
REPEATBIT  EQU     [33H].1         ; REPEAT KEY Flag
MultiBIT   EQU     [34H].1         ; INVALID KEY Flag
LSBITA     EQU     [32H].4
LSBITB     EQU     [33H].4
   ; --- Music  RAM ---
RAMR       EQU     [3AH]
RAMS       EQU     [3BH]
RAMT       EQU     [3CH] 
RAMLS      EQU     [3DH] 
   ; --- M3010 SEND RAM ---
REM_DATCODE    EQU    [36H]        ; M3010 6BIT DATA CODE --- KEY DATA CODE
REM_SYSCODE    EQU    [37H]        ; M3010 5BIT SYS  CODE --- CUSTOMER CODE
CONBIT_DAT     EQU    [38H]        ; 110 OR 111 SAVE CONTROL BIT FLAG
MUSICTIM       EQU    [39H]        ; Choose what music
RAMWA          EQU    [25H]

;;====================================================================
;@========================= Main Program =============================
;;====================================================================
MAINCODE  .SECTION    'CODE'
        ORG     00H
        JMP     MAIN
MAIN:
         CLR     WDT
         MOV     A,11111110B
         MOV     PA,A              ; PA.0=0   CLR SPK         
        CLR     PASTEP             ; TEMP TO PA SCAN KEY
        SET     PB                 ; PB: WAKE-UP INPUT PB=FF
        MOV     A,11111111B        ; PC0:  O  PULL-HIGH
        MOV     PC,A               ; REM=PC.0
     ;=== Clear RAM ( HT-48RA0A : 20H-3FH ) ===
CLEAR_RAM:
        MOV     A,STA_RAM          ; RAM Start Address
        MOV     MP,A
        MOV     A,032D             ; Amount of RAM 20H-3FH =32
CLEAR_RAM_1:
        CLR     IAR                ; 5X30=150
        INC     MP
        SDZ     ACC                ; A-1=0?
        JMP     CLEAR_RAM_1        ; A<>0
        CLR     SCANSTEP           ; T1=455KHz /4 = 8.79 uS
     ;=== Polling System Event ===
POLLING_EVENT:                     ; Anjian is > TV hujiao             
         CLR     WDT
         SET     PB                ; PB0=0 ? Hujiao ?         
         MOV     A,PB                 
         SNZ     ACC.0 
         JMP     REMCALL           ; PB0=0,Hujiao   
 YWAKE:                            ; Anjian wake ?
     CLR     SPK                   ; STOP  SPK=PA0                   
     CLR     PA1                   ; OFFSET TV Call Vcc
     CALL    SCAN_KEY_MATRIX       ; SCAN KEY PROCEDURE
     CALL    F_DELAY               ; TIME DELAY PROCEDURE
     CALL    SEND_REMOTE_CODE      ; SEND CODE PROCEDURE
     SZ      MultiBIT              ; Check Invalid Key
     JMP     POLLING_EVENT         ; <>0
     SZ      SENDBIT               ; =0 Check Validity Key
     JMP     POLLING_EVENT         ; <>0 FA
     SZ      NOWKEY                ; =0 Check NO Key Press
     JMP     POLLING_EVENT         ; <>0
  SLEEP:                           ; =0
     CLR     PA                    ; NMOS OUTPUT = Ready WakeUp Low Level,SPK=0
     HALT                          ; System Halt  PB=WAKEUP INPUT
     JMP     POLLING_EVENT         ; Any Key WakeUp
   
     ;===  Scan 64 Key Matrix (8x8) ===
SCAN_KEY_MATRIX:                   ; Anjian No PA7 & PB5
          ; = READ KEY PROCEDURE =
        CLR     WDT
        CLR     NOWKEY             ; THIS LUN KEYNUM=00H
        CLR     ReckeyBIT          ; REC KEY BIT=0
        CLR     SCANSTEP           ; THIS LUN SCAN 8 LIE PA=1111 1110 RL8
        CLR     MultiBIT           ; MULTI KEY BIT=0        
        MOV     A,01111111B        ; PA LSTEM RL8
        MOV     PASTEP,A
 NEXT_COLUMN:
        RLA     PASTEP             ; 1111 1110--STEP
        MOV     PASTEP,A
         CLR     ACC.0             ; PA0=SPK=0(ALL TIMES)
        MOV     PA,A               ; Scan Column PA PORT OUTPUT       
        CLR     WDT
        SET     PB                 ; PB=FF SET PB0,PB1 Pull-Up
        MOV     A,PB               ; Read on column value to PBVALUE
         SET     ACC.0             ; PB0=1 Anjian no pb0
        MOV     PBVALUE,A          ; SAVE AS PBVALUE
        MOV     A,001D
        MOV     RAMB,A             ; KEY CAL LSRAM
        MOV     A,11111110B
        MOV     RAMA,A             ; KEY CAL LSRAM
        MOV     A,PBVALUE          ; READ PB KEY-This column value to ACC
       SNZ     PBVALUE.7
       JMP     KEY_ROW_7
        SNZ     PBVALUE.6
        JMP     KEY_ROW_6
       SNZ     PBVALUE.5
       JMP     KEY_ROW_5
        SNZ     PBVALUE.4
        JMP     KEY_ROW_4
       SNZ     PBVALUE.3
       JMP     KEY_ROW_3
        SNZ     PBVALUE.2
        JMP     KEY_ROW_2
       SNZ     PBVALUE.1
       JMP     KEY_ROW_1
        SNZ     PBVALUE.0
        JMP     KEY_ROW_0
        NOP2                       ; =JMP $+1    2 T1
        CLR       WDT
        JMP     COL_WITHOUT_KEY    ; THIS LUN PB=1111 1111 NOKEY
      KEY_ROW_7:
        RL      RAMA               ; RAMA TO END IS "01111111b"
        INC     RAMB               ; KEY NUM CAL
      KEY_ROW_6:
        RL      RAMA               ; RAMA TO END IS "10111111b"
        INC     RAMB
      KEY_ROW_5:
        RL      RAMA               ; RAMA TO END IS "11011111b"
        INC     RAMB
      KEY_ROW_4:
        RL      RAMA               ; RAMA TO END IS "11101111b"
        INC     RAMB
      KEY_ROW_3:
        RL      RAMA               ; RAMA TO END IS "11110111b"
        INC     RAMB
      KEY_ROW_2:
        RL      RAMA               ; RAMA TO END IS "11111011b"
        INC     RAMB
      KEY_ROW_1:
        RL      RAMA               ; RAMA TO END IS "11111101b"
        INC     RAMB
      KEY_ROW_0:
        XOR     A,RAMA             ; Check HANG HANG HANG Multi-Key FOR EX PB=1010 1111 2KEY
        SZ      STA_Z              ; PBVALUE=RAMA ?
        JMP     COL_WITH_KEY       ; =  IS 1KEY
    COL_ERROR_KEY:
        SET     MultiBIT           ; = IS 2-8 KEY

    COL_WITHOUT_KEY:
        NOP2
        NOP2
        NOP2                       ; TIMES DELAY
        JMP     READY_2_NEXT_COLUMN
    COL_WITH_KEY:
        RLA     SCANSTEP           ; \ KEYNUM CAL K1-K64 TO A
        RL      ACC                ; > SCANSTEP * 8 --> ACC
        RL      ACC                ; /
        ADD     A,RAMB
        MOV     NOWKEY,A           ; KEY NUM CAL OVER K1-K64
        SZ      ReckeyBIT          ; CHECK LIE LIE LIE Multi-Key REC KEY BIT=0 ? FOR EX K1\K9 KNOB
        SET     MultiBIT           ; <>0 DUO TIMES
        SET     ReckeyBIT          ; =0 ONE TIME REV NO KEY
  READY_2_NEXT_COLUMN:
        INC     SCANSTEP           ; THIS LUN=8LIE  PA RL8
        MOV     A,SCANSTEP
        XOR     A,008D
        SNZ      STA_Z
        JMP     NEXT_COLUMN        ; A=1-7
        CLR       WDT                        ; A=8 THIS LUN OVER
      ; === Scan Key Complete, Check key valid ? ===
CHECK_KEY_ACTIVE:
        CLR     WDT
        SZ      NOWKEY             ; If NOWKEY = 00H, invalid key
        JMP     VALID_KEY_CHK      ; <>0 YES KEY
        JMP     INVALID_KEY_CHK    ; =0 NO KEY
   VALID_KEY_CHK:
        SZ      PREKEY             ; Check New Key ?
        JMP     VALID_KEYC_PRO     ; OLD KEY
        JMP     KEY_DEB            ; NEW KEY PREKEY=0 CONFIRM 6 TIMES TO PREKEY=0FFH
   VALID_KEYC_PRO:
        MOV     A,NOWKEY           ; OLD KEY
        XOR     A,PREKEY           ; Check Repeat key
        SNZ      STA_Z
        JMP     VALID_SEND_KEY     ; OLD KEY <> NEWKEY
   VALID_RPSEND_KEY:               ; OLD KEY = NEWKEY <> 0
        SNZ     MultiBIT           ; Check Multi-Key Clear NOWKEY
        JMP     REPEAT_KEY         ; (Multibit=0) & (OLD KEY = NEWKEY <> 0) REPEAT KEY
        CLR     NOWKEY             ; (Multibit=1) & (OLD KEY = NEWKEY <> 0)  DOU KEYS
        RET

   REPEAT_KEY:
        SET     RepeatBIT          ; SET Repeat Flag
        NOP2
        JMP     SET_VALIDFG
   VALID_SEND_KEY:                 ; OLD KEY <> NEWKEY <> 0
        MOV     A,PREKEY
        XOR     A,0FFH             ; Check Debounce END
        SNZ     STA_Z
        JMP     CHANG_KEY
        CLR     RepeatBIT          ; PREKEY=OFFH IS 6 TIMES CONFIRM NEWKEY
        MOV     A,NOWKEY
        MOV     PREKEY,A           ; PREKEY = NOWKEY  NEW KEYCODE SEND
   SET_VALIDFG:
        SET     SENDBIT            ; SEND FLAG
        RET

   CHANG_KEY:                      ; (OLD KEY <> NEWKEY <> 0) & (OLD KEY<>0FFH)
        CLR     KDTIME             ; ONE KEY AND ANOTHER KEY - CHUAN KEY
        JMP     RKEY_PRO           ; INVAILD KEY,CLR KD-TIME
   INVALID_KEY_CHK:
        CLR     KDTIME             ; NO KEY is  RL8 PB ALL=1111 1111  -NKDTIME=5TIME
   RKEY_PRO:
        INC     NKDTIME            ; AT 5 RL8 LUN CAN CONFIM NO KEY
        MOV     A,NKDTIME
        XOR     A,005D
        SNZ     STA_Z
        JMP     SCAN_KEY_MATRIX    ; <>5 CLR ALL , NEW SCAN-KEY
        DEC     NKDTIME            ; =5 TIME -1  FOR (OLD KEY <> NEWKEY <> 0) & (OLD KEY<>0FFH)
   NO_KEY_PROC:                    ; UP: FOR (ONE KEY AND ANOTHER KEY - CHUAN KEY) / (NO KEY)
        CLR     SENDBIT            ; NO SENDBIT
        NOP2
        NOP2
        CLR     WDT
        MOV     A,NOWKEY           ; EXIT_INVALID_KEY: Clear PREKEY
        MOV     PREKEY,A           ; NO KEY NOWKEY=0
        NOP2
        RET

   KEY_DEB:                        ; NOWKEY<>0,PREVKEY=0     NEWKEY
        INC     KDTIME             ; Check Key Debounce  T1=455KHz/4=116480Hz = 8.79us
        MOV     A,KDTIME
        XOR     A,6
        SNZ     STA_Z
        JMP     SCAN_KEY_MATRIX    ; KDTIME<>6,CLR ALL - SCAN-KEY
        MOV     A,0FFH             ; SAVE KEY Debounce Check END
        MOV     PREKEY,A           ; 0FFH to PREKEY -- SCAN-KEY
        JMP     SCAN_KEY_MATRIX

     ; === TIME DELAY PROCEDURE  Delay 10*ACC+5 Instruction Cycle  ===
F_DELAY:
        SZ      KDTIME
        JMP     NEWK_D             ; KD-TIME <> 0
        MOV     A,NKDTIME          ; KD-TIME=0 Release Confirm time offset delay
        MOV     RAMD,A
    BLANK_DELAY_00:
        INC     RAMD
        MOV     A,RAMD             ; NKDTIME=5 ?
        XOR     A,005D
        SZ      STA_Z
        JMP     BLANK_DELAY_010    ; =5
        MOV     A,154D             ; <>5    ORIGIN=155D 
    BLANK_DELAY_01:
        SDZ     ACC
        JMP     BLANK_DELAY_01     ; DELAY
        CLR     WDT
        JMP     BLANK_DELAY_00
    BLANK_DELAY_010:               ; NKDTIME=5
        CLR     NKDTIME            ; NKDTIME=0
        MOV     A,1                ; OFFSET TIME DELAY
        MOV     RAMD,A
    BLANK_DELAY_02:
        MOV     A,037D
    BLANK_DELAY_03:
        CLR     WDT
        SDZ     ACC
        JMP     BLANK_DELAY_03
        SDZ     RAMD
        JMP     BLANK_DELAY_02

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -