Enable setting the clock time via keyboard

This commit is contained in:
2020-11-08 23:24:25 +01:00
parent 0378d53456
commit ed34a0a578
6 changed files with 138 additions and 6 deletions

43
debounce.c Normal file
View File

@@ -0,0 +1,43 @@
#include <avr/io.h>
#include "debounce.h"
#include "ptimer.h"
void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,
uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,
void (*push_proc)(void), void (*rep_proc)(void) ) {
enum {idle, debounce, go_rep, wait_rep, rep};
if(!rep_time) rep_time=20;
if(!rep_wait) rep_wait=150;
uint8_t key_press = !(*KPIN & key_mask);
if( key_press && !*key_state ) {
*key_state = debounce;
timers[TIM_DEBOUNCE] = 15;
} else
if( *key_state ) {
if( key_press && debounce==*key_state && !timers[TIM_DEBOUNCE] ) {
*key_state = 2;
timers[TIM_DEBOUNCE]=5;
} else
if( !key_press && *key_state>1 && *key_state<4 ) {
if(push_proc) push_proc(); /* KEY_UP */
*key_state=idle;
} else
if( key_press && go_rep==*key_state && !timers[TIM_DEBOUNCE] ) {
*key_state = wait_rep;
timers[TIM_DEBOUNCE]=rep_wait;
} else
if( key_press && wait_rep==*key_state && !timers[TIM_DEBOUNCE] ) {
*key_state = rep;
} else
if( key_press && rep==*key_state && !timers[TIM_DEBOUNCE] ) {
timers[TIM_DEBOUNCE] = rep_time;
if(rep_proc) rep_proc(); /* KEY_REP */
}
}
if( *key_state>=3 && !key_press ) *key_state = idle;
}

36
debounce.h Normal file
View File

@@ -0,0 +1,36 @@
#ifndef __DEBOUNCE_H__
#define __DEBOUNCE_H__
/************** funkcja SuperDebounce do obsługi pojedynczych klawiszy ***************
* AUTOR: Mirosław Kardaś
* ZALETY:
* - nie wprowadza najmniejszego spowalnienia
* - posiada funkcję REPEAT (powtarzanie akcji dla dłużej wciśniętego przycisku)
* - można przydzielić róne akcje dla trybu REPEAT i pojedynczego kliknięcia
* - można przydzielić tylko jedną akcję wtedy w miejsce drugiej przekazujemy 0 (NULL)
*
* Wymagania:
* Timer programowy utworzony w oparciu o Timer sprzętowy (przerwanie 100Hz)
*
* Parametry wejściowe:
*
* *key_state - wskaźnik na zmienną w pamięci RAM (1 bajt) - do przechowywania stanu klawisza
* *KPIN - nazwa PINx portu na którym umieszczony jest klawisz, np: PINB
* key_mask - maska klawisza np: (1<<PB3)
* rep_time - czas powtarzania funkcji rep_proc w trybie REPEAT
* rep_wait - czas oczekiwania do przejścia do trybu REPEAT
* push_proc - wskaźnik do własnej funkcji wywoływanej raz po zwolenieniu przycisku
* rep_proc - wskaźnik do własnej funkcji wykonywanej w trybie REPEAT
**************************************************************************************/
void SuperDebounce( uint8_t* key_state,
volatile uint8_t* KPIN,
uint8_t key_mask,
uint16_t rep_time,
uint16_t rep_wait,
void (*push_proc)(void),
void (*rep_proc)(void)
);
#endif

38
keyboard.c Normal file
View File

@@ -0,0 +1,38 @@
#include <avr/io.h>
#include "keyboard.h"
#include "debounce.h"
#include "rtc.h"
#include "led.h"
uint8_t k_inc_hour, k_inc_minute, k_inc_second;
void inc_hour(void)
{
led_hour = (led_hour + 1) % 24;
rtc_set_time(HOUR, led_hour);
}
void inc_minute(void)
{
led_minute = (led_minute + 1) % 60;
rtc_set_time(MINUTE, led_minute);
}
void inc_second(void)
{
led_second = (led_second + 1) % 60;
rtc_set_time(SECOND, led_second);
}
void keyboard_init(void)
{
KEYBOARD_DIR &= ~(KEY_INC_HOUR | KEY_INC_MINUTE | KEY_INC_SECOND);
PORTB |= KEY_INC_HOUR | KEY_INC_MINUTE | KEY_INC_SECOND;
}
void keyboard_handle_input(void)
{
SuperDebounce(&k_inc_hour, &KEYBOARD_PIN, KEY_INC_HOUR, 20, 500, &inc_hour, &inc_hour);
SuperDebounce(&k_inc_minute, &KEYBOARD_PIN, KEY_INC_MINUTE, 20, 500, &inc_minute, &inc_minute);
SuperDebounce(&k_inc_second, &KEYBOARD_PIN, KEY_INC_SECOND, 20, 500, &inc_second, &inc_second);
}

14
keyboard.h Normal file
View File

@@ -0,0 +1,14 @@
#ifndef __KEYBOARD_H__
#define __KEYBOARD_H__
#define KEYBOARD_DIR DDRB
#define KEYBOARD_PIN PINB
#define KEYBOARD_PORT PORTB
#define KEY_INC_HOUR (1<<PB0)
#define KEY_INC_MINUTE (1<<PB1)
#define KEY_INC_SECOND (1<<PB2)
void keyboard_init(void);
void keyboard_handle_input(void);
#endif

8
main.c
View File

@@ -1,16 +1,16 @@
#include <avr/io.h> #include <avr/io.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include "keyboard.h"
#include "ptimer.h" #include "ptimer.h"
#include "i2c.h" #include "i2c.h"
#include "rtc.h" #include "rtc.h"
#include "led.h" #include "led.h"
#define I2C_BITRATE 100000UL // 100kHz #define I2C_BITRATE 100000UL // 100kHz
#define RTC_I2C_ADDR 0xA2
int main() int main()
{ {
keyboard_init();
ptimer_init(); ptimer_init();
i2c_init(I2C_BITRATE); i2c_init(I2C_BITRATE);
rtc_int0_init(); rtc_int0_init();
@@ -24,13 +24,13 @@ int main()
while(1) while(1)
{ {
keyboard_handle_input();
} }
} }
ISR(INT0_vect) ISR(INT0_vect)
{ {
struct time curr_time = rtc_read_time(RTC_I2C_ADDR); struct time curr_time = rtc_read_time();
led_hour = curr_time.hour; led_hour = curr_time.hour;
led_minute = curr_time.minute; led_minute = curr_time.minute;
led_second = curr_time.second; led_second = curr_time.second;

View File

@@ -1,7 +1,8 @@
#ifndef __PTIMER_H__ #ifndef __PTIMER_H__
#define __PTIMER_H__ #define __PTIMER_H__
#define TIMERS_COUNT 0 #define TIMERS_COUNT 1
#define TIM_DEBOUNCE 0
extern volatile uint16_t timers[TIMERS_COUNT]; extern volatile uint16_t timers[TIMERS_COUNT];