You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.4 KiB
124 lines
3.4 KiB
//////////////////////////////////////////////////////////
|
|
// Created by : Kerem Yollu
|
|
// Project : Multiprise conectée
|
|
// Nom : lcd.c
|
|
// Header : lcd.h
|
|
//_________________________Info_________________________
|
|
//
|
|
// Libraire pour le control d'un ecran lcd stadard (HD44780)
|
|
// controlée par un expandeur de port PCF8574 en I2C.
|
|
//
|
|
//////////////////////////////////////////////////////////
|
|
|
|
#include "pf8574.h"
|
|
|
|
// Fonction pour initialiser l'écran vide en mode 4 bits
|
|
uint16_t lcd_init(i2c_t *i2c_dev)
|
|
{
|
|
lcd_write(i2c_dev,0x03,CMD_MODE); // Mise en mode 4 bit avec 4 essai conssecutif
|
|
lcd_write(i2c_dev,0x03,CMD_MODE);
|
|
lcd_write(i2c_dev,0x03,CMD_MODE);
|
|
lcd_write(i2c_dev,0x02,CMD_MODE);
|
|
lcd_write(i2c_dev,LCD_FUNCTIONSET | LCD_2LINE | LCD_5x8DOTS | LCD_4BITMODE ,CMD_MODE);
|
|
lcd_write(i2c_dev,LCD_DISPLAYCONTROL | LCD_DISPLAYON ,CMD_MODE);
|
|
lcd_write(i2c_dev,LCD_CLEARDISPLAY ,CMD_MODE);
|
|
lcd_write(i2c_dev,LCD_ENTRYMODESET | LCD_ENTRYLEFT ,CMD_MODE);
|
|
return 1;
|
|
}
|
|
|
|
|
|
// Fonction qui vas afficher une pharse sur la ligne et colone qui lui est indiquée
|
|
// Attention la fonction est capable de calculer la liongeure d0ubn phrase mais il ne
|
|
// faut pas dépasser la limite d'une ligne totale qui est de 20 charactères max
|
|
//
|
|
// LCD 20x4
|
|
// -------------------------------------------
|
|
// ||# # # # # # # # # # # # # # # # # # # #||
|
|
// ||# # # # # # # # # # # # # # # # # # # #||
|
|
// ||# # # # # # # # # # # # # # # # # # # #||
|
|
// ||# # # # # # # # # # # # # # # # # # # #||
|
|
// -------------------------------------------
|
|
void lcd_display_string(i2c_t *i2c_dev, uint8_t line, uint8_t pos, uint8_t* charvalue, uint8_t lenght)
|
|
{
|
|
uint8_t setPosition = 0;
|
|
uint16_t i, S_length = 0;
|
|
|
|
S_length = lenght;
|
|
if (S_length > TOTAL_CHAR_CAP)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if(line == 1) // Selection de la ligne d'écriture
|
|
{
|
|
setPosition = pos;
|
|
}
|
|
else if(line ==2)
|
|
{
|
|
setPosition = 0x40 + pos;
|
|
}
|
|
else if(line ==3)
|
|
{
|
|
setPosition = 0x14 + pos;
|
|
}
|
|
else if(line ==4)
|
|
{
|
|
setPosition = 0x54 + pos;
|
|
}
|
|
else
|
|
{
|
|
setPosition = -1;
|
|
}
|
|
|
|
if(setPosition >= 0)
|
|
{
|
|
lcd_write(i2c_dev, LCD_SETDDRAMADDR + setPosition, CMD_MODE);
|
|
|
|
for(i = 0; i < lenght; i++ )
|
|
{
|
|
lcd_write(i2c_dev,charvalue[i],RS);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Cette fonction nous permet d'envoyer un information de 8 bits sous format
|
|
// de 2x4 bites. Celà est necessaire du au fonctionnement de l'expendeur de port PCF8574
|
|
// qui est branché sur l'écran de facon a ce qu'il communiquer en 4 bits.
|
|
void lcd_write(i2c_t *i2c_dev, uint8_t cmd, uint8_t mode)
|
|
{
|
|
lcd_write_4bits(i2c_dev, mode | (cmd & 0xF0));
|
|
lcd_write_4bits(i2c_dev, mode | ((cmd << 4) & 0xF0));
|
|
}
|
|
|
|
// Fonction nous permettant d'nevoyer 4 bits dinformation sur le PC8574 ainsi que
|
|
// le rétroéclairage.
|
|
void lcd_write_4bits(i2c_t *i2c_dev,uint8_t data)
|
|
{
|
|
uint16_t address = LCD_ADDRS;
|
|
uint8_t i2c_data = 0;
|
|
|
|
i2c_set_transfer_counter(i2c_dev,3);
|
|
i2c_send_address_for_write(i2c_dev, &address);
|
|
|
|
i2c_data = data | LCD_BACKLIGHT;
|
|
i2c_send_data(i2c_dev, &i2c_data);
|
|
|
|
// Toggle LCD enbale pin.
|
|
i2c_data = data | EN |LCD_BACKLIGHT;
|
|
i2c_send_data(i2c_dev, &i2c_data);
|
|
delayMs(100);
|
|
|
|
i2c_data = ((data & ~EN) | LCD_BACKLIGHT);
|
|
i2c_send_data(i2c_dev, &i2c_data);
|
|
|
|
while(!i2c_is_transfer_complete(i2c_dev));
|
|
i2c_send_stop(i2c_dev);
|
|
|
|
delayMs(500);
|
|
}
|