Четвер, 25.04.2024, 12:09
Приветствую Вас Гість | RSS

Radiomanoff+

Меню сайта
Форма входа
Календарь
«  Квітень 2024  »
ПнВтСрЧтПтСбНд
1234567
891011121314
15161718192021
22232425262728
2930

Дистанционное управление на Atmega8 (протокол RC-5) + матричная клавиатура(State Machine)



Дистанционное управление на Atmega8 (протокол RC-5) & матричная клавиатура(State Machine).




Теперь можно включать/выключать каналы как с помощью пульта так и с помощью матричной клавиатуры.
Сразу возникла проблема если нажатую кнопку пульта "передержать" соответствующий канал включается/выключается.А хотелось чтобы канал включился,и контролер ждал отпускания кнопки пульта,а уже потом обрабатывал следующее нажатие.
Выход нашелся в применении цикла 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