/* * LCD.cpp * * Created: 27/12/2013 13:32:02 * Author: Adrien */ /************************************************************************************************************ * Cette librairie permet de controlé un écrans LCD a traver un PCF8574 avec comme adresse 0x40 * * * * ############################## * * #----------------------------# * * #| Configuration des pins |# * * #|~~~~~~~~~~~~~~~~~~~~~~~~~~|# * * #| PCF8574 | LCD |# * * #|~~~~~~~~~~~~~~|~~~~~~~~~~~|# * * #| 0 | D4 |# * * #| 1 | D5 |# * * #| 2 | D6 |# * * #| 3 | D7 |# * * #| 4 | NC |# * * #| 5 | E |# * * #| 6 | RS |# * * #| 7 | RW |# * * #----------------------------# * * ############################## * * * * * * @@ §§ §§ ####### * * @@@@ §§ §§ ## ##### * * @@ @@ §§ §§ ## #### * * @@ @@ §§ §§ ## ## * * @@ @@ §§ §§ ## ## * * @@~&&&&&&~@@ §§ §§ ## #### * * @@ @@ §§§§ ## ##### * * @@ @@ §§ ####### * * * ************************************************************************************************************ */ #define adresse_DS1307 0x40 #define F_CPU 16000000UL #define RS 0x01<<6 #define RW 0x01<<7 #define E 0x01<<5 #define D4 0x01<<0 #define D5 0x01<<1 #define D6 0x01<<2 #define D7 0x01<<3 #define D0 0x01<<0 #define D1 0x01<<1 #define D2 0x01<<2 #define D3 0x01<<3 #include #include #include #include #include "LCD.h" uint8_t PCF8574::send(uint8_t data, uint8_t read) { uint8_t read_data; //SCK Config (27.77Khz) TWBR = 0x0A; //Bit rate division à 10 TWSR = (TWSR & ~((1<>3)) return true; else return false; } void LCD::send(uint8_t data, bool debut_instuction) { while(check_busy_flag() && debut_instuction) //Vérifie qu'il n'y a pas une oppétation en cours {} PCF8574::send(0x00, 0); //Met les pins à0 PCF8574::send(data, 0); //Ecris les données data |= (E); //_delay_ms(1000); PCF8574::send(data, 0); //Confirme les données _delay_us(1); //Attente que la confiramation soit bien reçue data &= ~(E); PCF8574::send(data, 0); _delay_us(1); } void LCD::display_init() { send(0x03, true); //Mode 4bit send(0x08, false); //Mode 2ligne send(0x00, true);send(0x01, false); //Clear display send(0x00, true);send(0x02, false); //Return home send(0x00, true);send((D2|D1), false); //Incrémentation de la RAM et déplacement du curseur vers la droite send(0x00, true);send((D3|D2), false); //Allume l'afficheur sans curseur } void LCD::send_leter(uint8_t lettre) { uint8_t data = (RS)|(lettre>>4); //Inscrit les 4 dernier bit dans la RAM send(data, true); data = (RS)|(lettre&0b00001111); //Inscrit les 4 premier bit dans la RAM send(data, false); } void LCD::clear() { send(0x00, true); send(D0, false); //Clear Display send(0x00, true);send(0x02, false); //Return home } void LCD::set_cursor(int x, int y) { uint8_t data; if(y == 1) data = 0x00 + x; else if(y == 2) data = 0x40 + x; send((data>>4)|0x08, true);_delay_us(5);send(data&0x0F, false); } void LCD::print_text(char *txt) { for(int a = 0 ; a < strlen(txt) ; a++) send_leter(txt[a]); } void LCD::print_number(int num) { char c[64]; sprintf(c, "%d", num); print_text(c); }