#include <Wire.h>
#define PCF8574_ADDRESS 0x20
void setup()
{
init_keypad();
Serial.begin(9600);
delay(100);
}
void loop()
{
test_keypad();
}
void init_keypad()
{
Wire.begin();
}
void test_keypad()
{
char tav;
Serial.println("waiting for key");
tav = scanKey(true);
Serial.println("key pressed");
if (tav!=0)
{
//Serial.print("tav not 0");
Serial.println(tav);
}
delay(100);
}
byte prevKey = 0;
char scanKey(bool wait)
{
byte returnValue;
do
{
byte num, num1;
num = 0;
num1 = writeReadPcf(0xf7); //read first row 1111011B
num1>>=4;
switch (num1)
{
case 0x7: num = '1'; break;
case 0xb: num = '2'; break;
case 0xd: num = '3'; break;
case 0xe: num = 'A'; break;
}
if (!num)
{
num1 = writeReadPcf(0xfb); //read second row 11111011B
num1>>=4;
switch (num1)
{
case 0x7: num = '4'; break;
case 0xb: num = '5'; break;
case 0xd: num = '6'; break;
case 0xe: num = 'B'; break;
}
}
if (!num)
{
num1 = writeReadPcf(0xfd); //read third row 11111101B
num1>>=4;
switch (num1)
{
case 0x7: num = '7'; break;
case 0xb: num = '8'; break;
case 0xd: num = '9'; break;
case 0xe: num = 'C'; break;
}
}
if (!num)
{
num1 = writeReadPcf(0xfe); //read fourthrow 11111110B
num1>>=4;
switch (num1)
{
case 0x7: num = '*'; break;
case 0xb: num = '0'; break;
case 0xd: num = '#'; break;
case 0xe: num = 'D'; break;
}
}
//Serial.println(num);
if (num == 0)
{
returnValue = prevKey;
prevKey = 0;
}
else
{
prevKey = num;
returnValue = 0;
}
delay(100);
}
while (wait && returnValue==0);
return returnValue;
}
byte writeReadPcf(byte key)
{
byte temp;
Wire.beginTransmission(PCF8574_ADDRESS);
Wire.write(key);
Wire.endTransmission();
delay(10);
Wire.requestFrom(PCF8574_ADDRESS,1);
if(Wire.available())
{
temp = Wire.read();
}
//Serial.println(temp);
Wire.endTransmission();
delay(100);
return temp;
}