|
PIC實現Dallas的iButton通訊時 , 編了段產生和校驗CRC的子程序。
#include <P16CE625.INC>
;------------------------------- cblock 0x20 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
;------------------------------- #define skp0 btfsc #define skp1 btfss
;=============================== org 0x000
MOVlw .7 MOVwf CRC_COUNT MOVlw datBuff MOVwf FSR ;FSR point to data buffer call CRC_CHECK MOVwf datBuff+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 ;~~~~~~~~~~~~~~~ clrf CRC_RESULT ;initialize the CRC buffer _crc_00 MOVlw .8 ;number of bits for one byte MOVwf bit_cnt ;set bit counter MOVf INDF,w ;get one data byte MOVwf crc_temp ;copy to temporary location _crc_01 rrf crc_temp,f ;get LSB in C skpc ;is this LSB=1? goto _crc_02 ;go if LSB=0 MOVlw 0x01 ;do if LSB=1 xorwf CRC_RESULT,f _crc_02 rrf CRC_RESULT,w ;get LSB of CRC skpc ;test LSB goto _crc_03 ;go if LSB=0 MOVlw 0x18 ;do if LSB=1 xorwf CRC_RESULT,f ;polynomial implementation _crc_03 rrf CRC_RESULT,w ;whole byte right rotate rrf CRC_RESULT,f decfsz bit_cnt,f ;bit counting goto _crc_01 ;go on until aa 8 bits done incf FSR,f ;pointer update to next byte decfsz CRC_COUNT,f ;byte counting goto _crc_00 ;go on until all byte done MOVf CRC_RESULT,w ;get CRC, Z set if CRC=0 return ;return with CRC in W
END |