|  | 
 
| 用PIC单片机和Dallas的iButtON通讯时,编了段产生和校验CRC的子程序。
 #include
 ;-------------------------------
 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
 
 欲知详情,请登录维库电子市场网(www.dzsc.com)
 
 | 
 |