| CRC16校验的程序
CRC16校验的程序
;========================================================== 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 (综合电子论坛) |
*注:部份文章为网上收录供大家共同学习参考之用,并不代表本站意见。如存在版权问题请马上通知我们,我们将马上删除。 |