Скачиваний:
0
Добавлен:
12.02.2026
Размер:
2.6 Кб
Скачать
#include <avr/io.h>
#define F_CPU 8000000ul
#include <util/delay.h>
#include <avr/interrupt.h>

#define LED_Count 4
#define Color_Count 3

uint8_t Red = 0xFF;
uint8_t Blue = 0;
uint8_t Green = 0;
uint8_t Phase = 0;

void send_1(){ // Отправка 1
	PORTA = (1 << PORTA6); // HIGH сигнал
	asm __volatile__("nop;\n nop;\n nop;\n nop;"); // Ожидание 4 такта
	PORTA = 0; // LOW сигнал
	asm __volatile__("nop;"); // Ожидание 1 такт
}

void send_0(){ // Отправка 0
	PORTA = (1 << PORTA6); // HIGH сигнал
	asm __volatile__("nop;"); // Ожидание 1 такт
	PORTA = 0; // LOW сигнал
	asm __volatile__("nop;\n nop;\n nop;\n nop;"); // Ожидание 4 такта
}

void send_color(uint8_t color) // Сравнение битов в коде цвета
{
	for (uint8_t i = 0; i < 8 ; i++) // Перебор битов
	{
		if (color & (1 << 7)) //Если последний бит 1
		{
			send_1(); // Отправляем 1
		}
		else
		{
			send_0(); // Иначе отправляем ноль
		}
		color <<= 1; // Сдвигаем вправо код цвета
	}
}

void send_data(){ // Отправка данных на диоды
	for (uint8_t i = 0; i < LED_Count; i++) // Для каждого из диодов
	{
		send_color(Green); // Зелёный цвет
		send_color(Red); // Красный цвет
		send_color(Blue); // Синий цвет
	}
	_delay_us(60); // Пауза, что закончили передачу
}

int main(void)
{
    // Инициализация пинов
    DDRA |= (1 << DDRA6); // Пин А6 - выход
    PORTA &= ~(1 << PORTA6); // На выходе по умолчанию 0
	
	// Настройки ядра
	CCP = 0xD8; // Разблокируем настройки процессора
	CLKPSR = 0; // Предделитель процессора 0
    while (1) 
    {
		for(uint8_t i = 0; i < LED_Count; i++) // инициализация диодов
		{
			switch (Phase){ // Проверяем фазу
				case 0: // Красный -> Оранжевый -> Жёлтый
				if(Green == 0xFF){ //Проверяем верх
					Phase++; //Если достигли - след. фаза
				}
				else{ // Иначе - ВСЁ НА ЗЕЛЁНОЕ!
					Green++;
				}
				break;
				case 1: // Жёлтый -> Зелёный
				if(Red == 0){ // Тут по аналогии
					Phase++; // Но уменьшаем красный
				}
				else{
					Red--;
				}
				break;
				case 2: // Зелёный -> Голубой
				if(Blue == 0xFF){
					Phase++;
				}
				else{
					Blue++;
				}
				break;
				case 3: // Голубой -> Синий
				if(Green == 0){
					Phase++;
				}
				else{
					Green--;
				}
				break;
				case 4: // Синий -> Фиолетовый
				if(Red == 0xFF){
					Phase++;
				}
				else{
					Red++;
				}
				break;
				case 5: // Фиолетовый -> Красный
				if(Blue == 0){ // Сбрасываем фазу
					Phase = 0; // т.к. она последняя
				}
				else{
					Blue--;
				}
				break;
			}
		}
		send_data();
		_delay_ms(5);
    }
}
Соседние файлы в папке GccApplication1