;==========================================================
DATA_BUFF EQU 10H
CRC_NUM EQU 22H
CRC_DATA EQU 23H
CRC_POINTER EQU 30H
;==========================================================
CRC_XORH EQU 10H ;11021=2^16+2^12+2^5+1
CRC_XORL EQU 21H
;==========================================================
ORG 0000H
AJMP MAIN
MAIN: MOV CRC_DATA,#DATA_BUFF
MOV CRC_NUM,#3
ACALL CRC
AJMP MAIN
;==========================================================
; *****RC校驗子程序*****
; 多項式=2^16+2^12+2^5+1=11021H
;CRC_DATA-----進行CRC校驗的數據指針,保存需要進行CRC校驗的數據首址
;CRC_POINTER--緩沖保存CRC校驗數據首址
;CRC_NUM------保存所需進行CRC校驗的字節數
;R7-----------所有進行CRC校驗字節的位數,=(CRC_NUM+2)*8-16
;==========================================================
CRC: MOV R0,CRC_DATA
MOV R1,#CRC_POINTER
MOV R2,CRC_NUM
MOV A,CRC_NUM ;R7=CRC_NUM*8
ADD A,#2
RL A
RL A
RL A
CLR C
SUBB A,#16 ;CRC碼為2個字節,16位
MOV R7,A
CRC1: MOV A,@R0 ;緩存原數據
MOV @R1,A
INC R0
INC R1
DJNZ R2,CRC1
CLR A ;在原數據后添加2個零字節
MOV @R1,A
INC R1
MOV @R1,A
CRC2: MOV A,#CRC_POINTER ;從一個字節開始左移一位
ADD A,CRC_NUM ;共有CRC_NUM+2個字節
ADD A,#1 ;一個數據地址為
MOV R0,A ;R0=CRC_POINTER+CRC_NUM+2-1
MOV A,CRC_NUM ;計算參與移位計算的字節數
ADD A,#2 ;保存在R1中
MOV R1,A ;R1=CRC_NUM+2
CLR C
CRC3: MOV A,@R0
RLC A
MOV @R0,A
DEC R0
DJNZ R1,CRC3 ;判斷每移動一位,所有參與移位的字節是否移完
JNC CRC4 ;進行異或條件判斷
MOV A,#CRC_XORH
XRL A,CRC_POINTER
MOV CRC_POINTER,A
MOV A,#CRC_XORL
XRL A,CRC_POINTER+1
MOV CRC_POINTER+1,A
CRC4: DJNZ R7,CRC2 ;判斷移位是否結束
CRC_END:
RET
CRC16校驗的程序
更新時間: 2007-01-23 15:40:00來源: 粵嵌教育瀏覽量:1407