Ingernirated
@Ingernirated
Романыч

Куда теряется 1 в цикле при работе с мк?

8 портов - 8 светодиодов, первое зажигание на i == 0
И на сколько я понимаю, когда i == 7 и выполняется зажигание последнего(8 диода), i становится 8 и в проверке должно поменяться flag на 1 и сделать i == 6, чтобы загорелся предпоследний светодиод. (бесконечная дорожка из светодиодов), но всё почему-то не так.
int main(void)
{
	DDRD = 0xFF;
	PORTD = 0x00;
	
	char i = 0;
	char flag = 0;
    while(1) 
    {
			
		if(flag == 0) {
			PORTD = (1 << i);
i++;
		}
		if(flag == 1) {
			PORTD = (1 << i);
i--;
		}
		
		if(i == 8) {
			flag = 1;
                        i--;
		}
		if(i == 0) {
			flag = 0;
                        i++;
		}
		
	_delay_ms(200);
	}
}


А вот этот код работает, как я и хотел, только я не пойму, почему

int main(void)
{
	DDRD = 0xFF;
	PORTD = 0x00;
	
	char i = 0;
	char flag = 0;
    while(1) 
    {
			
		if(flag == 0) {
			PORTD = (1 << i);
			i++;
		}
		if(flag == 1) {
			PORTD = (1 << i);
			i--;
		}
		
		if(i == 7) {
			flag = 1;
		}
		if(i == 0) {
			flag = 0;
		}
		
	_delay_ms(200);
	}
}
  • Вопрос задан
  • 177 просмотров
Решения вопроса 2
hahenty
@hahenty
('•')
В части с переключение флага исчезли изменения счетчика, там терялось значение 0 для него.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В первом варианте у вас в цикле i получает значение 8, затем в начале следующего цикла сначала идёт попытка зажечь девятый светодиод и только потом i уменьшается до 7. Ну и программа написана неэффективно.
int main(void)
{
  DDRD = 0xFF;
  PORTD = 0x00;
  char position = 0;
  char step = -1;
  while(1) {
    PORTD = (1 << position);
    if (0 == position || 7 == position) {
      step = -step;
    }
    position += step;
    _delay_ms(200);
  } 
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы