Eu estava bobeando e descobri que quando fazia o Entradas = ~Entradas ele ficava com 0xFFXX, e nunca ia ficar como o Entradas_OLD, pois eu setava apenas o primeiro byte do Entradas.
Estou fazendo um sistema para entrada de 16 botões, ainda não coloquei os dois 74166, mas mesmo não operando com os 16 bits.
Alguém pode dar uma olhada nesse código, pois se substituo o tipo das variáveis de byte para word, não acontece nada quando aperto os botões, mas se uso byte responde como esperado
Provavelmente deve ser alguma coisinha que estou esquecendo, mas depois de dois dias, já não sei mais o que tentar.
#define CI74166_DATAIN 11 // 74166 13
#define CI74166_CLOCK 12 // 74166 7
#define CI74166_CLOCK_INH 10 // 74166 6
#define CI74166_STROBE 7 // 74166 15
byte Entradas166;
byte Entradas166_OLD = 0xFF;
byte FinalButtons = 0x0000;
byte FinalButtons_OLD = 0x0000;
unsigned long LastRead;
int DebounceDelay = 50;
void setup()
{
pinMode(CI74166_DATAIN, INPUT);
pinMode(CI74166_CLOCK, OUTPUT);
pinMode(CI74166_CLOCK, OUTPUT);
pinMode(CI74166_CLOCK_INH, OUTPUT);
pinMode(CI74166_STROBE, OUTPUT);
Serial.begin(9600);
}
void loop()
{
shiftIn();
if (Entradas166 != Entradas166_OLD)
{
LastRead = millis();
}
if ((millis() - LastRead) > DebounceDelay)
{
FinalButtons = Entradas166;
}
if (FinalButtons != FinalButtons_OLD)
{
Serial.println(FinalButtons, BIN);
FinalButtons_OLD = FinalButtons;
}
Entradas166_OLD = Entradas166;
}
void shiftIn()
{
int BitEntrada = 0;
digitalWrite(CI74166_CLOCK,0);
digitalWrite(CI74166_STROBE,0);
delayMicroseconds(2);
digitalWrite(CI74166_CLOCK,1); // important
digitalWrite(CI74166_STROBE,1);
for (int i= 0; i <= 7; i++)
{
digitalWrite(CI74166_CLOCK,1);
delayMicroseconds(2);
bitWrite(Entradas166, 7 - i, digitalRead(CI74166_DATAIN));
digitalWrite(CI74166_CLOCK,0);
delayMicroseconds(2);
}
Entradas166 = ~Entradas166;
}