;CRC校验,待校验的数据放于R1开始的地址,字节数R4
;占用R1~5
CRC: MOV CRC16H,#0FFH ;①CRC寄存器初始化
MOV CRC16L,#0FFH
CRP1: MOV R5,#008H ;右移位8次
MOV A,@R1
XRL A,CRC16H ;②高字节与开始8位字节进行与或运算
MOV CRC16H,A
CRP2: MOV A,CRC16L
CLR C
RRC A ;③把16位值向右移一位
MOV CRC16L,A
MOV A,CRC16H
RRC A
MOV CRC16H,A
JNC CRP3 ;④判断被移出的最低位是‘0’还是‘1’
XRL CRC16L,#0A0H ;被移出的最低位为‘1’时CRC16寄存器与多项式#0A001H相异或
XRL CRC16H,#001H
CRP3: DJNZ R5,CRP2 ;⑤
INC R1 ;⑥
DJNZ R4,CRP1 ;⑦
RET
|