Метод подсчёта CRC (1-wire) для PIC18:
static near unsigned char crc_byte, crc_val;
#define iwire_crc_byte(byte, base) ( \
crc_byte=(byte), crc_val=(base), \
crc_byte^=crc_val, \
((crc_byte&(1<<0)) ? crc_val^=0x5e : 0), \
((crc_byte&(1<<1)) ? crc_val^=0xbc : 1), \
((crc_byte&(1<<2)) ? crc_val^=0x61 : 2), \
((crc_byte&(1<<3)) ? crc_val^=0xc2 : 3), \
((crc_byte&(1<<4)) ? crc_val^=0x9d : 4), \
((crc_byte&(1<<5)) ? crc_val^=0x23 : 5), \
((crc_byte&(1<<6)) ? crc_val^=0x46 : 6), \
((crc_byte&(1<<7)) ? crc_val^=0x8c : 7), \
crc_val)
[ZX]