?? rem.asm
字號:
REMTOE: CLR EX0
PUSH ACC
PUSH PSW
SETB RS0
CLR RS1
MOV C,P3.2
NOP
NOP
JNC CONREM
JNC CONREM
NOP
NOP
BUFF: AJMP EXT_1
;-----------------------------------------------------------------------------------------------
;對遙控信號的9000微秒的初始低電平信號的識別。
CONREM: MOV R4,#10
SB: NOP
NOP
ACALL D882 ;定時882微秒,即數65536-64654=882
REM2: MOV C,P3.2
NOP
NOP
JC BUFF ;延時882微秒后判斷P3.2腳是否出現高電平如果有就退出解碼程序
NOP
NOP
DJNZ R4,SB ;重復10次,目的是檢測在8820微秒內如果出現高電平就退出解碼程序
;-----------------------------------------------------------------------------------------------
;對遙控信號的4500微秒的高電平信號的識別
NOP
NOP
MOV R4,#20
JNB P3.2,$ ;等待4.5毫秒高電平引導脈沖
RT6: MOV R7,#100 ;延時201微秒
DJNZ R7,$
NOP
NOP
REM3: MOV C,P3.2
JNC EXT_1
DJNZ R4,RT6
NOP
NOP
JB P3.2,$
NOP
NOP
;-----------------------------------------------------------------------------------------------
;以下是解碼部分,解32位碼
REM4: MOV R0,#1AH ;設定1AH為起始RAM區
MOV R4,#4
PP: MOV R7,#8
JJJJ: JNB P3.2,$ ;等待地址碼第一位的高電平信號
NOP
NOP
ACALL D882 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態
REM6: MOV C,P3.2 ;將P3.2引腳此時的電平狀態0或1存入C中
NOP
NOP
JNC UUU ;如果為0就跳轉到UUU
NOP
NOP
JB P3.2,$ ;如果為1就等待高電平信號結束
UUU: NOP
NOP
MOV A,@R0 ;將R0中地址的給A
RRC A ;將C中的值0或1移入A中的最低位
NOP
NOP
MOV @R0,A ;將A中的數暫時存放在R0中
NOP
NOP
DJNZ R7,JJJJ ;接收地址碼的高8位
INC R0 ;對R0中的值加1,換成下一個RAM
NOP
NOP
DJNZ R4,PP ;接收完16位地址碼和8位數據碼和8位數據反碼,存放在1AH/1BH/1CH/1DH的RAM中
;-----------------------------------------------------------------------------------------------
;代碼識別
MOV A,1AH
XRL A,#20H ;20H為地址低8位的值于不同的遙控器有不同的地址值
NOP
NOP
JNZ EXT_1
MOV A,1BH
XRL A,#0DFH ;0DF為地址高8位的值
NOP
NOP
JNZ EXT_1
MOV A,1CH
CPL A
XRL A,1DH ;如果地址碼不對或接收到的數據碼兩單元不反向均當錯碼本程序當無鍵按下處理
NOP
NOP
JNZ EXT_1
;-----------------------------------------------------------------------------------------------
;將遙控代碼轉換成標準鍵值 0,1,2,3....
MOV R4,#7 ;7為遙控器面板按鍵數
MOV DPTR,#REM_TAB
LOOKUP_1: MOV A,R4
NOP
NOP
MOVC A,@A+DPTR
NOP
NOP
XRL A,1CH
NOP
NOP
JZ REM_BAK0
DJNZ R4,LOOKUP_1
MOV TAB_KEY,#0FFH
SJMP EXT_1
REM_BAK0: DEC R4
MOV TAB_KEY,R4 ;R4中的值即為標準的鍵值
EXT_1: SETB P3.2
CLR RS0
SETB EX0
POP PSW
POP ACC
RETI
;-----------------------------------------------------------------------------------------------
;遙控器按鍵代碼
REM_TAB: DB 00H, 17H, 55H, 11H, 02H, 01H, 12H, 04H
; 高音 低音 響度 音量+ 音量- 輸入選擇 靜音
;====================================================================================
;定時882微秒子程序
D882: MOV R6,#20 ;延時子程序1,精確延時882微秒
DD1: MOV R5,#20
DJNZ R5,$
DJNZ R6,DD1
RET
;-----------------------------------------------------------------------------------------------
;定時4740微秒子程序
D4740: MOV R6,#10 ;延時子程序2,精確延時4740微秒
DD2: MOV R5,#235
DJNZ R5,$
DJNZ R6,DD2
RET
;-----------------------------------------------------------------------------------------------
;判斷在118毫秒內是否有連發碼
AA: MOV R0,#25
XX: ACALL D4740 ;精確定時4740微秒
REM8: JNB P3.2,HH ;跳轉到判斷連發代碼是否正確的程序段
DJNZ R0,XX
EXT_3: CLR BIT_REM ;無連發碼BIT_REM為0
EXT_2: NOP
NOP
RET
;-----------------------------------------------------------------------------------------------
;連發碼判斷程序
HH: MOV R7,#4
S: NOP
NOP
ACALL D882 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態
REM10: NOP
NOP
JB P3.2,EXT_3 ;延時882微秒后判斷P3.2腳是否出現高電平如果有就退出解碼程序
DJNZ R7,S ;重復4次,目的是確認連發碼的低電平信號波形
JNB P3.2,$ ;等待高電平
SETB BIT_REM ;有連發碼BIT_REM為1
NOP
NOP
SJMP EXT_2
;====================================================================================
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -