Единица управления код

Всем приветик! Занимаюсь написанием лазертака на асемблере, возникла такая проблема, необходимо написать код на единице управления, сделал кодик но в схеме протеуса начинает сама по себе работать в произвольном режиме, хотя должна работать при нажатии на кнопку, у меня кнопка выполняет функцию как фотодиод.
Ломаю голову не понимаю как правильно сделать в коде, при 0 управления все хорошо, когда ставлю единицу управления работает в произвольном режиме, кто знает как исправить данную проблему если не трудно то помогите, сам код и что в протеусе прикреплю ниже. Заранее спасибо огромное!!)


#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

// Глобальная переменная для хранения текущего индекса массива
int a = 0;

// Массив значений для вывода на PORTB
int dd[10] = {
0b00000000, 0b00000001, 0b00010010, 0b00010011, 0b00100100,
0b00100101, 0b00110110, 0b00110111, 0b01001000, 0b01001001,
};

int main(void) {
// Настройка PORTC как вход (0x00)
DDRC = 0x00;
// Настройка PORTB как выход (0xff)
DDRB = 0xff;
// Настройка PORTD как выход (0xff) для управления единицей асамбер
DDRD = 0xff;
// Включение подтягивающего резистора на PINC0
PORTC = 0b00000001;

while (1) {
// Вывод значения из массива dd на PORTB
PORTB = dd[a];

// Проверка нажатия кнопки на PINC0
if (0!= (PINC & (1 << 0))) {
// Увеличение индекса массива
a++;
// Задержка для избежания дребезга контактов
_delay_ms(1000);
// Сброс индекса, если он выходит за границы массива
if (a > 9) a = 0;
}

// Управление выводами PORTC в зависимости от значения a
if (a < 5) {
PORTC &= ~(1 << 2); // Выключение PC2
PORTC |= (1 << 3); // Включение PC3
PORTD |= (1 << 0); // Включение PD0 (управление единицей асамбер)
}
if (a > 4 && a <= 8) {
PORTC &= ~(1 << 3); // Выключение PC3
PORTC |= (1 << 1); // Включение PC1
PORTD &= ~(1 << 0); // Выключение PD0
}
if (a > 8) {
PORTC |= (1 << 2); // Включение PC2
PORTC &= ~(1 << 1); // Выключение PC1
PORTD |= (1 << 1); // Включение PD1 (возможно, другое управление асамбером)
}
}

Так попробуйте

Щас попробую и скажу

К сожалению, схема в протеусе не работает, при нажатие на кнопку фото датчика ничего не происходит

Кнопка к земле подключена?

Так вам будет понятнее

Сейчас уже занят буду. Может часа через два гляну, если смогу

Хорошо, спасибо, буду ждать, а то уже взрыв мозга начинается))

Посмотрел, теперь и у меня начинается. Если вы не тролль( а есть такой шанс), расскажите простыми словами, что это за схема, и чего вы от неё хотите.
Скажите так же, что значит “управление единицей асамбер”

(сообщение удалено автором)

Глядя на код пришёл к выводу, что это установка/очищение единицы в младшем разряде 7 сегм индикатора.
Замените в Протеусе временно фотодатчик обычной кнопкой, и проверьте в таком варианте

Спойлер
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

// Глобальная переменная для хранения текущего индекса массива
int a = 0;
uint8_t btnStatus = 0;
// Массив значений для вывода на PORTB
int dd[10] = {
  0b00000000, 0b00000001, 0b00010010, 0b00010011, 0b00100100,
  0b00100101, 0b00110110, 0b00110111, 0b01001000, 0b01001001,
};

int main(void) {
  // Настройка PORTC как вход (0x00)
  DDRC = 0x00;
  // Настройка PORTB как выход (0xff)
  DDRB = 0xff;
  // Настройка PORTD как выход (0xff) для управления единицей асамбер
  DDRD = 0xff;
  // Включение подтягивающего резистора на PINC0
  PORTC = 0b00000001;

  while (1) {
    // Вывод значения из массива dd на PORTB
    PORTB = dd[a];

    // Проверка нажатия кнопки на PINC0
    if ((PINC & (1 << 0)) == 0 && btnStatus == 0) {
      // Увеличение индекса массива
      a++; 
      // Сброс индекса, если он выходит за границы массива
      if (a > 9) a = 0;
      btnStatus = 1;  
    }

     if ((PINC & (1 << 0)) && btnStatus == 1)
        btnStatus = 0;

    // Управление выводами PORTC в зависимости от значения a
    if (a < 5) {
      PORTC &= ~(1 << 2); // Выключение PC2
      PORTC |= (1 << 3); // Включение PC3
      PORTD |= (1 << 0); // Включение PD0 (управление единицей асамбер)
    }
    if (a > 4 && a <= 8) {
      PORTC &= ~(1 << 3); // Выключение PC3
      PORTC |= (1 << 1); // Включение PC1
      PORTD &= ~(1 << 0); // Выключение PD0
    }
    if (a > 8) {
      PORTC |= (1 << 2); // Включение PC2
      PORTC &= ~(1 << 1); // Выключение PC1
      PORTD |= (1 << 1); // Включение PD1 (возможно, другое управление асамбером)
    }
    
    _delay_ms(20);
  }
}

P.S. В первый раз вижу, чтобы диоды зажигали от подтяжки.
Не всякий и загорит.

(сообщение удалено автором)

(сообщение удалено автором)

(сообщение удалено автором)

(сообщение удалено автором)

1 лайк

А я вырубаюсь , спать охота. Но не мог пропустить…))

1 лайк

Так нафига какие-то оптопары в протеусе? Нужна просто кнопка. Сигнал на пин вообще приходит?

И я о том.

1 лайк