/* Loops through bits in byte and writes to PORTC - DIN ANC CCLK */
for(bitIter = 0x01; bitIter <= 0x80; bitIter = bitIter << 1)
{
PORTC = portC | BIT0;
(bitIter & byteIter) ? (PORTC = portC & ~BIT7) : (PORTC = portC | BIT7);
PORTC = portC & ~BIT0;
}
Для начала этот цикл оборван.bitIter
- это uchar
(я предполагаю, что это 8-битный символ без знака).При смещении его влево он в конечном итоге получит значение 0x80 для предполагаемой последней итерации.После следующей смены он получит значение 0.
За эффективность.В зависимости от архитектуры выполнение операции PORTC = PORTC | BIT0
может привести к установке одного бита.Однако это также может привести к чтению, установке бита в регистре и сохранении.
Как уже упоминалось ранее, если возможно, попытайтесь установить BIT0 и BIT7 одновременно (если аппаратное обеспечение позволяетthis).
Я бы попробовал что-то вроде:
bitIter = 0x01;
do
{
if (byteIter & bitIter)
{
PORTC = BIT0;
}
else
{
PORTC = (BIT0 | BIT7);
}
PORTC = 0;
bitIter <<= 1;
} while (bitIter != 0x80);
Использование цикла do ... while
устранит проблему, и вы избавитесь от ненужного сравнения теста цикла передпервая итерация (если ваш компилятор уже не оптимизировал ее).
Вы можете попытаться развернуть цикл вручную, восемь раз, по одному разу для каждого бита.