R3 EQU 0X03
PORT5 EQU 0X05
PORT6 EQU 0X06
R3 EQU 0X03
KEY_STATUS EQU 0X10 ;低半字節(jié)為按鍵標志,高半字節(jié)為控制標志
SIGNAL_LOW EQU 0X11 ;信號電平低計數(shù)器
SIGNAL_HIGH EQU 0X12 ;信號電平高計數(shù)器
DATA_RECORDER EQU 0X13 ;接收碼數(shù)據(jù)字節(jié)
CODE_RECORDER2 EQU 0X14 ;接收碼地址高字節(jié)
CODE_RECORDER1 EQU 0X15 ;接收碼地址低字節(jié)
CODE_TOTAL EQU 0X16 ;接收數(shù)據(jù)位計數(shù)器
KEY_COUNTER EQU 0X17 ;兩次按鍵檢測計數(shù)器
/**********************KEY_STATUS標志位定義***********************************/
AUTORUN_KEY EQU 0 ;遙控鍵標志
LOCK_KEY EQU 1 ;防盜鍵標志
SEARCH_KEY EQU 2 ;尋車鍵標志
OPEN_KEY EQU 3 ;解除鍵標志
PRESS_FLAG EQU 4 ;有鍵按下標志
CHECK_FLAG EQU 5 ;校驗標志
/***********************CONSTANT DEFINE*************************************/
CODE_ADDRESS1 EQU 0B10001100 ;遙控器地址碼,更改常數(shù)即可實現(xiàn)其他遙控器收碼
CODE_ADDRESS2 EQU 0B00101100
AUTORUN_VALUE EQU 0B00000011 ;遙控器相應(yīng)鍵值,改變相應(yīng)數(shù)值即可更改其功能
LOCK_VALUE EQU 0B00001100
SEARCH_VALUE EQU 0B00110000
OPEN_VALUE EQU 0B11000000
/**********************當PORT6.2口電平為高時調(diào)用該程序收碼******************/
;PORT6.2為信號輸入口
collect_2262:
MOV a,@0xf0
And KEY_STATUS,a
clr code_total
clr signal_high
collect1:
inc signal_high
MOV A,SIGNAL_HIGH
SUB A,@30
JBS R3,0
RET
clr signal_low
call delay20us
jbs port6,2
jmp collect_low
jmp collect1
collect_low:
MOV a,signal_high ;信號高電平寬度<80US時濾除
sub a,@4
jbc r3,0
ret
MOV a,@20 ;信號高電平寬度在80—400US時為采集為0
sub a,signal_high ;信號高電平寬度在400US以上時為采集為1
rrc data_recorder
rrc code_recorder2
rrc code_recorder1
inc code_total
clr signal_high
MOV a,@24
xor a,code_total
jbc r3,2
jmp collect_end
input_low:
inc signal_low
MOV a,signal_low ;信號低電平寬度大于800US時濾除
sub a,@40
jbs r3,0
ret
call delay20us
jbs port6,2;3
jmp input_low
jmp collect1
collect_end:
MOV a,code_recorder1 ;校驗低字節(jié)地址
xor a,@code_address1
jbs r3,2
ret
MOV a,code_recorder2 ;校驗高字節(jié)地址
xor a,@code_address2
jbs r3,2
ret
jbs KEY_STATUS,check_flag ;是否是第一串收碼?
jmp storage_data
bc KEY_STATUS,check_flag
MOV a,com_data_rec
xor a,data_recorder
jbs r3,2
jmp storage_data
MOV a,data_recorder
xor a,@autorun_value ;是啟動鍵?
jbs r3,2
jmp key1
bs KEY_STATUS,autorun_key ;置啟動鍵標志
bs KEY_STATUS,press_flag ;置有鍵按下標志
clr key_counter ;清除按鍵間隔計數(shù)器
ret
key1:
MOV a,data_recorder
xor a,@open_value ;是解除鍵?
jbs r3,2
jmp key2
bs KEY_STATUS,open_key
bs KEY_STATUS,press_flag
clr key_counter
ret
key2:
MOV a,data_recorder
and a,@0x0c ;同時有兩個鍵按下時不為0X30
xor a,@lock_value ;是防盜鍵?
jbs r3,2
jmp key3
bs KEY_STATUS,lock_key
bs KEY_STATUS,press_flag
clr key_counter
key3:
MOV a,data_recorder
and a,@0x30
xor a,@search_value ;是尋車鍵?
jbs r3,2
ret
bs KEY_STATUS,search_key
bs KEY_STATUS,press_flag
clr key_counter
ret
storage_data: ;第一次收碼存儲數(shù)據(jù)字節(jié)
bs KEY_STATUS,check_flag
MOV a,data_recorder
MOV com_data_rec,a
ret