asis-kbr.ru

автоматические системы и системы безопасности
Текущее время: 13 ноя 2018, 07:03

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: работа с кнопками (клавиатурой)
СообщениеДобавлено: 24 июн 2013, 11:09 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
Данная библиотечка (мой вариант), реализует обработку 4-х кнопок, короткие и длинные нажатия.
Код:
//#######################################################################################################################
//#
//#    ФУНКЦИИ РАБОТЫ С КЛАВОЙ
//#
//# в начале проинитить библиотеку вызовом BtnInit();
//# организовать вызов из прерывания с частотой 100Гц - функцию BtnExe();
//# чтение значения состояния флагов кнопок производится с помощью функции BtnGet();
//#
//#######################################################################################################################

//настройка параметров работы функций
#define BTN_LOCK_TIME         30                /*время обработки дребезга в милисекундах (10-100)*/
#define BTN_LONG_TIME        1000            /*время фиксации длинного нажатия в милисекундах (1000 - 2500)*/

//настройки портов
#define BTN_PORT        PORTC                    /*порт чтения кнопок*/
#define BTN_DDR            DDRC
#define BTN_PIN         PINC                    
    #define BTN_LINE_UP     (1<<0)                /*пины чтения кнопок*/
    #define BTN_LINE_DN     (1<<1)
    #define BTN_LINE_LEFT    (1<<2)
    #define BTN_LINE_RIGHT    (1<<3)
    

//#######################################################################################################################
//глобальные переменные
volatile uint8_t BtnFlags;                        //байт флагов нажатия кнопки
    #define BTN_SHRT_UP        (1<<0)                /*бит короткого нажатия кнопки up*/ 
    #define BTN_SHRT_DN        (1<<1)                /*бит короткого нажатия кнопки dn*/ 
    #define BTN_SHRT_LEFT    (1<<2)                /*бит короткого нажатия кнопки left*/ 
    #define BTN_SHRT_RIGHT    (1<<3)                /*бит короткого нажатия кнопки right*/ 
    #define BTN_LONG_UP        (1<<4)                /*бит длинного нажатия кнопки up*/ 
    #define BTN_LONG_DN        (1<<5)                /*бит длинного нажатия кнопки dn*/ 
    #define BTN_LONG_LEFT    (1<<6)                /*бит длинного нажатия кнопки left*/ 
    #define BTN_LONG_RIGHT    (1<<7)                /*бит длинного нажатия кнопки right*/ 


//-----------------------------------------------------------------------------------------------------------------------
//функция настройки библиотеки работы с кнопками
void BtnInit (void)
{
    
    BTN_DDR 
&= ~(BTN_LINE_UP| BTN_LINE_DN| BTN_LINE_LEFT| BTN_LINE_RIGHT);    //на ввод
    BTN_PORT |= (BTN_LINE_UP| BTN_LINE_DN| BTN_LINE_LEFT| BTN_LINE_RIGHT);    //подтяжка вкл
}


//-----------------------------------------------------------------------------------------------------------------------
//функция чтения данных о нажатии кнопок
char BtnGet (void)
{
    cli ();
    char temp = BtnFlags;
    BtnFlags = 0;
    sei ();
    return temp;
}


//-----------------------------------------------------------------------------------------------------------------------
//ФУНКЦИЯ ОБРАБОТКИ НАЖАТИЙ КЛАВИШ (вызывать в прерывании с частотой 100 Гц)
//короткое нажатие устанавливает бит BTN_SHRT_X глобальной переменной BtnFlags
//длинное нажатие устанавливает бит BTN_LONG_X глобальной переменной BtnFlags
void BtnExe (void)
{
    
    static unsigned char BtnLockBit
;            //ащелка (защита от дребезга)
    static unsigned char BtnLockCoun;            //счетчик защелки (защита от дребезга)
    static unsigned char BtnLongCoun;            //счетчик длинного нажатия
    static unsigned char BtnLastState;            //последнее состояние кнопок перед отпусканием

    char mask = 0;
    if (! (BTN_PIN & BTN_LINE_UP))        mask = BTN_SHRT_UP;
    if (! (BTN_PIN & BTN_LINE_DN))        mask = BTN_SHRT_DN;
    if (! (BTN_PIN & BTN_LINE_LEFT))    mask = BTN_SHRT_LEFT;
    if (! (BTN_PIN & BTN_LINE_RIGHT))    mask = BTN_SHRT_RIGHT;
    
    if 
(mask){                                    //опрос состояния кнопки
        if (BtnLockCoun < (BTN_LOCK_TIME/10)){    //клавиша нажата
            BtnLockCoun++;
            return;                                //защелка еще не дощитала - возврат
        }
        BtnLastState = mask;
        BtnLockBit =1;                            //нажатие зафиксировано                
        if (BtnLongCoun >= (BTN_LONG_TIME/10))                                
            return
;                                //возврат, т.к. счетчик длинн нажат досчитал до максимума еще раньше        
        if (++BtnLongCoun >= (BTN_LONG_TIME/10))
            BtnFlags |= (BtnLastState<<4);        //счетчик досчитал до максимума - устанавливаем биты длинного нажатия 
    }            
    else
{                                        //клавиша отжата            
        if (BtnLockCoun){
            BtnLockCoun --;
            return;                                //защелка еще не обнулилась - возврат
        }
        if (! BtnLockBit)                        //СТАТИЧЕСКИЙ ВОЗВРАТ
            return;                                
        BtnLockBit 
=0;                            //отжатие зафиксировано
        if (BtnLongCoun < (BTN_LONG_TIME/10))
            BtnFlags |= BtnLastState;            //установка бита короткого нажатия
        BtnLongCoun = 0;                        //сброс счетчика длительности нажатия
    }
}
    


//#######################################################################################################################                 




Пример использования:
Код:
while (1){

    char BtnMask = BtnGet ();

    if (BtnMask == BTN_SHRT_UP)     {.....}//обработка короткого нажатия ВВЕРХ
    if (BtnMask == BTN_SHRT_DN)     {.....}//обработка короткого нажатия ВНИЗ
    if (BtnMask == BTN_SHRT_RIGHT)     {.....}//обработка короткого нажатия ВПРАВО
    if (BtnMask == BTN_SHRT_LEFT)     {.....}//обработка короткого нажатия ВЛЕВО

    if (BtnMask == BTN_LONG_UP)     {.....}//обработка длинного нажатия ВВЕРХ
    if (BtnMask == BTN_LONG_DN)     {.....}//обработка длинного нажатия ВНИЗ
    if (BtnMask == BTN_LONG_RIGHT)     {.....}//обработка длинного нажатия ВПРАВО
    if (BtnMask == BTN_LONG_LEFT)     {.....}//обработка длинного нажатия ВЛЕВО
} 


Вложения:
button_lib.h [4.78 КБ]
Скачиваний: 539
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Обработка клавиатуры от ЛИ.
СообщениеДобавлено: 29 авг 2013, 20:54 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
Модуль обработки клавиатуры от Леонида Ивановича.
Взял отсюда http://forum.easyelectronics.ru/viewtop ... 89#p186189
Код:
//----------------------------------------------------------------------------
//Keyboard support module
//----------------------------------------------------------------------------
#include "Main.h"
#include "Keyboard.h"


//----------------------------- Constants: -----------------------------------
#define DBOUNCE_TIME           50 //debounce time, ms
#define AUTOREPEAT_DELAY      800 //initial autorepeat delay,   mS
#define AUTOREPEAT_SLOW_RATE  180 //slow autorepeat rate,   mS
#define AUTOREPEAT_SLOW_COUNT  16   //slow autorepeat step count
#define AUTOREPEAT_FAST_RATE   60   //fast autorepeat rate,   mS


//------------------------------ Variables: ----------------------------------
static char KeyCode;


//------------------------- Function prototypes: -----------------------------
char Scan(void);


//---------------------------- Keyboard init: --------------------------------
void Keyboard_Init(void)
{
    KeyCode = KEY_NO;
}


//---------------------------- Scan keyboard: --------------------------------
char Scan(void)
{
    char d = 0xEF;
    for(char i = 0; i < 8; i++){
        Port_SCLK_0;
        if(& 0x80)     Port_DATA_1;
        else             Port_DATA_0;
        d <<= 1;
        Port_SCLK_1;
        if(Pin_RETL)    d |= 1;
    }
    switch(~& 0x0F){
        case 0x01:     d = KEY_MN; break; //key "MENU"
        case 0x02:     d = KEY_DN; break; //key "DOWN"
        case 0x04:     d = KEY_UP; break; //key "UP"
        case 0x06:     d = KEY_UD; break; //key "UP" + "DOWN"
        case 0x08:     d = KEY_OK; break; //key "OK"
        default :     d = KEY_NO;
    }
    return(d);
}


//-------------------------- Keyboard processing: ----------------------------
void Keyboard_Exe(bool t)
{
    static char LastCode = KEY_NO;
    static char TempCode = KEY_NO;
    static char DbncTimer = 0;
    static int  RepTimer = 0;
    static char RepCnt = 0;

    if(t){
        if(DbncTimer)    DbncTimer--;
        if(RepTimer)    RepTimer--;
        char k = Scan();
        if(!= LastCode){ //new press
            if(!= TempCode){ //bounce        
                TempCode = k;
                DbncTimer = ms2sys(DBOUNCE_TIME);
            }
            else{
                if (!DbncTimer){
                    if (!= KEY_NO){ //key pressed
                        RepTimer = ms2sys(AUTOREPEAT_DELAY);
                        KeyCode = k;
                    }
                    LastCode = k;
                    RepCnt = 0;
                }
            }
        }
        else{ //key holded        
            if(RepTimer == 1){ //repeat timer is over
                if(RepCnt < AUTOREPEAT_SLOW_COUNT){
                    KeyCode = k | REP_S; //slow autorepeat
                    RepTimer = ms2sys(AUTOREPEAT_SLOW_RATE);
                    RepCnt++;
                }
                else{
                    KeyCode = k | REP_F; //fast autorepeat
                    RepTimer = ms2sys(AUTOREPEAT_FAST_RATE);
                }
            }
        }
    }
}


//----------------------------- Get key code: --------------------------------
char Keyboard_GetCode(void)
{
    char code = KeyCode;
    KeyCode = KEY_NO;
    return(code);
}


//----------------------------------------------------------------------------  


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB