/* @file HelloKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates the simplest use of the matrix Keypad library.
|| #
*/
#include <Keypad.h>

#define TXpin 10
#define ROWS 4 //four rows
#define COLS 3 //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {4,5,6,7}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {1,2,3}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  pinMode(TXpin,OUTPUT);
}
  
void loop(){
  char key = keypad.getKey();

  if (key != NO_KEY){
    put_char(key);
  }
}


#define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set
#define bit_delay_time 100 // bit delay for 9600 with overhead
#define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay

void put_char(char txchar) {
   //
   // send character in txchar on port pin
   //    assumes line driver (inverts bits)
   //
   // start bit
   //
   digitalWrite(TXpin,LOW);
   bit_delay();
   //
   // unrolled loop to write data bits
   //
   if bit_test(txchar,0)
      digitalWrite(TXpin, HIGH);
   else
      digitalWrite(TXpin, LOW);
   bit_delay();
   if bit_test(txchar,1)
      digitalWrite(TXpin, HIGH);
   else
      digitalWrite(TXpin, LOW);
   bit_delay();
   if bit_test(txchar,2)
      digitalWrite(TXpin, HIGH);
   else
      digitalWrite(TXpin, LOW);
   bit_delay();
   if bit_test(txchar,3)
      digitalWrite(TXpin, HIGH);
   else
      digitalWrite(TXpin, LOW);
   bit_delay();
   if bit_test(txchar,4)
      digitalWrite(TXpin, HIGH);
   else
      digitalWrite(TXpin, LOW);
   bit_delay();
   if bit_test(txchar,5)
      digitalWrite(TXpin, HIGH);
   else
      digitalWrite(TXpin, LOW);
   bit_delay();
   if bit_test(txchar,6)
      digitalWrite(TXpin, HIGH);
   else
      digitalWrite(TXpin, LOW);
   bit_delay();
   if bit_test(txchar,7)
      digitalWrite(TXpin, HIGH);
   else
      digitalWrite(TXpin, LOW);
   bit_delay();
   //
   // stop bit
   //
   digitalWrite(TXpin, HIGH);
   bit_delay();
   //
   // char delay
   //
   bit_delay();
   }
