Запись в битовую переменную сохраняет значение истинности этой переменной в бит. Например, написание:
ADCON0bits.CHS3 = 3;
установит этот бит в 1.
Если бит 5 относится к биту, маскированному 0x20 (00100000), и вам необходимо сохранить 4-битное число в битах, маскированных 0x3c (00111100), то вы можете использовать битовые сдвиги и побитовые операции:
// First clear bits 1-5:
ADCON0 &= ~0x3c;
// Now set the bits to correct value:
ADCON0 |= (count << 2); // <-- remember to shift 2 bits to the left
обновление : как упомянуто Ианом в комментариях. Это устанавливает ADCON0 в промежуточное значение перед обновлением. В этом случае все в порядке, поскольку он только выбирает канал A / D и фактически не выполняет преобразование. Но в целом лучше сделать:
unsigned char temp_adcon;
temp_adcon = ADCON0 & ~0x3c;
ADCON0 = temp_adcon | (count << 2);