Bonjour(bonsoir ) tous le monde,
Aujourd'hui(ou plus tôt hier), j'ai programmer mon petit atmega8 pour qu'il communique avec un LCD 16*2 qui est connecter à un PCF8754 (Port 1/0 8bits I²C), mon code fonctionne bien mais ... pèse très lourd, 6244 bytes et mon pauvre petit µC en à 8Kb, mais je dois insérer cette "bibliothèque" dans un projet qui risque de dépasser 1.8Kb
J'ai donc regarder ou sa pausait problème, et c'est la gestion du LCD, plus exactement l'initialisation et je ne vois pas pour-quoi cette partie est plus grosse que les autres (quant je l'enlève ma compilation donne 1194 bytes)
Auriez-vous donc une idée de pour-quoi cette partie est aussi grosse et y-a-t-il moyen de l'optimiser ?
Code:/* * PCF8574.h * * Created: 9/07/2013 15:45:10 * Author: Adrien * * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Belgium License. * * */ #ifndef PCF8574_H_ #define PCF8574_H_ class PCF8574 { private: static uint8_t const adresse = 0x40; public: static uint8_t send(uint8_t data, int read, int A0, int A1, int A2) { //SCK Config (27.77Khz) TWBR = 0x0A; //Bit rate division à 10 TWSR = (TWSR & ~((1<<TWPS0) & (1<<TWPS1))); //TWPS à 0 //I2C Init TWCR = (1<<TWEN); //Active l'I2C TWCR = (1<<TWEN)|(1<<TWSTA)|(1<<TWINT); //Envoi la condiont de démarage while(!(TWCR&(1<<TWINT))) //Attente de l'envoi ; //DS1307 adresse write TWDR = adresse|(A0<<1)|(A1<<2)|(A2<<3)|read ; //Inscrit l'adresse, Mode TWCR = (1<<TWEN)|(1<<TWINT); //Envoi l'adresse while(!(TWCR&(1<<TWINT))) //Attente de l'envoi ; //Data send if(!read) TWDR = data; //Inscrit les donnée TWCR = (1<<TWEN)|(1<<TWINT); //Envoi les donnée while(!(TWCR&(1<<TWINT))) //Attente de l'envoi ; //Stop condition TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWSTO); while((TWCR&(1<<TWSTO))) ; _delay_ms(1); TWCR &= (~(1<<TWEN)); if(read) return TWDR; } }; class LCD { private: static int const RS =4, RW =5, E = 6, D4 = 3, D5 = 2, D6 = 1, D7 = 0; public: static void send(uint8_t data) { PCF8574::send(0x00, 0, 0, 0, 0); PCF8574::send(data, 0, 0, 0, 0); //Ecris les données data |= (1<<E); PCF8574::send(data, 0, 0, 0, 0); //Confirme les données _delay_us(500); data &= ~(1<<E); PCF8574::send(data, 0, 0, 0, 0); _delay_ms(1); } static void display_init() //PArtie qui pose problème { send(0x00);send(0x01);send(0x00);send(0x00);send(0x01); send(0x03);send(0x03);send(0x03); send(0x02); send(0x02);send(0x08); send(0x00);send(0x0C); send(0x00);send(0x06); send(0x00);send(0x01); } static void send_lettre(uint8_t lettre) { uint8_t data = (1<<RS)|(lettre>>4); send(data); data = (1<<RS)|(lettre&0b00001111); send(data); } }; #endif /* PCF8574_H_ */
J'ai été chercher un petit tuto sur les LCD car avant, je ne connaissait pas la méthode de communication, et le datasheet ma un tous petit peux aider, mais n'a pas réussi à me faire comprendre le "protocole" :/
Merci d'avance
-----