Добавил:
koba004
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы / 5 / lab_5 / GccApplication1 / main
.c#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
