// --------- Szitkovits Gábor 2012.05.29- ----------------------------------------------------------
// -------------------- 3x4 keypad vezérlés pcf8574-el i2c-n ---------------------------------------

#include "io430.h"
#include "in430.h"
#include "i2c_g2xx2.h"
#include "stdint.h"

#define sor_ki 0xf0
#define oszlop_ki 0x0f

char key, x=1;
volatile uint8_t sor_be=0, oszlop_be=0;

int main(void){
    
    WDTCTL = WDTPW + WDTHOLD;        // Stop watchdog
    BCSCTL1 = CALBC1_1MHZ;           // Set DCO
    DCOCTL = CALDCO_1MHZ;
    
    P1DIR |= BIT0;                   // P1.0 kimenet
    P1OUT &= ~BIT0;                  // P1OUT alacsony
    P2IE |= BIT3;                    // P2.3 megszakítás eng.
    P2IES |= BIT3;                   // P2.3 lefutó él
    
    i2c_init();                      // i2c setup
    i2c_start();                     // i2c start
    i2c_slave_cim(0x20,0);           // slave cím + írás
    i2c_write_byte(sor_ki);          // PCF 8574 P0-3 = alacsony, P4-7 = magas
    i2c_stop();                      // i2c stop
    i2c_start();                     // i2c start
    i2c_slave_cim(0x20,1);           // slave cím + olvasás
    sor_be = i2c_read_byte();        // pcf P0-7 bitek beolvasása
    i2c_ack(0);                      // NACK küldése
    i2c_stop();                      // i2c stop
    P2IFG &= ~BIT3;                  // P2.3 flag törlése
    _EINT();                         // megszakítás engedélyezése
    
    while(x){
        if(key == 5){
            __delay_cycles(1000000);
            P1OUT |= BIT0;
            x=0;
        }
    }
    return 0;
}
// -------------------------- Port 2 megszakítás --------------------------------------
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void){
    P2IE &= ~BIT3;                  // megszakítás tiltása
    i2c_start();                    // i2c start
    i2c_slave_cim(0x20,1);          // slave cím + olvasás
    sor_be = i2c_read_byte();       // sorok beolvasása 
    i2c_ack(0);                     // NACK küldése
    i2c_stop();                     // i2c stop
    i2c_start();                    // i2c start
    i2c_slave_cim(0x20,0);          // slave cím + írás
    i2c_write_byte(oszlop_ki);      // oszlop beírása P0-3 magas, P4-7 alacsony
    i2c_stop();                     // i2c stop
    i2c_start();                    // i2c start
    i2c_slave_cim(0x20,1);          // slave cím + olvasás
    oszlop_be = i2c_read_byte();    // oszlop beolvasása
    i2c_ack(0);                     // NACK küldése
    i2c_stop();                     // i2c stop
    i2c_start();                    // i2c start
    i2c_slave_cim(0x20,0);          // slave cím + írás
    i2c_write_byte(sor_ki);         // P0-3 alacsony, P4-7 magas
    i2c_stop();                     // i2c stop
    
    switch(sor_be){       // sorokról beolvasott érték vizsgálata
      case 0xe0:          // 0b1110 0000 ?
        key = 1;          // bill 1
        break;
      case 0xd0:          // 0b1101 0000 ?
        key = 4;          // bill 4
        break;
      case 0xb0:          // 0b1011 0000 ?
        key = 7;          // bill 7
        break;
      case 0x70:          // 0b0111 0000 ?
        key = 10;         // bill 10
        break;
    }
    switch(oszlop_be){    // oszlopokról beolvasott érték vizsgálata
      case 0x0e:          // 0b0000 1110 ?
        key = key + 0;    // bill 1, 4, 7, 10
        break;
      case 0x0d:          // 0b0000 1101 ?
        key = key + 1;    // bill 2, 5, 8, 11
        break;           
      case 0x0b:          // 0b0000 1011 ?
        key = key + 2;    // bill 3, 6, 9, 12
        break;
    }    
    P2IE |= BIT3;         // P2.3 megszakítás engedélyezése
    P2IFG &= ~BIT3;       // P2.3 flag törlése
}