From 799d8e43b54f68c61c7b63e43d4a3487754dfe60 Mon Sep 17 00:00:00 2001 From: Dien-Nhung Nguyen-Phu Date: Sun, 2 Jun 2024 18:27:36 +0700 Subject: button: add basic button functionalities - Provided a way to set handler for each button one-press/long-press - Debouncing with RC filter and Schmitt trigger --- src/main.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 15 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index 4982ba0..2ee8211 100644 --- a/src/main.c +++ b/src/main.c @@ -1,11 +1,29 @@ #include "CH58x_common.h" #include "CH58x_sys.h" + #include "leddrv.h" +#include "button.h" + +#define FB_WIDTH (LED_COLS * 4) +#define SCROLL_IRATIO (16) +#define FB_NUM_SPARE (8) +#define SCAN_F (2000) +#define SCAN_T (FREQ_SYS / SCAN_F) -#define FB_WIDTH LED_COLS*4 -#define SCROLL_IRATIO 3 +#define NEXT_STATE(v, min, max) \ + (v)++; \ + if ((v) >= (max)) \ + (v) = (min) + +enum MODES { + NORMAL = 0, + DOWNLOAD, + POWER_OFF, + MODES_COUNT, +}; +#define BRIGHTNESS_LEVELS (4) -uint16_t fb[2][FB_WIDTH]; +uint16_t fb[FB_NUM_SPARE][FB_WIDTH]; uint8_t test_font[][11] = { 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0xF0, 0x00, // F @@ -31,21 +49,41 @@ void draw2fb(uint16_t *fb, int c, int col) } } -volatile int fb_sel = 0; +volatile int fb_sel, fb_num; +volatile int mode, brightness; +volatile uint64_t tick; + +__HIGH_CODE +static void change_brightness() +{ + NEXT_STATE(brightness, 0, BRIGHTNESS_LEVELS); +} + +__HIGH_CODE +static void change_mode() +{ + NEXT_STATE(mode, 0, MODES_COUNT); +} + +__HIGH_CODE +static void change_fb() +{ + NEXT_STATE(fb_sel, 0, fb_num); +} int main() { SetSysClock(CLK_SOURCE_PLL_60MHz); led_init(); - draw2fb(fb[0], 0, 8*5); - draw2fb(fb[0], 1, 8*6); - draw2fb(fb[0], 2, 8*7); - draw2fb(fb[0], 3, 8*8); - draw2fb(fb[0], 4, 8*9); - draw2fb(fb[0], 5, 8*10); - draw2fb(fb[0], 6, 8*11); - draw2fb(fb[0], 7, 8*12); + draw2fb(fb[0], 0, 8*(5-1)); + draw2fb(fb[0], 1, 8*(6-1)); + draw2fb(fb[0], 2, 8*(7-1)); + draw2fb(fb[0], 3, 8*(8-1)); + draw2fb(fb[0], 4, 8*(9-1)); + draw2fb(fb[0], 5, 8*(10-1)); + draw2fb(fb[0], 6, 8*(11-1)); + draw2fb(fb[0], 7, 8*(12-1)); draw2fb(fb[1], 4, 8*5); draw2fb(fb[1], 5, 8*6); @@ -55,16 +93,23 @@ int main() draw2fb(fb[1], 1, 8*10); draw2fb(fb[1], 2, 8*11); draw2fb(fb[1], 3, 8*12); + fb_num = 2; - TMR0_TimerInit(1500); + TMR0_TimerInit(SCAN_T); TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); PFIC_EnableIRQ(TMR0_IRQn); + btn_init(); + btn_onOnePress(KEY1, change_mode); + btn_onOnePress(KEY2, change_fb); + btn_onLongPress(KEY1, change_brightness); + while (1) { } } -__attribute__((interrupt)) +__INTERRUPT +__HIGH_CODE void TMR0_IRQHandler(void) { static int i, scroll; @@ -77,7 +122,6 @@ void TMR0_IRQHandler(void) scroll++; if (scroll >= (FB_WIDTH-LED_COLS)*SCROLL_IRATIO) { scroll = 0; - fb_sel = fb_sel == 0; } } // This is a mess -- cgit v1.2.3