unalex писал(а):ну а чтоб горело как надо, задержку просто перемещу вышеКод: Выделить всё
while(1)
{
LEDSTATE(LED(count), 1);
count++;
_delay_ms(500);
LEDSTATE(LED(count-1), 0);
if(count == 8) count = 0;
}
угу, и получите вместо постоянно потушенного светодиода - постоянно горящий светодиод
нужно добавить вторую задержку, либо переписать код чтобы инвертировать состояние бита порта...
вторая задержка:
Код: Выделить всё
while(1)
{
LEDSTATE(LED(count), 1);
count++;
_delay_ms(500);
LEDSTATE(LED(count-1), 0);
if(count == 8) count = 0;
_delay_ms(500); // вторая задержка !
}
как инвертировать сами разберетесь ?
кстати, а обязательно count сначала инкрементировать а потом использовать уменьшенным на единицу?
может быть лучше так написать?, наверняка код при компиляции будет короче на пару байт (если конечно оптимизатор сам не исправит)
Код: Выделить всё
while(1)
{
LEDSTATE(LED(count), 1);
_delay_ms(500);
LEDSTATE(LED(count), 0);
_delay_ms(500); // вторая задержка !
count++;
if(count == 8) count = 0;
}
заодно так ИМХО нагляднее и сразу видно что и как работает...
я подобный вашему прием (ранний инкремент переменной) использовал как то на асме, но там это действительно было необходимо чтобы не вставлять лишние nop'ы задержки.. на СИ же это не нужно и будет только мешать читаемости программы
на асме это выглядело как то так (смотрите коммент выделенный !!!!)
Код: Выделить всё
LCD_PCD8544_SENDBYTE: ;---------- отправка байта на дисплей (R16 байт)
push R17
push R16
ldi R17 , 8 ; количество бит в байте
LCD_PCD8544_SENDBYTE_loop:
cbi MOSIPORT , MOSIPIN ; mosi=0
sbrc R16 , 7
sbi MOSIPORT , MOSIPIN ; mosi=1
sbi CLKPORT , CLKPIN ; sck=1
lsl R16 ; !!!! команда реализующая задержку и одновременно "полезно" сдвигающая отправляемый байт
cbi CLKPORT , CLKPIN ; sck=0
dec R17
brne LCD_PCD8544_SENDBYTE_loop
pop R16
pop R17
ret
