HT48CA0 APPLICATION NOTE
. Application Circuit
.Working Register Define
;*****************************************************
;@***** Filename : SAMPLE.ASM (Remote 64KEY) ******
;@************** OSC:455KHz CARRY:38KHz ***********
;@****************** HT48CA0 ******************
;;*****************************************************
;;***** System memory Map *****
M_INDIRECT1 equ [00h] ;Indirect addressing register
M_MP0 equ [01h] ;Data Memory point
M_ACC equ [05h] ;Accumulator
M_PCL equ [06h] ;Program Counter Lower-order
M_TBLP equ [07h] ;Table Pointer
M_TBLH equ [08h] ;Table Higher-order byte
M_STATUS equ [0ah] ;Micro controll status
PORT_A equ [12h] ;PA I/O register
PORT_B equ [14h] ;PB I/O register
VDD
VDD
0.1u
1
K1
240
1
D1 D2
K2
K3
K4
K5
K6
K7
K8
K9
K10
K11
K12
K13
K14
K15
K16
K17
K18
K19
K20
K21
K22
K23
K24
K25
K26
K27
K28
K29
K30
K31
K32
K33
K34
K35
K36
K37
K38
K39
K40
K41
K42
K43
K44
K45
K46
K47
K48
K49
K50
K51
K52
K53
K54
K55
K56
K57
K58
K59
K60
K61
K62
K63
K64
HOLTEK HT48CA0 (64KEY)
Q1 Q2
P
A
1
P
A
0
P
B
1
P
B
0
P
C
0
V
D
D
O
SC
2
O
SC
1
V
S
S
R
E
S
B
N
C
N
C
P
A
2
P
A
3
P
A
4
P
A
5
P
A
6
P
A
7
P
B
2
P
B
3
P
B
4
P
B
5
P
B
6
P
B
7
H
T
48
C
A
0
U
1
1 32 4 5 76 8 9
10 11 12
131415161718192021222324
0.1u
455KHz
300P 300P
.
1
2
1 2
100uF
1
2
1
2
12
1
2
1
2
1
2
1
2
PORT_C equ [16h] ;PC Output register
PORT_AC equ [3Eh] ;PA Temp register
;-----------------------------------
;;--- System FLAG define ---
#define fg_CF M_STATUS.0 ;CARRY Flag
#define fg_ZF M_STATUS.2 ;ZERO Flag
;;--- I/O Pin define ---
#define pn_IR PORT_C.0 ;Carry Output Port
;;--- Address Define ---
#define DATA_RAM 20h ;HT48CA0
;;--- Instruction Define ---
#define NOP2 JMP $+1 ;Long NOP Define
;@------------------------------------------------
SAMPLE .SECTION 'DATA'
;; --- Temp RAM ---
a_SR10 DB ? ;;WORK Temp Register
a_SR11 DB ? ;;
a_SR12 DB ? ;;
a_SR13 DB ? ;;
;;--------- Program RAM --------
a_SCAN_STEP DB ? ;;Scan Key Colummn Step Number
a_PREV_KEY DB ? ;;Save Previous Key Number
a_KEY_NUM DB ? ;;Scan Key Number
a_COL_VALUE DB ? ;;Read on column value to a_COL_VALUE
KD_TEMP DB ? ;;Key Debounce Check Times
NKD_TEMP DB ? ;;Key Release Confirm Times
;;--- User FLAG define ---
fg_SendActive DBIT ;;VALIDITY KEY Flag
fg_PressRec DBIT ;;Check Column Multi_Key Flag
fg_REPEAT DBIT ;;REPEAT KEY Flag
fg_Multi_Key DBIT ;;INVALID KEY Flag
START
INITIATE
DATA
SCAN KEY
fg_Multi_Key
=1
SEND CODE
HALT
HT48CA0 REMOTE CONTROL FLOWCHART
NO
fg_SendActive
=1
NO
YES
YES
Any Key
WakeUp
CHECK
INVALID KEY
CHECK
NO KEY PRESS KEY_NUM
=0
YES
NO
CHECK
VALIDITY KEY
TIME DELAY
PROCESS
KEY_NUM
=0
KEY_NUM
=a_PREV_KEY
SET
fg_SendActive
CLR fg_REPEAT
a_PREV_KEY=
KEY_NUM
SCAN KEY
READ
KEY
fg_Multi_key
=1
KD_TEMP
=6
NKD_TEMP
=5
RETURN
YES
NO
NO
YES
NO
YES
YES
NO
YES
NO
SCAN KEY PROCEDURE FLOWCHART
CHECK
INVALID KEY
SET
VALIDITY KEY
CHECK
NO KEY PRESS
Release
Confirm
Debounce
Check
INC KD_TEMP INC NKD_TEMP
SET
fg_REPEAT
SET
REPEAT KEY
a_PREV_KEY
=0
a_PREV_KEY
=0
YES
NO
Check
Change
Key
KEY_NUM
=0
New Key
Initiate
New Key
Press
INITIATE
fg_PressRec
fg_Multi_Key
KEY_NUM=0
PORT_A
=11111110B
SCAN_STEP=1
READ
PORT_B
NO KEY
PRESS
Multi-KEY
PRESS
fg_PressRec
=1
SET
fg_PressRec
KEY NUMBER
PROCESS
SCAN_STEP
=8
END READ KEY
SET
fg_Multi_Key
INC SCAN_STEP
RL PORT_A
READ KEY PROCEDURE FLOWCHART
READ KEY
YES
NO
NO
YES
YES
NO
NO
YES
64 KEY Matrix (8x8)
-----------------------
8 ROW
8 COLUMN
Check ROW
Multi-key
Check Column
Multi-key
SET
INVALID KEY
. Main Program
;;====================================================================
;@========================= Main Program =============================
;;====================================================================
SAMPLE_CODE .SECTION 'CODE'
org 00h
MAIN:
;------------------------------------------
clr WDT
;@ ===== Initial Port =====
;; +--------- PB7: O PULL-HIGH
;; |+-------- PB6: O PULL-HIGH
;; ||+------- PB5: O PULL-HIGH
;; |||+------ PB4: O PULL-HIGH
;; ||||+----- PB3: O PULL-HIGH
TIME DELAY
NKD_TEMP
=5
SCAN TIME
DELAY
OFFSET TIME
DELAY
CLR NKD_TEMP
RETURN
TIME DELAY PROCEDURE FLOWCHART
YES
NO
INC NKD_TEMP
KD_TEMP
=0
CLR KD_TEMP
YES
NO
NEW KEY NO
TIME OFFSET DELAY
Release Confirm
Time Offset Delay
;; |||||+---- PB2: O PULL-HIGH
;; ||||||+--- PB1: O PULL-HIGH
;; |||||||+-- PB0: O PULL-HIGH
set PORT_A
clr PORT_AC
;; +--------- PA7: WAKE-UP I PULL-HIGH
;; |+-------- PA6: WAKE-UP I PULL-HIGH
;; ||+------- PA5: WAKE-UP I PULL-HIGH
;; |||+------ PA4: WAKE-UP I PULL-HIGH
;; ||||+----- PA3: WAKE-UP I PULL-HIGH
;; |||||+---- PA2: WAKE-UP I PULL-HIGH
;; ||||||+--- PA1: WAKE-UP I PULL-HIGH
;; |||||||+-- PA0: WAKE-UP I PULL-HIGH
set PORT_B
;; +-- PC0: O PULL-HIGH
mov A,11111111b
mov PORT_C,A
;@===== Clear RAM ( HT-48CA0 : 20h-3Fh ) =====
CLEAR_RAM:
mov A,DATA_RAM ;; 1. RAM Start Address
mov M_MP0,A ;;
mov A,032d ;; 2. Amount of RAM
CLEAR_RAM_1: ;;
clr M_INDIRECT1 ;;
inc M_MP0 ;;
SDZ M_ACC ;;
JMP CLEAR_RAM_1 ;;
CLEAR_RAM_END: ;;
;@----- Default RAM value -----
DEFAULT_RAM:
clr a_SCAN_STEP
;T1=455KHz /4 = 8.79 uS
;;%%%%%%%%%%%%%%%%%%%%%%%%%% Main Prog. Array %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
START_MAIN_PROC:
;@*********** Polling System Event ***********
POLLING_EVENT:
CALL SCAN_KEY_MATRIX ;SCAN KEY PROCEDURE
CALL F_DELAY ;TIME DELAY PROCEDURE
CALL SEND_REMOTE_CODE ;SEND CODE PROCEDURE
SZ fg_Multi_Key ;Check Invalid Key
JMP POLLING_EVENT ;
SZ fg_SendActive ;Check Validity Key
JMP POLLING_EVENT ;
SZ a_KEY_NUM ;Check NO Key Press
JMP POLLING_EVENT ;
SLEEP:
clr PORT_A ;Ready WakeUp Low Level
halt ;System Halt
JMP POLLING_EVENT ;Any Key WakeUp
;;%%%%%%%%%%%%%%%%%%%%%%%%%% Subroutine Array %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;@************* SUBROUTINE[xx]: Scan 64 Key Matrix (8x8) ************
SCAN_KEY_MATRIX:
;;--- READ KEY PROCEDURE ---
clr wdt ;;Initiate Process
clr a_KEY_NUM ;
clr fg_PressRec ;
clr a_SCAN_STEP ;
clr fg_Multi_Key ;
mov A,01111111b ;
mov PORT_AC,A ;
NEXT_COLUMN:
rlA PORT_AC ;
mov PORT_A,A ;Scan Column PA PORT OUTPUT
mov PORT_AC,A ;
NOP ;
;;--- READ PB PORT ---
SET PORT_B ;;SET PB0,PB1 Pull-Up
MOV A,PORT_B ;;Read on column value to a_COL_VALUE
mov a_COL_VALUE,A ;;
mov A,001d
mov a_SR11,A
mov A,11111110b ;;
mov a_SR10,A
mov A,a_COL_VALUE ;; This column value to ACC
SNZ a_COL_VALUE.7
JMP KEY_ROW_7
SNZ a_COL_VALUE.6
JMP KEY_ROW_6
SNZ a_COL_VALUE.5
JMP KEY_ROW_5
SNZ a_COL_VALUE.4
JMP KEY_ROW_4
SNZ a_COL_VALUE.3
JMP KEY_ROW_3
SNZ a_COL_VALUE.2
JMP KEY_ROW_2
SNZ a_COL_VALUE.1
JMP KEY_ROW_1
SNZ a_COL_VALUE.0
JMP KEY_ROW_0
NOP2
nop
JMP COL_WITHOUT_KEY
KEY_ROW_7:
rl a_SR10 ;; a_SR10 rotate to "01111111b"
inc a_SR11
KEY_ROW_6:
rl a_SR10 ;; a_SR10 rotate to "10111111b"
inc a_SR11
KEY_ROW_5:
rl a_SR10 ;; a_SR10 rotate to "11011111b"
inc a_SR11
KEY_ROW_4:
rl a_SR10 ;; a_SR10 rotate to "11101111b"
inc a_SR11
KEY_ROW_3:
rl a_SR10 ;; a_SR10 rotate to "11110111b"
inc a_SR11
KEY_ROW_2:
rl a_SR10 ;; a_SR10 rotate to "11111011b"
inc a_SR11
KEY_ROW_1:
rl a_SR10 ;; a_SR10 rotate to "11111101b"
inc a_SR11
KEY_ROW_0:
xor A,a_SR10 ;;Check ROW Multi-Key
SZ fg_ZF
JMP COL_WITH_KEY
COL_ERROR_KEY:
set fg_Multi_Key
COL_WITHOUT_KEY:
NOP2
NOP2
NOP2
JMP READY_2_NEXT_COLUMN
COL_WITH_KEY: ;;KEY NUMBER PROCESS
rlA a_SCAN_STEP ;;\
rl M_ACC ;; > a_SCAN_STEP * 8 --> ACC
rl M_ACC ;;/
add A,a_SR11 ;;
mov a_KEY_NUM,A ;;
SZ fg_PressRec ;;Check Column Multi-Key
set fg_Multi_Key ;;
set fg_PressRec ;;
READY_2_NEXT_COLUMN:
inc a_SCAN_STEP
mov A,a_SCAN_STEP
xor A,008d
SNZ fg_ZF
JMP NEXT_COLUMN
nop
READ_KEY_COMPLETE:
;@************* SUBROUTINE[xx]: Check Key Active ************
;@--- Scan Key Complete, Check key valid ? ---
CHECK_KEY_ACTIVE:
clr wdt
SZ a_KEY_NUM ;;If a_KEY_NUM = ffh, invalid key
JMP VALID_KEY_CHK
JMP INVALID_KEY_CHK
;@--------------------------
VALID_KEY_CHK:
SZ a_PREV_KEY ;;Check New Key
JMP VALID_KEYC_PRO
JMP KEY_DEB
VALID_KEYC_PRO:
mov A,a_KEY_NUM
xor A,a_PREV_KEY ;; Check Repeat key
SNZ fg_ZF
JMP VALID_SEND_KEY
;;----------------------------
VALID_RPSEND_KEY:
snz fg_Multi_key ;Check Multi-Key Clear a_KEY_NUM
JMP REPEAT_KEY
clr a_KEY_NUM
ret
REPEAT_KEY:
SET fg_REPEAT ;;SET Repeat Flag
NOP2
JMP SET_VALIDFG
VALID_SEND_KEY:
mov a,a_PREV_KEY ;;Check Change Key
XOR A,0FFH ;;Check Debounce END
SNZ fg_ZF
JMP CHANG_KEY
;;--- NEW KEY Initiate
CLR fg_REPEAT
mov a,a_KEY_NUM
mov a_PREV_KEY,a
;;--- SET VALIDITY KEY
SET_VALIDFG:
SET fg_SendActive
ret
CHANG_KEY:
CLR KD_TEMP
JMP RKEY_PRO
;@----------------------------
INVALID_KEY_CHK:
CLR KD_TEMP
RKEY_PRO: ;Release Key Confirm
INC NKD_TEMP
MOV A,NKD_TEMP
XOR A,5
SNZ fg_ZF
JMP SCAN_KEY_MATRIX
DEC NKD_TEMP ;
NO_KEY_PROC:
clr fg_SendActive
NOP2
NOP2
NOP
EXIT_INVALID_KEY:
mov a,a_KEY_NUM ;Clear a_PREV_KEY
mov a_PREV_KEY,a
NOP2
ret
KEY_DEB: ;T1=455KHz/4=116480Hz = 8.79us
;Check Key Debounce
INC KD_TEMP
MOV A,KD_TEMP
XOR A,6
SNZ fg_ZF
JMP SCAN_KEY_MATRIX
MOV A,0FFH ;SAVE KEY Debounce Check END
MOV a_PREV_KEY,A ;0FFH to a_PREV_KEY
JMP SCAN_KEY_MATRIX
;@********** SubRoutine[xx]: Delay 10*ACC+5 Instruction Cycle **********
;;--- TIME DELAY PROCEDURE ---
F_DELAY:
SZ KD_TEMP
JMP NEWK_D
MOV A,NKD_TEMP ;Release Confirm time offset delay
mov a_SR13,A
BLANK_DELAY_00:
INC a_SR13
MOV A,a_SR13
XOR A,5
SZ fg_ZF
JMP BLANK_DELAY_010
mov A,155d
BLANK_DELAY_01:
SDZ M_ACC
JMP BLANK_DELAY_01
clr wdt
JMP BLANK_DELAY_00
BLANK_DELAY_010:
CLR NKD_TEMP
MOV a,1 ;OFFSET TIME DELAY
mov a_SR13,A
BLANK_DELAY_02:
mov A,37d
BLANK_DELAY_03:
clr wdt
SDZ M_ACC
JMP BLANK_DELAY_03
SDZ a_SR13
JMP BLANK_DELAY_02
RET
NEWK_D: ;;New Key No Time Offset Delay
CLR KD_TEMP
RET
;;---------------------------------------
;@************* SUBROUTINE[xx]: Send Remote Code ************
SEND_REMOTE_CODE:
clr WDT
SZ fg_SendActive
JMP READY_SEND
ret
READY_SEND:
; REMOTE CODE SEND & DATA FRAME DELAY TIME OFFSET
;
ret
;;************************** End of program *********************************
END
SEND CODE
fg_SendActive
=0
READ KEY
TABLE
READ
CUSTOMER CODE
a_REM_CODE
=ffH
Send
Lead Code
fg_REPEAT
=0
Send
Customer Code
Send
Data Code
RETURN
Send
Repeat Code
Frame Delay
Time
Process
Repeat Frame
Delay Time
Process
SEND CODE PROCEDURE FLOWCHART
YES
NO
YES
NO
YES
NO
CHECK
VALIDITY KEY
CHECK
NO KEY CODE
CHECK
REPEAT KEY
Offset Data
Frame
Repetition time
Offset Data
Frame
Repetition time
KEY DATA Table
( ORG 300H )
A. HT6221 ( NEC FORMAT )
;;*****************************************************
;@***** Filename : NEC.FORMAT (Remote 64KEY) ******
;@************** OSC:455KHz CARRY:38KHz ***********
;@****************** HT48CA0 ******************
;;*****************************************************
NEC .SECTION 'DATA'
a_REM_CODE DB ? ;KEY DATA CODE
a_CUSTOMER_1 DB ? ;CUSTOMER CODE LOW BYTE
a_CUSTOMER_2 DB ? ;CUSTOMER CODE HIGH BYTE
#define CUS_6221_1 00110100b ;1234H
#define CUS_6221_2 00010010b
;@------------------------------------------------
NEC_CODE .SECTION 'CODE'
;@************* SUBROUTINE[xx]: Send Remote Code ************
SEND_REMOTE_CODE:
clr WDT ;CHECK VALIDITY KEY
SZ fg_SendActive
JMP READY_SEND
ret
READY_SEND:
NEC_CODE:
mov A,a_KEY_NUM ;READ KEY DATA
NEC Format Code
C0C1C2C3C4C5C6C7C8C9CaCbCcCdCeCf D0 D1 D2 D3 D4 D5 D6 D7 D0 D1 D2 D3 D4 D5 D6 D7 end
16 Custom bits 8 Data bits 8 Data bits
New key First Code
Lead Code
9ms
4.5ms
0.56ms
Repeat Code
9ms
2.5ms
Repetition time 108ms => 12286 cycle
First code
Repeat Code
logic 0 logic 1
1.12ms 2.24ms
0.56ms
(63cycle)
0.56ms (Carry 38KHz)
(63cycle) (191cycle)
end10101111010100000000100000001000
Lead Custom Code Data Code Data Code
EX. PS. Custom Code = 0808H Data Code = 50H
(284cycle)
mov M_TBLP,A
TABRDL a_REM_CODE
MOV A,CUS_6221_1 ;READ CUSTOMER CODE
MOV a_CUSTOMER_1,A
MOV A,CUS_6221_2
MOV a_CUSTOMER_2,A
;;--- Starting send NEC Remote code ---
SEND_NEC: ;Check No Key Code ffH
SIZA a_REM_CODE
JMP LEADNEC_CODE
ret
LEADNEC_CODE: ; 1 Instruction Cycle = 8.79us
clr pn_IR ;High Level 9 ms (455KHz:1023 Cycle)
mov A,002d ; [(3*168)+5]*2 = 1018
mov a_SR13,A
LEADIND_CODE_00:
mov A,168d
mov M_ACC,A
LEADIND_CODE_01:
SDZ M_ACC
JMP LEADIND_CODE_01
SDZ a_SR13
JMP LEADIND_CODE_00
NOP2
NOP2
NOP
set pn_IR
clr wdt
;---
mov A,001d ;LOW Level 2.5ms (284Cycle)
mov a_SR13,A ; [(4*69)+5]*1 = 281
LEAD_CODE_04:
mov A,70d
mov M_ACC,A
LEAD_CODE_05:
NOP
SDZ M_ACC
JMP LEAD_CODE_05
SDZ a_SR13
JMP LEAD_CODE_04
clr wdt
SZ fg_REPEAT ;CHECK REPEAT KEY
JMP REPEAT_CODE
;---
mov A,001d ;LOW Level 2.0ms (227Cycle)
mov a_SR13,A ; [(4*55)+5]*1 = 225
LEAD_CODE_06:
mov A,53d
mov M_ACC,A
LEAD_CODE_07:
NOP
SDZ M_ACC
JMP LEAD_CODE_07
SDZ a_SR13
JMP LEAD_CODE_06
clr wdt
nop2
;------------------------
CUSNEC_CODE:
mov A,002d
mov a_SR13,A
MOV A,OFFSET a_CUSTOMER_1
MOV M_MP0,A
CUSTOM_PRO:
mov A,008d
mov a_SR11,A ; 8 data bit
nop
CUSTOM_BIT_BL ;0.56ms->63 Cycle
clr pn_IR ;[(3*20)+2]=62
mov A,20d
CUSTOM_BIT_BL_1:
SDZ M_ACC
JMP CUSTOM_BIT_BL_1
clr wdt
nop
CUSTOM_BIT_BH: ;'0' 0.56ms->63 Cycle
set pn_IR ;'1' 1.68ms->191 Cycle
nop
rr M_INDIRECT1 ;
mov A,18d
SZ M_INDIRECT1.7 ;
mov A,61d
CUSTOM_BIT_BH_0:
SDZ M_ACC
JMP CUSTOM_BIT_BH_0
clr wdt
SDZ a_SR11
JMP CUSTOM_BIT_BL
INC M_MP0
SDZ a_SR13
JMP CUSTOM_PRO
;;---------------------------------------
DATA6NEC_BIT:
mov A,002d
mov a_SR13,A
DATA_PRO:
mov A,008d
mov a_SR11,A ;; 8 data bit
nop
DATA_BIT_BL: ;0.53ms->60 Cycle
clr pn_IR ;[(3*19)+2]=59
mov A,20d
DATA_BIT_BL_1:
本文档为【三菱,索尼,飞利普,东芝等6种红外遥控器编码及程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。