?? hongwai.asm
字號:
;接收代碼格式:
;1.位代碼:0 低電平0.56ms 高電平0.56ms 周期為1.12ms
;1 低電平1.56ms 高電平1.68ms 周期為2.24ms
;2.單發代碼格式:起始碼(低電平 9ms) 結果碼(高電平 4.5ms) 接下來是低8位地址碼,高8位地址碼
;8位數據碼,8位數據反碼
;3.連發代碼格式:在發完32位地址數據碼以后發送起始碼(低電平 9ms) 結束碼(高電平 2.5ms) 接下 ;來重復起始碼,結果碼
;引起連發代碼的原因是一直按鍵不放
ORG 0000H
MAIN:
JNB P3.2,IR ;遙控掃描
LJMP MAIN ;主循環
IR: ;解碼開始
MOV R6,#10
IR_SB:
;檢驗10次共8.8ms,即這8.8ms里P3.2都是低電平
ACALL DELAY882;延時882微秒
JB P3.2,IR_ERROR;數據錯誤退出解碼
DJNZ R6,IR_SB;重復10次檢測
;識別連發碼
JNB P3.2,$;等待高電平,證明之前有9ms的低電平起始碼
ACALL DELAY2400
JNB P3.2,IR_RP;這時為低電平,表明這是連發碼(一直按著按鍵發送),即9ms低電平,2.5ms高電平,否則為結果碼
ACALL DELAY2400 ;延時4.74MS避開4.5MS的結果碼
;讀取32位數據碼
MOV R1,#1AH;存放數據的起始地址
MOV R2,#4
IR_4BYTE:
MOV R3,#8
IR_8BIT:
JNB P3.2,$;等待第一位的高電平信號
LCALL DELAY882;高電平來后開始延時0.88ms,大于0.56ms小于1.12ms
MOV C,P3.2;這時讀P3.2電平值并送C
JNC IR_8BIT_0;這一位為低電平則直接存這一位數據并讀下一位數據,否則延時1ms再存數據并讀下一位數據
LCALL DELAY1000
;接收4個字節,32位數據并分別放入RAM中1AH,1BH,1CH,1DH中
IR_8BIT_0:
MOV A,@R1;將R1中的值給累加器A
RRC A;將C移入A的最低位
MOV @R1,A;保存A中的值到RAM中
DJNZ R3,IR_8BIT;跳轉去接收下一位數據,直到接收完8位數據則接收下一字節
INC R1;下一地址
DJNZ R2,IR_4BYTE;接收下一字節數據,直到接收完4個字節數據
JMP IR_GOTO ;解碼結束
IR_RP:
JMP IR_GOTO
IR_ERROR:
LJMP MAIN
IR_GOTO: ;執行部分
;接收的第一,二,三,四字節分別為地址的低八位,地址的高八位,一字節數據,一字節數據反碼
MOV A,1CH ;將接收到的第三字節,即一字節數據
CPL A
CJNE A,1DH,IR_ERROR;將接收的一字節數據取反并與第四字節數據比較,不相等則說明接收出錯
MOV P1,1CH ;接收到的數據顯示到P1口,將對應遙控器按鍵的健碼用流水燈顯示出來
MOV 1AH,#00H ;接收區清0
MOV 1BH,#00H
MOV 1CH,#00H
MOV 1DH,#00H
LJMP MAIN;回到主循環
DELAY882: ;延時函數
MOV R7,#202
DELAY882_A:;882us延時
NOP
NOP
DJNZ R7,DELAY882_A
RET
DELAY1000:
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY1000_A
RET
DELAY2400:
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY2400_A
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -