⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc.asm

📁 在PIC上实现CRC16算法的源程序
💻 ASM
字号:
; crc大约总计占用100字节    
; 注意:3种格式crc16 crc CCITT crc32
; 注意:crc校验里面的除法和余数,不是我们十进制种的那种除法和余数
;      2进制中除法为xor实现的,结果和十进制不同
; 例如   
;    数据为110101(二进制数) 多项式为101(二进制数)
;    110101
;    101 
;     111
;     101
;     010
;      101
;      0011  -11为crc校验值
; 如果转化为十进制110101=53 101=5 53=10*5+3

; 此处的CRC校验采用的是欧洲的CCITT标准 
; 。CRC-CCITT是一个17位生成多项式G=[1 0001 0000 0010 0001],
; 用多项式形式表示为G(x)=x16+x12+x5+1,(此处的x16代表x的16次方)
; 由它产生的检验码R的二进制位数是16位(2字节)。

; e为取BYTEa高半字节 低半字节为0,三位字节[ e 0 0 ] 
; f为取BYTEa低半字节 高半字节为0,三位字节[ f 0 0 ] 
; 余数结果在下面表格
; 2 个字节为一个结果,偶数字节为首字节  

; 例如 BYTEa =0x7A,对应的e=0x7a&0xF0=0x70,f=0x0A
;                  查表DATAe(0组-f组),第7组值为0x7E,0x97
;				   合并为0x7E97	[0x70,0,0]余数为0x7E97  
;                  查表DATAf(0组-f组),第A组值为0xA1,0x4A
;				   合并为0xA14A	[0x0A,0,0]余数为0xA14A
;     [0x7A,0,0]的余数,高字节为 0x7E xor 0xA1 = 0xDF
;     [0x7A,0,0]的余数,低字节为 0x97 xor 0x4A = 0xDD
;     最后结果为0xDFDD(或者表示为[0xDF,0xDD])
; 如果BYTEb=0x35,BYTEc=0x71,
; 则[BYTEa,BYTEb,BYTEc]的crc校验为
;    高字节=0xDF xor 0x35 = 0xEA
;    低字节=0xDD xor 0x71 = 0xAC
;   [BYTEa,BYTEb,BYTEc]=[0x7a,0x35,0x71]的CRC校验码为[0xEA,0xAC]



	list p=p16c505      ;选择MCU  
    #include <p16c505.inc>
    __CONFIG   _CP_OFF & _WDT_OFF & _MCLRE_ON & _XT_OSC
    
;***************************************************************
	 ;变量定义 
BYTEa   EQU 0x08  ;CRC校验的第一个字节      
BYTEb   EQU 0x09  ;CRC校验的第二个字节
BYTEc   EQU 0x0A  ;CRC校验的第三个字节
RESULTh EQU 0x0B  ;校验码高字节 
RESULTl EQU 0x0C  ;校验码低字节 
ADDR    EQU 0x0D  ;存储地址	 
	 
;****************************************************************    

; e为取BYTEa高半字节 低半字节为0,三位字节[ e 0 0 ] 
; 余数结果在下面表格    
; 2 个字节为一个结果,偶数字节为首字节
     ORG 0x01	  ;PAGE0
Table:     
     ADDWF PCL,f
TableEntries:     
     dt 0x00,0x00,0x12,0x31,0x24,0x62,0x36,0x53 ;0组-3组
     dt 0x48,0xC4,0x5A,0xF5,0x6C,0xA6,0x7E,0x97 ;4组-7组
     dt 0x91,0x88,0x83,0xB9,0xB5,0xEA,0xA7,0xDB ;8组-b组
     dt 0xD9,0x4C,0xCB,0x7D,0xFD,0x2E,0xEF,0x1F ;c组-f组
; f为取BYTEa低半字节 高半字节为0,三位字节[ e 0 0 ] 
; 余数结果在下面表格    
; 2 个字节为一个结果,偶数字节为首字节      
     dt 0x00,0x00,0x10,0x21,0x20,0x42,0x30,0x63 ;0组-3组
     dt 0x40,0x84,0x50,0xA5,0x60,0xC6,0x70,0xE7 ;4组-7组
     dt 0x81,0x08,0x91,0x29,0xA1,0x4A,0xB1,0x6B ;8组-b组
     dt 0xC1,0x8C,0xD1,0xAD,0xE1,0xCE,0xF1,0xEF ;c组-f组
; 由于pic只有2级硬件堆栈 所以call函数中,只能引用一个表     
; 把2个表合并为一个
;******************************************************************
;  cal_crc函数的参数为BYTEa BYTEb BYTEc,
;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -