Suwmiarka/Soft/Suwmiarka/key.c

118 lines
2.3 KiB
C

/* nazwa pliku: key.c
opis: Miernik C02
Odczyt klawiszy
*/
#include "key.h"
#include "systick.h"
#include "hardware.h"
#include "stm32f10x.h"
#include <stdlib.h>
#include <stdint.h>
//------------------------zmienne globalne-------------------------//
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
*/
void 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=xTaskGetTickCount();
}
//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;
}
}
#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;
}