From aa7bcf6c038c03418e7da5b1b2ceb27bd34bde14 Mon Sep 17 00:00:00 2001 From: true Date: Sun, 5 Nov 2023 11:56:41 -0800 Subject: [PATCH] Added button handler, program selects --- include/btn.h | 25 +++++++++++++++++++++++++ src/btn.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 include/btn.h create mode 100644 src/btn.cpp diff --git a/include/btn.h b/include/btn.h new file mode 100644 index 0000000..b78a9c9 --- /dev/null +++ b/include/btn.h @@ -0,0 +1,25 @@ +#ifndef __INC_BTN_H +#define __INC_BTN_H + + +#include + + +#define SR_CLK 0 +#define SR_DAT 1 +#define SR_LAT 16 + +#define BTN_STICK_UP (1 << 14) +#define BTN_STICK_DN (1 << 11) +#define BTN_STICK_LF (1 << 12) +#define BTN_STICK_RT (1 << 15) +#define BTN_STICK_SEL (1 << 13) + +#define BTN_READ0 17 +#define BTN_READ1 18 + + +uint16_t btn_read(); + + +#endif \ No newline at end of file diff --git a/src/btn.cpp b/src/btn.cpp new file mode 100644 index 0000000..7a085e8 --- /dev/null +++ b/src/btn.cpp @@ -0,0 +1,47 @@ +#include + +#include "btn.h" + + + +uint16_t btn_mask; +uint16_t btn_last; +uint16_t btn_flip; + + + +void sr_send(uint16_t dat) +{ + digitalWrite(SR_LAT, LOW); + + uint16_t mask = 0x8000; + + for (uint8_t i = 0; i < 16; i++) { + digitalWrite(SR_DAT, dat & mask ? HIGH : LOW); + digitalWrite(SR_CLK, HIGH); + mask >>= 1; + digitalWrite(SR_CLK, LOW); + } + + digitalWrite(SR_LAT, HIGH); + __NOP(); __NOP(); + digitalWrite(SR_LAT, LOW); +} + +uint16_t btn_read() +{ + btn_last = btn_mask; + + // read joystick only for now + for (uint8_t i = 11; i < 16; i++) { + sr_send(1 << i); + btn_mask &= ~(1 << i); + if (!digitalRead(BTN_READ1)) { + btn_mask |= (1 << i); + } + } + + btn_flip = btn_mask ^ btn_last; + + return btn_flip & btn_mask; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 89dd667..106116e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,6 +9,8 @@ extern "C" { #include "sin1.h" } +#include "btn.h" + const char name[] = "Your Name"; @@ -64,6 +66,14 @@ void setup() drot->begin(); drot->setFont(u8g2_font_cubic11_h_cjk); // u8g2_font_spleen16x32_mr + + // buttons + pinMode(SR_CLK, OUTPUT); + pinMode(SR_DAT, OUTPUT); + pinMode(SR_LAT, OUTPUT); + + pinMode(BTN_READ0, INPUT); + pinMode(BTN_READ1, INPUT); } int16_t render_drot_printchar(const char *str, uint8_t idx, uint8_t size, uint16_t color) @@ -399,4 +409,33 @@ void loop() } dout->flush(); + + // read buttons + uint16_t btn; + btn = btn_read(); + + switch (btn) { + case BTN_STICK_UP: { + bgprog++; + bgprog %= 7; + break; + } + case BTN_STICK_DN: { + if (!bgprog) { + bgprog = 6; + } else bgprog--; + break; + } + + case BTN_STICK_RT: { + fgprog++; + fgprog %= 1; + break; + } + case BTN_STICK_LF: { + if (!fgprog) { + fgprog = 0; + } else fgprog--; + } + } } \ No newline at end of file