?? rem.asm
字號:
;****** 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 + -