/*
\file PCA9538.h
\version: 1.0
\brief Este fichero contiene funciones para control de PCA9538 creando pin
digitales de salida o entrada, o control por registro (8-bits).
\web www.micros-designs.com.ar
\date 01/02/11
*- Version Log --------------------------------------------------------------*
* Fecha Autor Comentarios *
*----------------------------------------------------------------------------*
* 01/02/11 Suky Original *
*----------------------------------------------------------------------------*/
///////////////////////////////////////////////////////////////////////////
//// ////
//// ////
//// (C) Copyright 2011 www.micros-designs.com.ar ////
//// Este código puede ser usado, modificado y distribuido libremente ////
//// sin eliminar esta cabecera y sin garantía de ningún tipo. ////
//// ////
//// ////
///////////////////////////////////////////////////////////////////////////
enum PinName{
exp_p0=0,
exp_p1,
exp_p2,
exp_p3,
exp_p4,
exp_p5,
exp_p6,
exp_p7,
};
#define DIGITAL_IN 1
#define DIGITAL_OUT 0
char _Address;
void vInitPCA9538(char Address){
_Address=Address<<1;
}
void vSetTrisPCA9538(char Dir){
i2c_start();
i2c_write(_Address & 0xFE);
i2c_write(0x03);
i2c_write(Dir);
i2c_stop();
}
void vWritePortPCA9538(char Value){
i2c_start();
i2c_write(_Address & 0xFE);
i2c_write(0x01);
i2c_write(Value);
i2c_stop();
}
char cReadPorPCA9538(void){
char Temp;
i2c_start();
i2c_write(_Address & 0xFE);
i2c_write(0x00);
i2c_start();
i2c_write(_Address | 0x01);
Temp=i2c_read(0);
i2c_stop();
return(Temp);
}
void vSetTrisPinPCA9538(PinName Pin,short Dir){
char Temp;
i2c_start();
i2c_write(_Address & 0xFE);
i2c_write(0x03);
i2c_start();
i2c_write(_Address | 0x01);
Temp=i2c_read(0);
i2c_stop();
i2c_start();
i2c_write(_Address & 0xFE);
i2c_write(0x03);
if(Dir==1){
i2c_write((0x01<<Pin)|Temp);
}else{
i2c_write((~(0x01<<Pin))&Temp);
}
i2c_stop();
}
void vSetPinOutPCA9538(PinName Pin,short Value){
char Temp;
i2c_start();
i2c_write(_Address & 0xFE);
i2c_write(0x01);
i2c_start();
i2c_write(_Address | 0x01);
Temp=i2c_read(0);
i2c_stop();
i2c_start();
i2c_write(_Address & 0xFE);
i2c_write(0x01);
if(Value==0){
i2c_write((~(0x01<<Pin))&Temp);
}else{
i2c_write((0x01<<Pin)|Temp);
}
i2c_stop();
}
short bTestPinInPCA9538(PinName Pin){
char Temp;
i2c_start();
i2c_write(_Address & 0xFE);
i2c_write(0x00);
i2c_start();
i2c_write(_Address | 0x01);
Temp=i2c_read(0);
i2c_stop();
return((Temp>>Pin)&0x01);
}