Всем приветик! Занимаюсь написанием лазертака на асемблере, возникла такая проблема, необходимо написать код на единице управления, сделал кодик но в схеме протеуса начинает сама по себе работать в произвольном режиме, хотя должна работать при нажатии на кнопку, у меня кнопка выполняет функцию как фотодиод.
Ломаю голову не понимаю как правильно сделать в коде, при 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. В первый раз вижу, чтобы диоды зажигали от подтяжки.
Не всякий и загорит.