Hallo pylon!
Ja, den Code habe ich ohne Interrupt getestet. Ohne Interrupt kann ich jede Taste abfragen, solbald ich es mit dem Interrupt probiere hägt sich der µC.
Hier der Code ohne Interrupt:
#include <Wire.h>
#define I2C_Adresse 0x20
byte tmp_data;
int i =3;
byte current_data;
byte read_data;
static char Key = '\0';
int row_select= 0;
int c;
int v;
// Daten für jede Zeile der Tastatur vom PCF8574
const int pcf8574_row_data[4] =
{
B01101111, B01011111, B00111111
};
const char KeyCode[4][5] =
{
"026",
"7S3",
"48E",
"159"
};
void setup()
{
Wire.begin(); )
Serial.begin(9600); // start serial for output
pinMode(PIN2, INPUT);
digitalWrite(PIN2, HIGH);
}
void loop()
{
if (Key != '\0')
{
Serial.print("\n Key = ");
Serial.print(Key);
Key= '\0';
}
for(c=0;c<3;c++)
{
i2c_write(pcf8574_row_data[c]);
read_data = i2c_read(); // receive a byte as character
// UM XOR zu erhalten und die aktuellen Daten zu vergleichen und um zu erkennen,
// wenn eine Spalte LOW ist
tmp_data = read_data ^ current_data; // current_data = Aktuelle daten
tmp_data = tmp_data >>i;
if (tmp_data == 1)
{
Key = KeyCode[row_select][c];
delay(500);
tmp_data = '0/';
}
i--;
if(i < 0)
{
i = 3;
}
}
//Nächste Zeile
row_select++;
if(row_select == 4)
{ // Wenn du bei der letzten Zeile angekommen bist,
row_select = 0; // beginnne wieder bei der ersten Zeile
}
}
void i2c_write(int data)
{
current_data = data;
Wire.beginTransmission(I2C_Adresse); //Beginnt eine Übertragung vom Master zum Slave.
Wire.write(data); //Speichert die Daten in einer Warteschleife, die dann an eine Slave-
//Adresse gesendet wird. Wire.write
Wire.endTransmission(); //Beendet den Übertragungsblock
}
int i2c_read()
{
Wire.requestFrom(I2C_Adresse, 1); //Fordert von einem Gerät Informationen an.
//dabei die 7-Bit-Geräteadresse, quantity die Anzahl von Bytes, //die erwartet werden.
return Wire.read(); //Empfängt das nächste Byte, das auf dem Bus für das Gerät vorliegt
//und gibt dieses als »Byte« zurück.
}