-
Notifications
You must be signed in to change notification settings - Fork 0
/
buttons.c
123 lines (98 loc) · 2.34 KB
/
buttons.c
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
/* ========================================
*
* Inspired from http://www.kennethkuhn.com/electronics/debounce.c
*
* ========================================
*/
#include "buttons.h"
#define SAMPLE_TIME 5 //ms
#define DEBOUNCE_TIME 50 //ms
#define MAX_COUNT DEBOUNCE_TIME/SAMPLE_TIME
#define SW1_STATE (uint8)((SW1_PS & SW1_MASK) >> SW1_SHIFT)
#define SW2_STATE (uint8)((SW2_PS & SW2_MASK) >> SW2_SHIFT)
#define SW3_STATE (uint8)((SW3_PS & SW3_MASK) >> SW3_SHIFT)
//unsigned int input; /* 0 or 1 depending on the input signal */
uint8_t count1, count2, count3; /* Will range from 0 to the specified MAXIMUM */
uint8_t out1, out2, out3; /* Cleaned-up version of the input signal */
//Polled every SAMPLE_TIME ms from main()
void debounceButtons(void)
{
//Debounce SW1
if (SW1_STATE == 1) //sw inactive
{
if (count1 > 0)
count1--;
}
else if (count1 < MAX_COUNT)
count1++;
if (count1 == 0)
out1 = 0;
else if (count1 >= MAX_COUNT)
{
out1 = 1;
count1 = MAX_COUNT; //theoretically not needed
}
//Debounce SW2
if (SW2_STATE == 1) //sw inactive
{
if (count2 > 0)
count2--;
}
else if (count2 < MAX_COUNT)
count2++;
if (count2 == 0)
out2 = 0;
else if (count2 >= MAX_COUNT)
{
out2 = 1;
count2 = MAX_COUNT; //theoretically not needed
}
//Debounce SW3
if (SW3_STATE == 1) //sw inactive
{
if (count3 > 0)
count3--;
}
else if (count3 < MAX_COUNT)
count3++;
if (count3 == 0)
out3 = 0;
else if (count3 >= MAX_COUNT)
{
out3 = 1;
count3 = MAX_COUNT; //theoretically not needed
}
} //processButtons
void updateOutputs(void)
{
uint32_t temp;
//Update based on output
/*if (out1 == 1)
PWM_Buzzer_Start();
else
PWM_Buzzer_Stop();
*/
if (out2) {
temp = PWM_Buzzer_ReadPeriod();
temp = temp - 100;
if (temp < 6000)
temp = 6000;
/*
PWM_Buzzer_Stop();
PWM_Buzzer_WritePeriod(temp);
PWM_Buzzer_WriteCompare(temp/2);
PWM_Buzzer_Start();
*/
PWM_Buzzer_WritePeriodBuf(temp);
PWM_Buzzer_WriteCompareBuf(temp/2);
}
if (out3) {
temp = PWM_Buzzer_ReadPeriod();
temp = temp + 100;
if (temp > 24000)
temp = 24000;
PWM_Buzzer_WritePeriodBuf(temp);
PWM_Buzzer_WriteCompareBuf(temp/2);
}
}
/* [] END OF FILE */