?? hwint.bak
字號:
;---------------------------------------------------------------------------------------------------
;紅外串口通信子程序
;接收一正確幀,置正確幀標志
;HW_FRM_PROCESS BIT 21H.2 ;幀正在處理標志,處理完后要清零
;HW_LEADER_CHARACTER BIT 21H.3 ;接收到正確前導字節標志
;HW_FRAMES_HEAD_RECEVED BIT 21H.4 ;紅外幀正在接收標志
;接收緩沖在CPU內高128字節,只能間接讀寫.
;---------------------------------------------------------------------------------------------------
INFRA_CARRIER:
CLR ES ;關串行中斷
CLR REN ;禁止接收
CPL WATCH_DOG ;清狗
PUSH PSW ;保護狀態字及A,B寄存器
PUSH ACC
PUSH B
PUSH 00H
PUSH 01H
RECE_FRAME_START:
JBC RI,HW_RECE_HEAD_BYTE ;允許接收中斷位=1否?
LJMP HW_RECE_FRAME_END ;沒接收中斷,等待
HW_RECE_HEAD_BYTE:
MOV A,SBUF ;有中斷,讀接收緩沖寄存器
MOV HW_REC_WHOLE_BYTE,A ;接收一字節送RAM ;接收一字節送RAM
JB HW_FRAMES_HEAD_RECEVED,HW_FRAME_JUDGE ;幀在接收否?
CJNE A,#0FEH,HW_JUDGE_RECE_HEAD ;是前導字節#0FEH否?
SETB HW_LEADER_CHARACTER ;是前導字,置標志
LJMP HW_RECE_FRAME_END
HW_JUDGE_RECE_HEAD:
JNB HW_LEADER_CHARACTER,NOT_HEAD_BYTE ;判斷前導字已接收過否?
AJMP HW_FRAME_JUDGE
NOT_HEAD_BYTE:
LJMP HW_NOT_HEAD
;--------------------------------------------------------
;前導字已接收過,判斷幀
HW_FRAME_JUDGE:
MOV R0,#HW_REC_HEAD1 ;幀頭判斷
CJNE @R0,#68H,HW_FINDING_HEAD ;幀頭是否已接收并存過?
MOV A,HW_REC_WHOLE_BYTE
CJNE A,#16H,HW_SAVE_RECE_BYTE ;判斷是幀尾否?
AJMP HW_RECE_DATA_LONGER
HW_FINDING_HEAD: MOV A,HW_REC_WHOLE_BYTE
CJNE A,#68H,HW_NOT_HEAD
SETB HW_FRAMES_HEAD_RECEVED ;幀頭已接收標志
LJMP HW_SAVE_RECE_BYTE ;是幀頭,保存
HW_NOT_HEAD:
LJMP HW_CLR_RECE_SBUF ;清接收緩沖區
RECE_ERR:
LJMP HW_RECE_FRAME_END ;轉接收結束
HW_RECE_DATA_LONGER:
MOV R0,#HW_REC_DATA_FEILD_LEN ;取數據域長度,接收區首地址+09H
MOV A,@R0
CLR C ;數據域長度<32?,大于32時,接收數據錯
SUBB A,#32
JC HW_REC_FRAME_LONGER
LJMP HW_CLR_RECE_SBUF ;大于32時,接收數據錯,重新開始接收
HW_REC_FRAME_LONGER:
MOV R0,#HW_REC_DATA_FEILD_LEN
MOV A,#12
HW_JUDGE_FRAMES_LONTH:
ADD A,@R0 ;幀尾字節應在的位置
DEC A ;若是幀尾,當前接收到的字節數比應接收到的字節數少1
CJNE A,HW_REC_CUR_LEN,HW_SAVE_RECE_BYTE ;非幀尾,是幀內的字節,保存
SETB HW_FRM_PROCESS ;置幀處理標志,保存幀尾
HW_SAVE_RECE_BYTE:
MOV A,HW_REC_CUR_LEN ;當前接收字節長度
CLR C
SUBB A,#HW_REC_BUF_LEN+1 ;接收的總長度是否超過32個字節?
JNC HW_CLR_RECE_SBUF
HW_DLB_RULES:
MOV A,#HW_REC_BUF ;是幀內的字節,保存
;存儲接收到的字節:
HW_RECE_BYTES_AND_SAVE:
ADD A,HW_REC_CUR_LEN ;計算在幀內應存放的地址
MOV R0,A
MOV A,HW_REC_WHOLE_BYTE
MOV @R0,A
INC HW_REC_CUR_LEN ;當前接收到的幀字節數+1
JNB HW_FRM_PROCESS,HW_RECE_FRAME_END ;和校驗
MOV A,HW_REC_CUR_LEN ;當前接收字節長度
DEC A
DEC A
MOV B,A
HW_DLB_RULES_PROCESS:
ADD A,#HW_REC_BUF ;校驗和的地址
MOV R0,A
MOV A,@R0
PUSH A ;校驗和壓棧
MOV R0,#HW_REC_BUF
MOV A,#00H
HW_CHECK_SUM: ADD A,@R0
INC R0
DJNZ B,HW_CHECK_SUM
MOV B,A
POP A
CJNE A,B,HW_CLR_RECE_SBUF ;和校驗錯,清HW_FRM_PROCESS
CLR S_LEDR ;紅外接收燈亮
LJMP HW_RECE_FRAME_END
HW_CLR_RECE_SBUF:
SETB S_LEDR ;紅外接收燈滅
MOV HW_REC_CUR_LEN,#00H ;當前幀長度清0
MOV R0,#HW_REC_BUF ;清接收緩沖區62字節
MOV B,#HW_REC_BUF_LEN
HW_CLR_RECE_LOOP:
MOV @R0,#00H
INC R0
DJNZ B,HW_CLR_RECE_LOOP
CLR HW_LEADER_CHARACTER
CLR HW_FRAMES_HEAD_RECEVED
CLR HW_FRM_PROCESS
HW_RECE_FRAME_END:
POP 01H
POP 00H
POP B
POP ACC
POP PSW ;出棧
SETB REN ;允許接收
SETB ES ;開串行中斷
RETI
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -