-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdebounce.h
More file actions
151 lines (115 loc) · 5.47 KB
/
debounce.h
File metadata and controls
151 lines (115 loc) · 5.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*/**********************************************************************/
/* */
/* Debouncing 8 Keys */
/* Sampling 4 Times */
/* With Repeat Function */
/* */
/* Author: Peter Dannegger */
/* danni@specs.de */
/* */
/************************************************************************/
//source: https://www.mikrocontroller.net/topic/48465?goto=1753367#1753367
/* Short discription to the functionality of the functions
Mode 1 ('get_key_press' with 'get_key_rpt')
===========================================
time ---->
__ _________________ __
keystate ____/ \____/ \____/ \____
key_press ----X-------X----------------------X-------
key_rpt --------------------X--X--X--X-------------
key_release -------X----------------------X-------X----
| | | |
| |__|__|
| | \ /
|_______| REPEAT_NEXT
\
REPEAT_START
Mode 2 ('get_key_short' with 'get_key_long')
============================================
__ _________________ __
keystate ____/ \____/ \____/ \____
key_short -------X------------------------------X----
key_long --------------------X----------------------
key_release -------X----------------------X-------X----
Modus 3 ('get_key_short' with 'get_key_long_r' and 'get_key_rpt_l')
==================================================================
__ _________________ __
keystate ____/ \____/ \____/ \____
key_short -------X------------------------------X----
key_long_r --------------------X----------------------
key_rpt_l -----------------------X--X--X-------------
key_release -------X----------------------X-------X----
Wichtig zu wissen ist vielleicht noch, dass 'get_key_long_r' und
'get_key_rpt_l' immer zusammen abgefragt werden müssen,
auch wenn für ein Fall keine Verwendung ist. Für sich alleine liefern
die Funktionen keine brauchbaren Ergebnisse (auch nicht zusammen mit
'get_key_short').
'get_key_release' kann man in allen Modi verwenden.
Erlaubte Funktionen einer Taste:
- get_key_press()
- get_key_rpt()
- get_key_press() mit get_key_rpt()
- get_key_short() mit get_key_long()
- get_key_short() mit get_key_long_r() und get_key_rpt_l()*/
#ifndef DEBOUCE_H_
#define DEBOUCE_H_
#define F_CPU 16000000UL //16MHz
#include "inttypes.h"
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#define KEY_PIN PIND
#define KEY0 3 //Switch is connected to PD3
//#define KEY0 0
//#define KEY1 1
//#define KEY2 2
//#define LED_DDR DDRB
//#define LED_PORT PORTB
//#define LED0 0 //LED connected to PB0
//#define LED0 0
//#define LED1 1
//#define LED2 2
#define REPEAT_MASK (1<<KEY0) // repeat: key0
#define REPEAT_START 50 // after 500ms
#define REPEAT_NEXT 1 // every 10ms
extern volatile uint8_t key_state; // debounced and inverted key state: bit = 1: key pressed
extern volatile uint8_t key_press; // key press detect
extern volatile uint8_t key_release; // key release detect
extern volatile uint8_t key_rpt; // key long press and repeat
uint8_t get_key_press( uint8_t key_mask ); //Indicates if a key-press got deteced (no matter if long or short)
uint8_t get_key_rpt( uint8_t key_mask ); //Indicates "true" repeated if the key stays pressed down (only for use with short press)
uint8_t get_key_short( uint8_t key_mask ); //Indicates a short press (true by falling edge)
uint8_t get_key_long( uint8_t key_mask ); //Indicates a long press (true after a delay from rising edge)
uint8_t get_key_release( uint8_t key_mask ); //Indicates negative edge
uint8_t get_key_long_r( uint8_t key_mask ); //Indicates a long press with use of the repeat function for long press (works only with mutal use of get_key_rpt_l)
uint8_t get_key_rpt_l( uint8_t key_mask ); //Indicates "true" repeated if the key stays pressed down (only for use with get_key_long_r press)
//Further discription see above
#endif /* DEBOUCE_H_ */
/*_______________________________________________________________________________________
Get-Key-Common https://www.mikrocontroller.net/topic/48465?goto=1753367#1753367
So, jetzt noch einfacher, mit ner extra Funktion für die 2 Tasten
Erkennung.
Man kann auch auswählen, ob der Druck beider Tasten innerhalb einer
bestimmte Zeit erfolgen soll (#define TIMEOUT)
uint8_t get_key_common( uint8_t key_mask )
{
return get_key_press((key_press & key_mask) == key_mask ? key_mask : 0);
}
// ...
//#define TIMEOUT
for(;;){ // main loop
#ifdef TIMEOUT
if( get_key_short( 1<<KEY0 ) || get_key_long( 1<<KEY0 ))
LED_PORT ^= 1<<LED0;
if( get_key_short( 1<<KEY1 ) || get_key_long( 1<<KEY1 ))
LED_PORT ^= 1<<LED1;
#else
if( get_key_short( 1<<KEY0 ))
LED_PORT ^= 1<<LED0;
if( get_key_short( 1<<KEY1 ))
LED_PORT ^= 1<<LED1;
#endif
if( get_key_common( 1<<KEY0 | 1<<KEY1 ))
LED_PORT ^= 1<<LED2;
}
______________________________________________________________________________________*/