Меню сайта
Календарь
|
Дистанционное управление на Atmega8 (протокол RC-5) + матричная клавиатура(State Machine)Дистанционное управление на 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. Ссылки на источники: |
Архив записей
Друзья сайта
Статистика
Онлайн всього: 1 Гостей: 1 Користувачів: 0 |