Перейти к содержанию

Функция Опроса Кнопок Для Шим


neid

Рекомендуемые сообщения

Всем привет! Никто не подскажет код опроса кнопок для моих фукнций работы лампы из Икеа. Алгоритм такой, есть три режима работы. Превый режим: ручной, прибаляем и убавляем яркость свечения лампы. Второй режим: лампа палавно тухнет и снова плавно разгорается и так до бесконечности, ну и третий просто ярко горит. Переход из режим в режим с помошью третий кнопки, вкл-режим1-кнопка3-режим2-кнопка3-режим3, 1-2-3 и так по кругу. Собираюсь делать это через функции. Помогите с идейкой!

вот привет код там уже у меня есть функция опроса кнопок, только я её не могу никак заставить работать. По разному проверял работу кнопок, упрошал код чтобы только сетодиоды горели, проверял нажатие тем самым. Не могу допереть в чем проблема. Как вы поняли я начинающий, можно сказать это первое что то более менее серьезное у меня.

#include <avr/io.h>//библиотека ввода/вывода
#include <avr/delay.h>

typedef unsigned char u8;

#define KEY_UP 1
#define KEY_DN 2
#define KEY_NEXT 4
#define KEY_NONE 0

//Програма инициализации ШИМ
void init_pwm (void)
{
 TCCR1A=(1<<COM1A1)|(1<<WGM10); //На выводе OC1A единица, когда OCR1A==TCNT1, восьмибитный ШИМ
 TCCR1B=(1<<CS10);		 //Делитель= /1
 OCR1A=0x00;			//Начальная яркость нулевая
}




// функция, которая опрашивает кнопки и возвращает код нажатой
u8 get_key(void){
  u8 temp = ~(PINC & (KEY_UP | KEY_DN | KEY_NEXT));
  _delay_ms(15);
  if(temp != (~(PINC & (KEY_UP | KEY_DN | KEY_NEXT))))
     return KEY_NONE;
  else
     return temp;
}

static void mode1(void){
  u8 key;
  while(1){
     key = get_key();
     switch(key){
     case KEY_UP: if(OCR2 < 255) OCR2++;
        break;
     case KEY_DN: if(OCR2 > 0) OCR2--;
        break;
     case KEY_NEXT:
        return;
     }
  }
}

static void mode2(void){
  u8 key;
  static signed char reverse;
  while(1){
     key = get_key();
     if(key == KEY_NEXT) return;
     if(OCR1A == 255) reverse = -1;
     if(OCR1A == 0) reverse = 1;
     OCR1A += reverse;
     _delay_ms(100);
  }
}

static void mode3(void){
  while(get_key() != KEY_NEXT);
}



//Основная програма
int main(void)
{ 

PORTC=0x07; //порт 0 1 2 как вход
DDRC=0x00;

PORTB=0x00;
DDRB=0x02; //PB1 как выход

init_pwm(); //OCRA1 инициализация

while(1){
     mode1();
     mode2();
     mode3();
  }

 }

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...