自己编写VB、C、汇编 CRC16算法,供参考【恢复】
'VB算法Public Function CRC16(data() As Byte) As Byte()
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
Dim CL As Byte, CH As Byte '多项式码&HA001
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
Dim Flag As Integer
Dim ReturnData(1) As Byte
CRC16Lo = &HFF
CRC16Hi = &HFF
CL = &H1
CH = &HA0
For Ii = 0 To UBound(data)
CRC16Lo = CRC16Lo Xor data(Ii) '每一个数据与CRC寄存器进行异或
For Flag = 0 To 7
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1
CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
End If '否则自动补0
If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或
CRC16Hi = CRC16Hi Xor CH
CRC16Lo = CRC16Lo Xor CL
End If
Next Flag
Next Ii
ReturnData(0) = CRC16Lo 'CRC低位
ReturnData(1) = CRC16Hi 'CRC高位
CRC16 = ReturnData
End Function
'C算法
void crc16(unsigned char r_data[],unsigned int length)
{
unsigned char cl,ch;
unsigned char savehi,savelo;
int ii,flag;
crc16hi=0xFF;
crc16lo=0xFF;
cl=0x1;
ch=0xA0;
for (ii=0;ii<length;ii++)
{
crc16lo=(crc16lo ^ r_data);
for (flag=0;flag<8;flag++)
{
savehi=crc16hi;
savelo=crc16lo;
crc16hi=(crc16hi>>1);
crc16lo=(crc16lo>>1);
if ((savehi & 0x01)==0x01)
crc16lo=(crc16lo | 0x80);
if ((savelo & 0x01)==0x01)
{
crc16hi = (crc16hi ^ ch);
crc16lo = (crc16lo ^ cl);
}
}
}
}
'汇编算法
;**********************************************************
;CRC16校验子程序
;R1 需进行CRC校验数据起始地址
;CRC16_L CRC校验数据低字节 CRC16_H CRC校验数据高字节
;R7 需进行CRC校验的字节数
;**********************************************************
CRC16:
MOV CRC16_L,#0FFH
MOV CRC16_H,#0FFH
CRC16_LOOP1:
MOVX A,@R1
XRL CRC16_L,A
MOV R6,#08H
CRC16_LOOP2:
MOV R3,CRC16_L
MOV R4,CRC16_H
CLR C
MOV A,CRC16_H
RRC A
MOV CRC16_H,A
MOV A,CRC16_L
RRC A
MOV CRC16_L,A
JNC CRC16_STEP
XRL CRC16_L,#01H
XRL CRC16_H,#0A0H
CRC16_STEP:
DJNZ R6,CRC16_LOOP2
INC R1
DJNZ R7,CRC16_LOOP1
RETI
本贴被 saimo 编辑过,最后修改时间:2008-09-24,17:06:58. 谢谢!做个标记,慢慢学习。 请问你的程序生成的校验多项式是 X^16+X^12+X^5+1 吗? 我用的vb crc16的代码也是来自这里的!呵呵 好,不错 mark 谢谢!做个标记,慢慢学习。 正想用,收下了,谢谢楼主 不错 学习了 mark 标记 补充一个 汇编语言 测试成功的
.include "tn13def.inc"
.def polyhi = R16
.def polylo = R17
.def crchi = R18 ;crc高字节
.def crclo = R19 ;crc低字节
.def bitcnt = R20 ;
.def buflen = R21 ;数量
;-------------------------------------------------------------------------
.cseg
.org 0
;-------------------------------------------------------------------------
avr0000:
rjmp RESET
RESET:ldi ZL,RamEnd
out SPL, zl
ldi Zh, high(2*data)
ldi Zl, low(2*data)
ldi buflen, low(2*data_en)-low(2*data)
rcallcrc_go
rjmp pc
;*********************************************************
; eXtreme compact CRC16 procedure (c) Gleb Daniloff
; 08/01/2007 harley@hotbox.ru
; registry usage: Z,r0,polylo,polyhi,crclo,crchi,bitcnt
; input: Z - pointer to string, buflen - buffer length
; output: crclo,crchi - CRC16
;*********************************************************
crc_go:
ldi polyhi,0xa0 ; polynom inilialization - once at all
ldi polylo,0x01
ldi crchi,0xff;clr crchi ; crc initialization - once per call
ldi crclo,0xff;clr crclo
crc16:
lpm
adiw ZL,1
ldi bitcnt,8
crc01:
eor crclo,r0
bst crclo,0
eor crclo,r0
lsr r0
lsr crchi
ror crclo
brtc crc02
eor crchi,polyhi
eor crclo,polylo
crc02:
dec bitcnt
brne crc01
dec buflen
brne crc16
ret
data: .db 0x01,0x02,0x00,0xc4,0x00,0x16
data_en: 很好~~哈哈 mark 补充一个CRC8 的 汇编语言
;CRC8 校验计算通过
.include "tn13def.inc"
.def poly8 = R16
.def crc8 = R17
.def bitcnt = R20 ;
.def buflen = R21 ;数量
.def xor = r22
;-------------------------------------------------------------------------
.cseg
.org 0
;-------------------------------------------------------------------------
avr0000:
rjmp RESET
RESET:ldi ZL,RamEnd
out SPL, zl
ldi Zh, high(2*data)
ldi Zl, low(2*data)
ldi buflen, low(2*data_en)-low(2*data)
rcallcrc_go
rjmp pc
;*********************************************************
; eXtreme compact CRC8 procedure (c) Gleb Daniloff
; 08/01/2007 harley@hotbox.ru
; registry usage: Z,r0,poly8,crc8,bitcnt
; input: Z - pointer to string, buflen - buffer length
; output: crc8 - CRC8
;*********************************************************
crc_go:
ldi poly8,0x8C ; polynom inilialization - once at all
ldi crc8,0;0xff;clr crc8 ; crc initialization - once per call
crc8_:
lpm
adiw ZL,1
ldi bitcnt,8
crc01:
eor crc8,r0
bst crc8,0
eor crc8,r0
lsr r0
lsr crc8
brtc crc02
eor crc8,poly8
crc02:
dec bitcnt
brne crc01
dec buflen
brne crc8_
ret
data:
.db 0x68,0x1B,0x1B,0x68,0x02,0x00,0x7C,0x32
data_en: 上传一个CRC8计算的软件初始值是00
点击此处下载 ourdev_601800HX9CBB.rar(文件大小:262K) (原文件名:crc8_calc.rar) CRC32计算器
点击此处下载 ourdev_601809ORBU4A.rar(文件大小:49K) (原文件名:CRC32Calc (No Install).rar) MARK {:victory:}{:victory:}{:victory:}
页:
[1]