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

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


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 пользователей онлайн

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

    • Ведь этож надо... такое совпадение. И я тоже делаю без сверлений. Более того, прилагаю фото имеющихся у меня  "хоть чуток острых предметов", несмотря на наличие которых, столь несложный и общедоступный  способ зачистки, к.м.к.  имеет право на демонстрацию в данной теме. Вдруг кому-то пригодится... Тем более, что тема простаивает аж с марта, будто на белом свете нет ничего, что можно было бы сюда  разместить,  хотя бы для сведения. 
    • В описании сказано, что МК включится после размыкания кнопки включения.
    • Мои слова ни как не относятся к тому куску кода Знаете что такое функция, аргумент, результат?
    • Устройство сделано на базе МК ATtiny44A. Так как девайс нужен был мобильный, то в качестве индикатора был выбран модуль ЖКИ на НТ1621. Схема устройства: Так как питание девайса 3 В, то пришлось на плате дисплея заменить резистор контрастности и резистор подсветки ЖКИ. R1 установил 4,7 кОм в место 20 кОм, а R2 в место 100 Ом поставил 300 Ом. Прошивка для МК: test_LCD.hex МК тактируется на заводских установках (от внутреннего генератора 1 МГц.)   Аккумулятор Li-ion 1100 мАч. В качестве зарядного устройства, используется модуль ТР4056.   При полной зарядке аккумулятора, устройство работает без подзаряда около 27 дней. Индикатор на дисплее, помогает визуально контролировать уровень заряда для последующей подзарядки аккумулятора. При напряжении на аккумуляторе ниже 3,4 В подсветка индикатора гаснет для снижении потребляемого тока. Подсветка гаснет и в ночное время (при недостаточном освещении), чтобы свет дисплея не мешал во время сна.
    • @korsaj Ну согласно твоих слов и этот код примерно тоже самое и получается. Я и не вижу особых отличий. Но нужно только как то доработать чтоб оно работало. В том то всё и дело что оно не работает. А учитывая как раз таки что мне нужны будут определённые фрагменты где хранятся данные, то это очень хорошее решение, но нужно его доработать до рабочего состояния.
    • Чет непонятка у меня образовалась. Измерял индуктивность первички ТВЗ двумя методами: Василича и из книги Цыкина И чет всё разное получилось. ХЗ чему верить. Если по Василичу, то у ТОРа индуктивность растет вместе с амплитудой напряжения. 645Гн мне совсем много показалось. По Цыкину у ТОРа наоборот падает... У  ШЛМ сердечника +/- хотя бы рядом значения. В общем, может объясните? Может неправильно что сделал?  
    • Это условно упрощенный А вы ченить навояли?
×
×
  • Создать...