Butt 7 click
Butt 7 down
Butt 7 pressed
Butt 4 down
Butt 4 pressed
Butt 7 pressed
Butt 0 down
Butt 0 pressed
Butt 4 pressed
Butt 7 pressed
Butt 0 click
Butt 4 pressed
Butt 7 pressed
Butt 4 pressed
Butt 7 click
Butt 4 click
Butt 7 down
Butt 7 pressed
...
В примере выделено определение, это время чаще которого мультиплксор не будет опрашиваться.
Если не сделать, будет 20 мс.
Нажать на кнопку , что бы программа не отреагировала мне удавалось при 50 мс. при 30 уже нет. Тут многое зависит от кнопок.
#define mult_time_per 10
#include "mult.h"
Multi_button m_But(10, 11, 12, 2);
void setup() {
Serial.begin(115200);
}
void loop() {
m_But.Tick();
if (m_But.isChange)
for (int i = 0; i < 8; i++)
{
if (m_But.isClick(i)) Serial.println("Butt " + String(i) + " click");
if (m_But.isDown(i)) Serial.println("Butt " + String(i) + " down");
if (m_But.isPressed(i)) Serial.println("Butt " + String(i) + " pressed");
}
}
}
Сама мини - библиотечка, если так можно сказать. Написана исключительно ради примера работы.
При нажатии отпускании кнопок (можно подключать не только кнопки) выставляется флаг isChange , разово, в сл. цикле он уберется.
Если были какие то изменения можно сделать проверку на то, что менялось.
#ifndef mult_time_per
#define mult_time_per 20
#endif
class Multi_button
{
private:
byte _old_pin_state;
uint32_t last_tick_time = 0;
byte _S0_pin;
byte _S1_pin;
byte _S2_pin;
byte _IN_pin;
byte _pin_state;
public:
Multi_button(byte s0, byte s1, byte s2, byte In_p)
{
_S0_pin = s0;
_S1_pin = s1;
_S2_pin = s2;
_IN_pin = In_p;
pinMode(_S0_pin, OUTPUT);
pinMode(_S1_pin, OUTPUT);
pinMode(_S2_pin, OUTPUT);
pinMode(_IN_pin , INPUT);
}
bool isChange;
bool isClick(byte N)
{
return (bitRead(_pin_state, N) != bitRead(_old_pin_state, N)) && bitRead(_old_pin_state, N);
}
bool isDown(byte N)
{
return (bitRead(_pin_state, N) != bitRead(_old_pin_state, N)) && bitRead(_pin_state, N);
}
bool isPressed(byte N)
{
return bitRead(_pin_state, N);
}
void Tick()
{
isChange = false;
if (millis() - last_tick_time < mult_time_per) return;
_old_pin_state = _pin_state;
for (int i = 0; i < 8; i++)
{
digitalWrite(_S0_pin, (bool)(i & 1));
digitalWrite(_S1_pin, (bool)(i & 2));
digitalWrite(_S2_pin, (bool)(i & 4));
bitWrite(_pin_state, i, digitalRead(_IN_pin));
}
isChange = _old_pin_state != _pin_state;
last_tick_time = millis();
}
};