/*! \file lib_io_tp.cpp \brief Librairie IO+LCD pour FESTO \author Bertrand Vandeportaele IUT GEII \date 14/02/2022 */ #include "lib_io_tp.h" //pour utiliser carte d'interface et gérer inversion des quartets + E et S inversées A/B par rapports aux inter et led.. #define FESTO #include #define SLAVE_ADDR_8574_A (0x38+6) #define SLAVE_ADDR_8574_B (0x38+7) LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display //doc sur https://github.com/johnrickman/LiquidCrystal_I2C/blob/master/LiquidCrystal_I2C.h #ifdef FESTO ////////////////////////////////////////// char swapNibles(char in) { //le port de sortie est cablé en inversant les 4 bits MSB avec les LSB return (( (in & 0x0f) << 4) | ((in >> 4) & 0x0f)); } ////////////////////////////////////////// #endif /////////////////////////////////////////////////////// /*! \brief Fonction d'initialisation des ressources matérielles pour accéder aux ports d'entrée/sortie */ void SetupES(void) { Wire.begin(); delay(100); #ifdef FESTO Wire.beginTransmission((byte)SLAVE_ADDR_8574_A); Wire.write((byte)0xff); Wire.endTransmission(); //configure le composant A en entrée Wire.beginTransmission((byte)SLAVE_ADDR_8574_B); Wire.write((byte)0x00); Wire.endTransmission(); //configure le composant B en sortie #else Wire.beginTransmission((byte)SLAVE_ADDR_8574_A); Wire.write((byte)0x00); Wire.endTransmission(); //configure le composant A en sortie Wire.beginTransmission((byte)SLAVE_ADDR_8574_B); Wire.write((byte)0xff); Wire.endTransmission(); //configure le composant B en entrée #endif // Wire.beginTransmission((byte)SLAVE_ADDR_8574_B); Wire.write((byte)0xff); Wire.endTransmission(); //configure le composant B en entrée lcd.init(); // initialize the lcd lcd.backlight(); lcd.print("Nom:"); lcd.setCursor(0, 1); lcd.print("Msg:"); } /////////////////////////////////////////////////////// /*! \brief Fonction de lecture du port d'entrée @return valeur 8 bits lue sur le port */ unsigned char readPort(void) { #ifdef FESTO Wire.requestFrom((byte)SLAVE_ADDR_8574_A, (byte)1);// demande la lecture d'1 octet depuis l'adresse du pérpiphérique #else Wire.requestFrom((byte)SLAVE_ADDR_8574_B, (byte)1);// demande la lecture d'1 octet depuis l'adresse du pérpiphérique #endif if (Wire.available() == 1) //si l'octet est disponible return Wire.read(); // lire l'octet else return 0; } /////////////////////////////////////////////////////// /*! \brief Fonction d'écriture vers le port de sortie @param value valeur 8 bits à écrire sur le port */ void writePort(unsigned char value) { //cette fonction pilote les 8 leds avec la valeur 8bits fournie dans le paramètre valeur #ifdef FESTO Wire.beginTransmission((byte)SLAVE_ADDR_8574_B);//démarre la transmission avec l'adresse du pérpiphérique Wire.write((byte)swapNibles(value)); //envoie la donnée non complémentée #else Wire.beginTransmission((byte)SLAVE_ADDR_8574_A);//démarre la transmission avec l'adresse du pérpiphérique Wire.write(~(byte)value); //envoie la donnée complémentée car les LEDs s'allument à l'état 0 #endif Wire.endTransmission(); } /////////////////////////////////////////////////////// void printlcd(char *value, int nligne) { lcd.setCursor(4, nligne); int i; for (i = 0; i < 12; i++) { if ((value[i] == '\0') || (value[i] == '\n')) break; else lcd.write( value[i]); } //si i<12; on efface avec des ' ' while (i < 12) { lcd.write(' '); i++; } } /////////////////////////////////////////////////////// void setName(char *value) { printlcd(value, 0); } /////////////////////////////////////////////////////// void setMsg(char *value) { printlcd(value, 1); }