Дистанционное управление на Atmega8 (протокол RC-5) & матричная клавиатура(State Machine).
Наконец-то объеденил Дистанционное управление на Atmega8 (протокол RC-5) и Опрос матричной клавиатуры. Пример использования автомата (State Machine) для Atmega8 в одно целое.
Теперь можно включать/выключать каналы как с помощью пульта так и с помощью матричной клавиатуры.
Сразу возникла проблема если нажатую кнопку пульта "передержать" соответствующий канал включается/выключается.А хотелось чтобы канал включился,и контролер ждал отпускания кнопки пульта,а уже потом обрабатывал следующее нажатие.
Выход нашелся в применении цикла while.
Вот исходный файл du_klava_new.c:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "rc5.h"
#include "main.h"
#include "keyboard.h"
int main (void)
{
unsigned char buf = 0;
DDRB &= ~_BV(PB0);//PB0 вход
PINB &= ~_BV(PB0);//PB0 с подтяжкой
//PORTB = 0b00000000; DDRB = 0b00000000;
//PORTC = 0b00000000; DDRC = 0b00000000;
PORTD = 0b00000000; DDRD = 0b11111111; // тут светодиоды
Rc5_SetRx(); // инициализируем таймер 1
KEYB_Init(); // инициализируем клавиатуру
sei(); // глобально разрешаем прерывания
while(1)
{
if (rc5.dataOK) // если получены данные с ПДУ
{
if (rc5.command==1) // если это кнопка 1
{
if (CheckBit(PIND, 0)) cbi(PORTD, 0); //если канал 1 включен, выключаем
else sbi(PORTD, 0); // если канал 1 выключен, включаем
}
if (rc5.command==2) // если это кнопка 2
{
if (CheckBit(PIND, 1)) cbi(PORTD, 1); //если канал 2 включен, выключаем
else sbi(PORTD, 1); // если канал 2 выключен, включаем
}
if (rc5.command==3) // если это кнопка 3
{
if (CheckBit(PIND, 2)) cbi(PORTD, 2); //если канал 3 включен, выключаем
else sbi(PORTD, 2); // если канал 3 выключен, включаем
}
if (rc5.command==4) // если это кнопка 4
{
if (CheckBit(PIND, 3)) cbi(PORTD, 3); //если канал 4 включен, выключаем
else sbi(PORTD, 3); // если канал 4 выключен, включаем
}
_delay_ms(200); //задержка 200 мс
rc5.dataOK = 0; // сбрасываем флаг
_delay_ms(20);
while (rc5.dataOK) //ждем отпускания кнопки
{
//_delay_ms(20); //задержка 20 мс
rc5.dataOK = 0; // сбрасываем флаг
_delay_ms(200);
}
}
_delay_ms(10);
KEYB_ScanKeyboard();
buf = KEYB_GetKey();
if (buf=='1')
{
if (CheckBit(PIND, 0)) cbi(PORTD, 0); //если канал 1 включен, выключаем
else sbi(PORTD, 0); // если канал 1 выключен, включаем
}
if (buf=='2')
{
if (CheckBit(PIND, 1)) cbi(PORTD, 1); //если канал 1 включен, выключаем
else sbi(PORTD, 1); // если канал 1 выключен, включаем
}
if (buf=='3')
{
if (CheckBit(PIND, 2)) cbi(PORTD, 2); //если канал 1 включен, выключаем
else sbi(PORTD, 2); // если канал 1 выключен, включаем
}
if (buf=='4')
{
if (CheckBit(PIND, 3)) cbi(PORTD, 3); //если канал 1 включен, выключаем
else sbi(PORTD, 3); // если канал 1 выключен, включаем
}
if (buf=='5')
{
if (CheckBit(PIND, 4)) cbi(PORTD, 4); //если канал 1 включен, выключаем
else sbi(PORTD, 4); // если канал 1 выключен, включаем
}
if (buf=='6')
{
if (CheckBit(PIND, 5)) cbi(PORTD, 5); //если канал 1 включен, выключаем
else sbi(PORTD, 5); // если канал 1 выключен, включаем
}
if (buf=='7')
{
if (CheckBit(PIND, 6)) cbi(PORTD, 6); //если канал 1 включен, выключаем
else sbi(PORTD, 6); // если канал 1 выключен, включаем
}
if (buf=='8')
{
if (CheckBit(PIND, 7)) cbi(PORTD, 7); //если канал 1 включен, выключаем
else sbi(PORTD, 7); // если канал 1 выключен, включаем
}
}
}
Вот проект в AVR Studio 4 - http://radiomanoff.at.ua/load/du_klava/1-1-0-17 ,для четырех каналов PD0-PD4.
Ссылки на источники: