128 lines
2.3 KiB
C
128 lines
2.3 KiB
C
/* nazwa pliku: key.c
|
|
opis: Odczyt klawiszy
|
|
*/
|
|
|
|
#include "key.h"
|
|
#include "systick.h"
|
|
#include "hardware.h"
|
|
#include "stm32f10x.h"
|
|
#include <stdint.h>
|
|
|
|
//------------------------zmienne prywatne-------------------------//
|
|
uint8_t key,new_key;
|
|
//------------------------zmienne zewnętrzne-------------------------//
|
|
extern __IO uint32_t Tick;
|
|
|
|
//-----------------------------Funkcje------------------------------//
|
|
|
|
/* KEY_init
|
|
* \opis Konfiguracja początkowa klawiatury
|
|
*/
|
|
void Key_Initialize (void)
|
|
{
|
|
GPIO_InitTypeDef GPIO_Conf;
|
|
#ifdef USE_KEY
|
|
//włącz zegar GPIOB,EXTI
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
|
|
|
|
//klawisze - wejście
|
|
GPIO_Conf.GPIO_Pin=KEY1|KEY2;
|
|
GPIO_Conf.GPIO_Mode=GPIO_Mode_IPU;
|
|
GPIO_Conf.GPIO_Speed=GPIO_Speed_50MHz;
|
|
GPIO_Init(GPIOA,&GPIO_Conf);
|
|
|
|
//brak naciśniętych klawiszy
|
|
new_key=0;
|
|
key=0;
|
|
#else
|
|
return;
|
|
#endif
|
|
}
|
|
|
|
/* KEY_Poll
|
|
* \opis funkcja sprawdza stan klawiszy
|
|
*/
|
|
|
|
uint8_t Key_Poll (void)
|
|
{
|
|
static uint8_t key_code_tmp,key_code_old;
|
|
static uint32_t timestamp;
|
|
|
|
#ifdef USE_KEY
|
|
//sprawdzaj stan klawiatury dopiero po obsłużeniu poprzedniego klawisza
|
|
if(!new_key)
|
|
{
|
|
//1-skanuj klawiaturę
|
|
key_code_tmp=0;
|
|
if( !(PIO_Read(GPIOA)&KEY1) )
|
|
key_code_tmp=1;
|
|
if( !(PIO_Read(GPIOA)&KEY2) )
|
|
key_code_tmp=2;
|
|
|
|
//2 - debounce
|
|
if(key_code_tmp != key_code_old)
|
|
{
|
|
timestamp=Tick;
|
|
}
|
|
|
|
//zapisz ostatni kod klawisza
|
|
key_code_old=key_code_tmp;
|
|
|
|
//klawisz "siedzi", i kod klawisza różni się od ostatniego
|
|
if( (Tick - timestamp >= DEBOUNCE_DELAY) && (key!=key_code_tmp) )
|
|
{
|
|
//zapisz kod klawisza
|
|
key=key_code_tmp;
|
|
//użytkownik dostaje event tylko przy wciśnięciu klawisza, nie przy puszczeniu
|
|
if(key)
|
|
new_key=1;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//zwróć kod klawisza
|
|
if(new_key)
|
|
{
|
|
new_key=0;
|
|
return key;
|
|
}
|
|
else
|
|
return 0;
|
|
|
|
#else
|
|
return;
|
|
#endif
|
|
}
|
|
|
|
/* KEY_get
|
|
* \opis Funkcja zwraca użytkownikowi kod naciśniętego klawisza, lub 0 gdy żaden nie został naciśnięty
|
|
\return - kod klawisza lub 0
|
|
*/
|
|
|
|
uint8_t Key_Get (void)
|
|
{
|
|
if(new_key)
|
|
{
|
|
return key;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
/* KEY_clear_event
|
|
* \opis Informacja zwrotna od użytkownika - kod klawisza został obsłużony
|
|
*/
|
|
|
|
void Key_ClearEvent (void)
|
|
{
|
|
new_key=0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|