; CRC-4生成程序
; g(x) = x4 + x + 1
;
dataBuffer EQU 0x20
org 0x000
Start:
mov SP, #0x50
;
mov dataBuffer, 0x08
mov dataBuffer + 1,0x20
mov dataBuffer + 2,0x08
mov dataBuffer + 3,0x09
mov dataBuffer + 4,0x23
mov dataBuffer + 5,0x12
mov dataBuffer + 6,0x34
mov dataBuffer + 7,0x50 ; 注意:最后字节的低4位保留给CRC
mov R1,#dataBuffer ; 数据首地址
mov R5,#0x08 ; 数据字节数
acall CRCEngine
sjmp $
; *************************************************************************
; 功能: 计算4位CRC校验
; 入口参数: R1-数据首址, R5-数据字节数
; 出口参数: R7-CRC校验码
; *************************************************************************
CRCEngine:
mov R6,0x01
mov R4,0x06
inc R6
mov R0,0x04
mov A,@R0
mov R4,A ; 将首字节内容装入crc
dec R5 ; 字节数减1
CRCEngine_1:
mov A,R5
jz CRCEngine_2 ; 判定所有字节计算结束
mov R3,0x06
inc R6
mov R0,0x03
mov A,@R0
mov R3,A ; 将缓冲内容装入移位buf
clr A
mov R7,A
CRCEngine_1_1:
clr CY
mov A, R3
rlc A
mov R3, A ; buf左移
mov A,R4
rlc A ; CRC左移
CRCEngine_1_2:
jnc CRCEngine_1_3
xrl A,#0x30 ; CY为1则与立即数0x30相异或
CRCEngine_1_3:
mov R4,A
inc R7
cjne R7,#0x08, CRCEngine_1_1 ; 不够8位则继续
dec R5
sjmp CRCEngine_1
CRCEngine_2:
clr A
mov R7,A
CRCEngine_2_1:
clr CY
mov A, R4
rlc A
jnc CRCEngine_2_2
xrl A,#0x30 ; CY为1则与立即数0x30相异或
CRCEngine_2_2:
mov R4,A
CRCEngine_2_3:
inc R7
cjne R7, #0x04, CRCEngine_2_1 ; 校验位添零,继续
mov A,R4
swap A
anl A,#0x0F
mov R7,A ; 返回CRC值
ret
END
文章评论(0条评论)
登录后参与讨论