用PIC单片机和Dallas的iButton通讯时,编了段产生和校验CRC的子程序。
#include ;------------------------------- cblock0x20 datBuff:8;assign 8 byte data buffer bit_cnt;bit counting CRC_COUNT;number of bytes for CRC CRC_RESULT;CRC resulr crc_temp;temporary data buffer during CRC endc ;------------------------------- #defineskp0btfsc #defineskp1btfss ;=============================== org0x000 movlw.7 movwfCRC_COUNT movlwdatBuff movwfFSR;FSR point to data buffer callCRC_CHECK movwfdatBuff+7 goto$ ;=============================== ;CHECK THE CRC FOR ? BYTES DATA ;For the polynomial of X^8 + X^5 + X^4 + 1 ;Derived from Dallas's iButton standard ;Before calling, FSR= data buffer ;CRC_COUNT = number of bytes for CRC CRC_CHECK;~~~~~~~~~~~~~~~ clrfCRC_RESULT;initialize the CRC buffer _crc_00 movlw.8;number of bits for one byte movwfbit_cnt;set bit counter movfINDF,w;get one data byte movwfcrc_temp;copy to temporary location _crc_01 rrfcrc_temp,f;get LSB in C skpc;is this LSB=1? goto_crc_02;go if LSB=0 movlw0x01;do if LSB=1 xorwfCRC_RESULT,f _crc_02 rrfCRC_RESULT,w;get LSB of CRC skpc;test LSB goto_crc_03;go if LSB=0 movlw0x18;do if LSB=1 xorwfCRC_RESULT,f;polynomial implementation _crc_03 rrfCRC_RESULT,w;whole byte right rotate rrfCRC_RESULT,f decfszbit_cnt,f;bit counting goto_crc_01;go on until aa 8 bits done incfFSR,f;pointer update to next byte decfszCRC_COUNT,f;byte counting goto_crc_00;go on until all byte done movfCRC_RESULT,w;get CRC, Z set if CRC=0 return;return with CRC in W END