Хотел сделать так чтоб после первого такта загорался первый светодиод, после второго второй, после третьего третий, а после третьего первый гас и т.д

char “такт” = “одно нажатие и одно отпускание кнопки”;
Хотел сделать так чтоб после первого такта загорался первый светодиод, после второго второй, после третьего третий, а после третьего первый тух и тд. Но получилось так что после трех тактов первый светодиод тухнет, а 2 и 3 нет. И потом после 2 тактов 1 снова загорается (получается горят все 3), а еще после 2 тактов он тухнет и тд. Подскажите пожалуйста.
Вот код:

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
}
int led = 3;
bool flag = 0;
void loop() {
  bool butt = digitalRead(2);
  if (butt == 1 && flag == 0 && led < 9) {
    flag = 1;
    digitalWrite(led, 1);
    led = led + 1;
    delay(50);
  }

  if (butt == 0 && flag == 1 && led < 9) { 
    flag = 0;  
        delay(50);
  }
  if (led == 7 && butt == 1) {
    digitalWrite(4, 0);
          delay(50);
  }
  if (led == 7 && butt == 0) {
      led = led + 1;
  }
  if (led == 8 && butt == 1) {
    digitalWrite(5, 0);
          delay(50);
  }
  if (led == 8 && butt == 0) {
      led = led + 1;
  }
  if (led == 9 && butt == 1) {
    digitalWrite(6, 0);
          delay(50);
  }
    if (led == 9 && butt == 0) {
  led = 4;
  }
}

К чему эти сложности? У вас led должно быть в пределах 4 … 6, вот и крутите в этих пределах. Заведите еще один флаг uint8_t level = HIGH. При каждом клике присваивайте выходу led значение level, затем увеличивайте led на единицу и проверяйте: если led > 6, присваивайте ему 4 и инвертируйте значение level = !level. И так по кругу

uint8_t LEDS[3] {12, 11, 10};
uint8_t BUTTON = A0;

uint8_t MAP[6][3]  {
  {1, 0, 0},
  {1, 1, 0},
  {1, 1, 1},
  {0, 1, 1},
  {0, 0, 1},
  {0, 0, 0}
};
uint8_t count = 0;

void setup() {
  Serial.begin(115200);
  for (uint8_t i = 0; i < 3; i++) {
    pinMode(LEDS[i], OUTPUT);
  }
  pinMode(BUTTON, INPUT_PULLUP);
}

void loop() {
  if (!digitalRead(BUTTON)) {
    for (uint8_t i = 0; i < 3; i++) {
      digitalWrite(LEDS[i], MAP[count][i]);
    }
    count++;
    if (count > 5) count = 0;
    delay(200);
  }
}

пины поменяешь на свои
и нальешь при случае!

Спасибо

Как-то так тоже можно

byte c;
void setup() {
 	DDRD &= ~((1<<DDD6)|(1<<DDD5)|(1<<DDD4)|(1<<DDD2)); 
 	PORTD |= (1<<PD6)|(1<<PD5)|(1<<PD4)|(1<<PD2);
  EICRA |= (1<<ISC01);
  EIMSK |= (1<<INT0);	
 	}
 	ISR(INT0_vect) {
  	c++;
  	}
 void loop() {
  switch(c) {
  case 1: 
  PIND = (1 << PD4);
  break;
  case 2:
  PIND = (1 << PD5);
  break;
  case 3:
  PIND = (1 << PD6);
  c=0;
  break;
        }
}

опять вы со своими ддр)

Потому что даташит и потому что много где встречается. Лучше хотя бы представлять, что это. Ну и заменить на ардуиновские нетрудно.

с этим надо жить или не пользоваться вовсе, ибо через месяц другой это все забудется, а уж без комментариев в коде и того быстрее.

1 лайк

Вот вот. Я не пользуюсь и не страдаю от этого ))

и я пострадал и бросил))
при нынешних ресурсах контролеров это все разговоры в пользу бедных.

@Yurik, не хочешь попробовать этими “DDR”-ами настроить, хотя бы тактирование, например какой нибудь STM32H7 ?

Да ладно! А чего тут страдать то? То же Ардуино, и даже проще.

1 лайк

может ты тада :sweat_smile: :smile: ?

Не, Боже упаси.)

В СТМ “DDR-ов” нет. А так нет проблем настроить СТМ через регистры. Поищи посты Димакса - он часто через регистры писал.

Так и не страдаю же ))

они по другому и не настраиваются)

1 лайк

Дело вкуса, наверное. По стоимости сейчас дигиспарк на тини85 обходит нано. Трудно объяснить. Я не программист, и очень далек от электроники, но считаю что одно дело, например когда работая на окладе- лепить блинк на супермощной меге, и другое- когда самому интересно, получиться ли уместить в минимум из возможного. Я ж не предлагаю ассемблерные вставки на половину кода :slightly_smiling_face: А этот код, наверное, раза в два меньше памяти потребляет. Разве это плохо?

возможно, а теперь давай допустим, он захотел зажечь их слева направо, а потом потушить справа налево. мой код не на байт не вырастет, а твой?
мне только карту переделать, а тебе?
и таких нюансов как говна за баней.
знать это не плохо, но жить с этим все тяжелее и тяжелее становится, не хватает флеша в башке)

4 лайка

Золотые слова! Я бы еще дополнил - «И применять там, где это уместно».
А еще…. А чего ещё? Перфокарты на новый лад, вот и всё )))

2 лайка

Тут могут быть разные ситуации. В каких то случаях нужно “меньше памяти”, в каких то пошустрее, но зачастую, красивше, лаконичнее, переносимее и т.п. Но, обычно, чем меньше времени ты на это всё тратишь, тем лучше. Потому что время разработки это самое ценное.

4 лайка