// hc165 кнопки -> Лозневский Сергей Станиславович <[email protected]> 2023-oct-02 OKF
#define NAME "hc165 key"
#define VERSION "0.1"
#define UART_BAUDRATE 9600
#define LATCH 4 //подключение
#define CLOCK 3
#define DATA 2
#define HC165_MAX 2 //кол-во мс
#define T_SYS 10 //период опроса
#define KEY_LEVEL LOW //кнопки замыкаются на плюс
#define DEBOUNCE_TIME 30 //дребезг кнопки
#define ms2sys(x) ((x) / T_SYS) //переводим в мс
#define every(x) for (static uint16_t _t; (uint16_t)millis() - _t >= (x); _t += x)
void setup() {
Serial.begin(UART_BAUDRATE);
Serial.println(F(NAME " " VERSION " " __DATE__ " " __TIME__));
pinMode(CLOCK, OUTPUT);
digitalWrite(LATCH, HIGH); pinMode(LATCH, OUTPUT);
}
bool key[HC165_MAX * 8]; //состояния кнопок
// получим состояние кнопок в key[]
void getKey() {
digitalWrite(LATCH, LOW);
digitalWrite(LATCH, HIGH);
for (uint8_t i = 0; i < sizeof(key); i++) {
key[i] = digitalRead(DATA) == KEY_LEVEL;
digitalWrite(CLOCK, HIGH);
digitalWrite(CLOCK, LOW);
}
// проверим изменения, отобразим нажатия
static bool old[sizeof(key)];
static uint8_t timer;
for (uint8_t i = 0; i < sizeof(key); i++) {
if (old[i] != key[i]) { //состояние изменилось
old[i] = key[i];
timer = ms2sys(DEBOUNCE_TIME);
}
}
if (timer && !--timer) { //состояние стабилизировалось
for (uint8_t i = 0; i < sizeof(key); i++) {
if (key[i]) {
Serial.print("Key ");
Serial.println(i + 1); //отобразим номер кнопки
}
}
}
}
void loop() {
every(T_SYS) //опрашиваем и
getKey(); // индицируем
}