Подскажите пожалуйста варианты обработки кнопочек, для меню.
Спасибо.
Код: Выделить всё
if (ButtonFilter[N] == BTN_PRESS_DURATION) {
DoPressCallback(N);
} else if (ButtonFilter[N] == BTN_LONG_PRESS_DURATION) {
DoLongPressCallback(N);
} else if (ButtonFilter[N] == BTN_LONG_PRESS_REPEAT_DURATION) {
DoPressRepeatCallback(N);
ButtonFilter[N] -= BTN_REPEAT_DURATION;
}
Код: Выделить всё
#define BTN_FILTER 50
uint8_t Buttons_Tmr[3];
void ButtonsRd(void) {
// Power
if (GPIOA->IDR & GPIO_IDR_5) {
if (Buttons_Tmr[0] < BTN_FILTER * 5) {
Buttons_Tmr[0]++;
if (Buttons_Tmr[0] == BTN_FILTER * 5) {
Buttons_Tmr[0]++;
OnBtnPress(0);
}
}
} else {
if (Buttons_Tmr[0]) {
Buttons_Tmr[0]--;
}
}
// Next
if (GPIOA->IDR & GPIO_IDR_9) {
if (Buttons_Tmr[1] < BTN_FILTER) {
Buttons_Tmr[1]++;
if (Buttons_Tmr[1] == BTN_FILTER) {
Buttons_Tmr[1]++;
OnBtnPress(1);
}
}
} else {
if (Buttons_Tmr[1]) {
Buttons_Tmr[1]--;
}
}
// Mode
if (GPIOA->IDR & GPIO_IDR_10) {
if (Buttons_Tmr[2] < BTN_FILTER) {
Buttons_Tmr[2]++;
if (Buttons_Tmr[2] == BTN_FILTER) {
Buttons_Tmr[2]++;
timer = 0;
OnBtnPress(2);
}
}
} else {
if (Buttons_Tmr[2]) {
Buttons_Tmr[2]--;
}
}
}
int main(void) {
// Инициализация пропущена, оставлен только основной цикл
while(1) {
__WFI();
ButtonsRd();
Job();
}
}
Код: Выделить всё
void ButtonFilfer(uint8_t ButtonNumber, uint8_t Direction) {
if (Direction) {
BtnFilter[ButtonNumber]++;
if (BtnFilter[ButtonNumber] == BUTTON_PRESS_DURATION) {
// OnPress()
OnButtonPress(ButtonNumber);
} else if (BtnFilter[ButtonNumber] == BUTTON_LONG_PRESS_DUR) {
// On LongPress()
OnButtonLongPress(ButtonNumber);
} else if (BtnFilter[ButtonNumber] > BUTTON_LONG_PRESS_DUR) {
BtnFilter[ButtonNumber] = BUTTON_LONG_PRESS_DUR;
}
} else {
if (BtnFilter[ButtonNumber]) {
BtnFilter[ButtonNumber] = 0;
OnButtonRelease(ButtonNumber);
} else {
BtnFilter[ButtonNumber] = 0;
OnButtonRelease(ButtonNumber);
}
}
}
Код: Выделить всё
enum {BUT_1, BUT_2, BUT_3, ...};
uint volatile buttons = 0;
void Isr()
{
EXTI->PR = EXTI_PR_PR5 | EXTI_PR_PR6 | EXTI_PR_PR7;
uint i = GPIOA->IDR, c = 0;
if (!(i & 1 << 7)) c += 1 << BUT_1;
if (!(i & 1 << 6)) c += 1 << BUT_2;
if (!(i & 1 << 5)) c += 1 << BUT_3;
buttons = c;
}Код: Выделить всё
EXTI->PR = EXTI_PR_PR5 | EXTI_PR_PR6 | EXTI_PR_PR7;Код: Выделить всё
EXTI->PR = EXTI_PR_PR5 | EXTI_PR_PR6 | EXTI_PR_PR7;
uint j = EXTI->PR;
uint i = GPIOA->IDR, c = 0;
...Код: Выделить всё
uint i = GPIOA->IDR, c = 0;
if (!(i & 1 << 7)) c += 1 << BUT_1;
if (!(i & 1 << 6)) c += 1 << BUT_2;
if (!(i & 1 << 5)) c += 1 << BUT_3;
buttons = c;
}Код: Выделить всё
uint32_t i = GPIOA->IDR;
buttons = moveBit(i, 7, BUT_1) | moveBit(i, 6, BUT_2) | moveBit(i, 5, BUT_3);Код: Выделить всё
uint32_t i = GPIOA->IDR;
buttons = moveBit(i, 7, BUT_1) | moveBit(i, 6, BUT_2) | moveBit(i, 5, BUT_3);Код: Выделить всё
#define PIN_BUTTON1 A, 7
#define PIN_BUTTON2 A, 6
#define PIN_BUTTON3 A, 5
...Код: Выделить всё
#define PIN_BUTTON1 A, 7
#define PIN_BUTTON2 A, 6
#define PIN_BUTTON3 A, 5
...