Форум по микроконтроллерам: Обработка кнопок - Форум по микроконтроллерам

Перейти к содержимому

  • 5 Страниц +
  • 1
  • 2
  • 3
  • 4
  • Последняя »
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Обработка кнопок

#21 Пользователь офлайн   BiNaR 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 64
  • Регистрация: 01 Август 12
  • ГородNovosibirsk

Отправлено 04 Август 2012 - 07:49

Просмотр сообщенияAlex (03 Август 2012 - 13:12) писал:

Скиньте свой проект сюда, всю папочку целиком.


Я хочу чтобы получилось:
При нажатии Kn_Enter появлялось на дисплее - Front_Balans,
При повторном нажатии - Rear_Balans,
Еще раз нажал - Center_volume, и т.д. после последнего пункта, при нажатии на Kn_Enter начинал опять с пункта 1.

Kn_Return для выхода из меню

При нажатии Kn_Mute надпись Mute_ON (В проекте есть), при повторном нажатии Mute_OFF и основной экран
Kn_Stb включает и выключает мк. соответственно

Прикрепленные файлы

  • Прикрепленный файл  123.rar (76,39К)
    Количество загрузок:: 171

Сообщение отредактировал BiNaR: 04 Август 2012 - 11:52

0

#22 Пользователь офлайн   MuKeXa 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 15 Февраль 11
  • ГородУкраина. Киев/ Брусилов/ Фастов

Отправлено 04 Август 2012 - 10:28

с knMute, чтото перепутали ;)
0

#23 Пользователь офлайн   BiNaR 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 64
  • Регистрация: 01 Август 12
  • ГородNovosibirsk

Отправлено 04 Август 2012 - 11:53

Просмотр сообщенияMuKeXa (04 Август 2012 - 10:28) писал:

с knMute, чтото перепутали ;)


Исправил... :rolleyes:
0

#24 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 882
  • Регистрация: 15 Февраль 11

Отправлено 04 Август 2012 - 12:45

Цитата

Я хочу чтобы получилось:

То, что Вы хотите, попробуете сделать сами :)
А я поправил Ваш исходник для одной кнопкой и переключением между двумя режимами.
Прикрепленный файл  123.rar (174,52К)
Количество загрузок:: 349
Разбирайтесь.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#25 Пользователь офлайн   BiNaR 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 64
  • Регистрация: 01 Август 12
  • ГородNovosibirsk

Отправлено 04 Август 2012 - 13:03

Просмотр сообщенияAlex (04 Август 2012 - 12:45) писал:

Цитата

Я хочу чтобы получилось:

То, что Вы хотите, попробуете сделать сами :)
А я поправил Ваш исходник для одной кнопкой и переключением между двумя режимами.
Прикрепленный файл  123.rar (174,52К)
Количество загрузок:: 349
Разбирайтесь.


:ay: Спасибо вам БОЛЬШУЩЕЕ! За помощь. Мне гораздо удобнее разбираться на готовом примере, чем читать теории....

Только вот еще один маленький вопросик:
ADCON1=7; - это так понял аналоговый вход.выход?
тогда почему 1? и почему=7? :rolleyes:

Сообщение отредактировал BiNaR: 04 Август 2012 - 13:06

0

#26 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 460
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 04 Август 2012 - 15:28

Цитата

Только вот еще один маленький вопросик:
ADCON1=7; - это так понял аналоговый вход.выход?
тогда почему 1? и почему=7? :rolleyes:


Каналы PORTA мультиплексированы с аналоговыми входами АЦП и аналоговым входом источника опорного напряжения VREF+ и VREF-.
Если модуль АЦП не задействуется, то при конфигурации нужно настроить линии порта как цифровые каналы,

т.е. ADCON1=7 настройка как цифровые каналы.

0

#27 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 372
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 04 Август 2012 - 16:36

pic18f252 Откроем даташит и посмотрим ADCON1.
7 это 0000.0111. Нас интересует, почему 7? В таблице есть первые 4 бита, 011х. Это и есть включение всех выводов как цифровые. Вот она 7. А остальные нас не интресуют, АЦП не включено.
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#28 Пользователь офлайн   BiNaR 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 64
  • Регистрация: 01 Август 12
  • ГородNovosibirsk

Отправлено 05 Август 2012 - 11:08

Все понял, спасибо за помощь.
Теперь освоил, как задействовать кнопки, двигаемся дальше... :rolleyes:
0

#29 Пользователь офлайн   MuKeXa 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 15 Февраль 11
  • ГородУкраина. Киев/ Брусилов/ Фастов

Отправлено 23 Сентябрь 2012 - 19:12

Alex , я никак с mikroС не слезу ) Не подскажешь особенности подключения библиотеки? И реально ли её подключить, у меня что-то не получается (. А стандартная функция "Button" не очень подходит.
Заранее благодарен!

UPD
Проблемная строка
const unsigned int  _name##_port = (unsigned int)&_port_name

привожу к виду
const unsigned int  _name##_port = &_port_name

компилируется, но не работает (. Смотрю дальше...
UPD
Блин, я кажись опрос забыл поставить... Ноут уже выключил, завтра гляну )

Сообщение отредактировал MuKeXa: 23 Сентябрь 2012 - 21:48

0

#30 Пользователь офлайн   MuKeXa 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 15 Февраль 11
  • ГородУкраина. Киев/ Брусилов/ Фастов

Отправлено 24 Сентябрь 2012 - 20:53

Вышел из ситуации заменив выше указанную строчку на:
unsigned int  _name##_port = &_port_name

Нету больше константы...
Но, если на 16f628a такое прокатило, то на 12f683 нет (. Притом Протеус не хочет работать с cof файлом для этого камня. Или это MikroC выделывается или Протеус... И проанализировать, что не так, не могу. Через недельку с отпуска выхожу, буду в железе смотреть, может оно и работать будет.
Спасибо!
0

#31 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 882
  • Регистрация: 15 Февраль 11

Отправлено 25 Сентябрь 2012 - 18:31

Если честно, я не знаю как себя будет вести МикроС с данным годом. К сожалению, не знаю его проблемы и нюансы синтаксиса, так-же как и его самого... По этому, что-либо посоветовать, увы, не могу.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#32 Пользователь офлайн   MuKeXa 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 15 Февраль 11
  • ГородУкраина. Киев/ Брусилов/ Фастов

Отправлено 25 Сентябрь 2012 - 18:58

Я иду на такие авантюры, чтобы разобраться в чужих кодах. Если есть проблемма в использовании, то начинаешь вникать, а не просто взял и пользуешься )
Спасибо за библиотеку!
ОФ. Если не трудно, может кто глянуть работает ли протеус с 'cof' других компиляторов и pic12f683.Ответ можно в ЛС или в 'курилку', дабы не засорять тему )

Upd. Тысячу извинений!!! Каким то макаром слетели настройки проекта. Mclr выключен и к нему кнопка. Так вот после слетания настройки установились по-умолчанию и mclr начал работать как сброс. Я вот только сейчас заметил, что после нажатия кнопки менялся уровень на нескольких пинах сразу... Вот уж и удобство настройки. Хотя это первый раз такое за весь период работы с этим компилятором. Может сам нажал чего... Короче, всё работает! Единственное изменение в библиотеке описано мною выше.
'Alex', огромное спасибо!

Сообщение отредактировал MuKeXa: 25 Сентябрь 2012 - 21:11

0

#33 Пользователь офлайн   MuKeXa 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 15 Февраль 11
  • ГородУкраина. Киев/ Брусилов/ Фастов

Отправлено 28 Сентябрь 2012 - 22:59

Из-за того, что ".cnt_ms" очищается по отпусканию, возникает сложность отследить время которое она была в нажатом состоянии.
Например? нам нужно проинвертировать светодиод если кнопка удерживалась одну секунду:
if(My_Butt.cnt_ms>=1000){
             GP0_bit = ~GP0_bit;}

Но в таком случае она будет инвертироваться пока мы держим кнопку. И в каком она состоянии окажется по отпусканию еще попробуй угадать.
Потому я немножко внёс изменения в структуру T_Butt, а именно добавил еще один счетчик, который очищаю самостоятельно:
//button.h
typedef struct {
    unsigned        stat : 1;
    unsigned        prev : 1;
    unsigned        click : 1;
    unsigned int    cnt_ms;
    unsigned int    prev_cnt_ms;
}T_Butt;
.....
_name.prev_cnt_ms = _name.cnt_ms += PERIOD_BUTT_TICK;
.....

//main.c
....
if(My_Butt.prev_cnt_ms>=1000 && !My_Butt.stat){
             My_Butt.prev_cnt_ms=0;
             GP0_bit = ~GP0_bit;
        }
....


Надеюсь Alex не против ). Ну и если есть замечания, то с удовольствием выслушаю.
0

#34 Пользователь офлайн   nick14 

  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 460
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 28 Сентябрь 2012 - 23:29

Цитата


Надеюсь Alex не против ). Ну и если есть замечания, то с удовольствием выслушаю.


Почему Алекс должен быть против?:friends:
0

#35 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 882
  • Регистрация: 15 Февраль 11

Отправлено 28 Сентябрь 2012 - 23:29

Странно, почему я должен быть против :rolleyes:
cnt_ms так-же можно сбрасывать самостоятельно, что я очень часто и делаю.

if(My_Butt.cnt_ms>=1000){
      My_Butt.cnt_ms=0;
      GP0_bit = ~GP0_bit;
}

Не говорите что мне делать, и я не скажу куда Вам идти !
0

#36 Пользователь офлайн   MuKeXa 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 15 Февраль 11
  • ГородУкраина. Киев/ Брусилов/ Фастов

Отправлено 29 Сентябрь 2012 - 08:48

Это же твоя библиотека, авторские права никто не отменял ) А условий использования я не наблюдал.

В таком случае(если сбрасывать cnt_ms) светодиод будет инвертироваться каждую секунду, если кнопку не отпускать. Тут угадать с его состоянием легче, но вроде как тоже не очень красиво.
0

#37 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 882
  • Регистрация: 15 Февраль 11

Отправлено 29 Сентябрь 2012 - 15:27

Я не против, делайте с кодом что Вашей душе угодно )

В этом случае, достаточно завести флаг (хоть свой, хоть в структуре) который будет устанавливаться при превышении времени нажатия кнопки, а сбрасываться при отпускании кнопки. По нему уже можно будет судить было ли длинное нажатие и отпускалась ли кнопка после него.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#38 Пользователь офлайн   MuKeXa 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 15 Февраль 11
  • ГородУкраина. Киев/ Брусилов/ Фастов

Отправлено 29 Сентябрь 2012 - 20:20

Если сбрасывать по отпускании то это равносильно твоему предыдущему примеру (чутка выше сообщение). В таком случае светодиод будет мигать, так как флаг установлен пока не отпустим кнопку. Тут только "мануально" наверное. Вариант с флагом экономичнее в плане памяти, но нужно на каждое время нажатия кнопки заводить свой флаг. Если добавить счетчик, то сравнениями можно добиться любого количества вариантов нажатий. Хотя обычно - это "короткое/длинное" нажатие. За наводку с флагами, в очередной раз, спасибо! :thank_you2:
0

#39 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 882
  • Регистрация: 15 Февраль 11

Отправлено 29 Сентябрь 2012 - 21:32

Значит нужно завести флаг, который устанавливается при совпадении счётчика с константой (например 1000 мс.), а сбрасывать этот флаг только самому. Тогда он второй раз не установится, пока не отпустишь кнопку и счётчик не начнёт считать сначала и не дойдёт снова до константы. Т.б. его устанавливать не по условию ">=", а по "==".
Флаг нужно запихнуть в структуру, а условие совпадение и его установку - в обработку кнопок.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#40 Пользователь офлайн   MuKeXa 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 197
  • Регистрация: 15 Февраль 11
  • ГородУкраина. Киев/ Брусилов/ Фастов

Отправлено 29 Сентябрь 2012 - 21:53

Блин... из-за проблемы с модемом не могу прикрепить или закачать файл...
Выложу текстом:
Компилятор mikroC
/****************************************************************/
/*  buttons.h                                                   */
/*  Файл для работы с кнопками                                  */
/*  Автор:      Alex                                            */
/*              e-mail: al.kl@list.ru                           */
/*              url:    http://forum.chipmk.ru                  */
/****************************************************************/

/****************************************************************/
#define PERIOD_BUTT_TICK    25      // Период опроса кнопок в Мс.
#define BUTTON_ACT_LEVEL    0       // Активный уровень кнопок
#define L_BUTT_MS    1000      // Время в милисекундах после которого фиксируется "длинное" нажатие кнопки, иначе "короткое"
/****************************************************************/
typedef struct {
    unsigned        stat : 1;
    unsigned        prev : 1;
    unsigned        click : 1;
    unsigned        l_click : 1;
    unsigned int    cnt_ms;
}T_Butt;
/****************************************************************/
#define Butt_Init(_name, _port_name, _bit_num)                \
T_Butt  _name;                                                \
const unsigned char _name##_bit = _bit_num;                   \
unsigned int _name##_port = &_port_name
/****************************************************************/
#define Butt_Tick(_name)                                          \
_name.stat=!BUTTON_ACT_LEVEL;                                     \
if(*((unsigned int*)_name##_port)&(1<<_name##_bit))               \
    _name.stat=BUTTON_ACT_LEVEL;                                  \
if(_name.prev && !_name.stat && (_name.cnt_ms<L_BUTT_MS))         \
    {_name.l_click=0;_name.click=1;}                              \
else if(_name.prev && !_name.stat && (_name.cnt_ms>=L_BUTT_MS))   \
    {_name.click=0; _name.l_click=1;}                             \
if(_name.stat)                                                    \
    _name.cnt_ms+=PERIOD_BUTT_TICK;                               \
else                                                              \
    _name.cnt_ms=0;                                               \
_name.prev=0;                                                     \
if(_name.stat)                                                    \
    _name.prev=1
/****************************************************************/


Пример:
Если коротко нажимаем кнопку - реверс светодиода(двухцветный на одном порту)
Если длинно - выключаем светодиод
Если светодиод выключен и коротко кликаем - включается светодиод из предыдущим значением.

#include "buttons.h"
Butt_Init(My_Butt, GPIO, 3);

// объявляем TMR1 как двубайтную переменную по адресу TMR1L, для удобства.
sfr static volatile unsigned int TMR1 absolute 0x000E;

bit led_port_on; // порт вкл/откл

void interrupt() // прерывания
{
if(TMR1IF_bit){   // Если событие от таймера
        TMR1IF_bit=0;               // Сбрасываем флаг события
        TMR1-=50000;            // Переустанавливаем таймер на 50000 тактов (25мс.).
        Butt_Tick(My_Butt);     // Опрос кнопки My_Butt
       }
}

void main() {
 TMR1ON_bit = 1;       // Включить TMR1
 TMR1IF_bit = 0;       // Сбросить флаг от TMR1
 TMR1IE_bit = 1;       // Разрешить прерывания от TMR1
 TMR1 = -50000;    // Установить TMR1 на 50000 тактов

 PEIE_bit = 1;         // Разрешаем прерывания от перефирии (нужно для TMR1)
 GIE_bit = 1; //разрешено, глобальные прерывания

 ANSEL = 0x00; // ADC отключен
 CMCON0  = 0x07; //Компаратор отключен
 
 TRISIO0_bit = 1; //
 TRISIO1_bit = 0; // выход светодиода
 TRISIO2_bit = 0; //
 TRISIO3_bit = 1; // вход, кнопка управления
 TRISIO4_bit = 0; //
 TRISIO5_bit = 0; //
 GPIO = 0; // устанавливаем на выходах 0

led_port_on = 1;

 // Работаем пока не выключат
 while (1)
 {
 Delay_ms(5);
       // если коротко кликнули кнопкой делаем реверс
    if(My_Butt.click){
         My_Butt.click=0;          // Сбрасываем флаг
                      if (!led_port_on) {
                         TRISIO1_bit = 0;
                         led_port_on = 1;
                         }
                      else {
                         GP1_bit = ~GP1_bit;
                         }

        }
    // Если кнопка нажата более 1 сек. выключаем
    if(My_Butt.l_click){
             My_Butt.l_click = 0; // Сбрасываем флаг
             led_port_on = 0;
             TRISIO1_bit = 1;
        }
 }
}


Файл Протеуса предоставить не могу, по тех.причинам :blush:
0

Поделиться темой:


  • 5 Страниц +
  • 1
  • 2
  • 3
  • 4
  • Последняя »
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей