1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
#define I2C_SCREEN_ADDRESS 0x27
#define LCD_BACKLIGHT 0x08
#define EN 0x04 //ENable bit
#define RW 0x02 //RW bit
#define RS 0x01 //RS bit
#define DISPLAY_OFF 0x00
#define CLEAR_DISPLAY 0x01
#define HOME_CURSOR 0x02
#define MODE_SET 0x60
#define DISPLAY_ON 0xC0
#define DISPLAY_SHIFT 0x14
#define FUNCTION_SET 0x28
int main()
{
int fd_screen;
wiringPiSetup();
fd_screen = wiringPiI2CSetup(I2C_SCREEN_ADDRESS);
pcf8574Setup(69, I2C_SCREEN_ADDRESS);
if(fd_screen < 0)
{
perror("I2C Setup");
exit(EXIT_FAILURE);
}
lcd_write_cmd(fd_screen, CLEAR_DISPLAY);
lcd_write_cmd(fd_screen, HOME_CURSOR);
lcd_write_cmd(fd_screen, MODE_SET);
lcd_write_cmd(fd_screen, DISPLAY_ON);
lcd_write_cmd(fd_screen, DISPLAY_SHIFT);
lcd_write_cmd(fd_screen, FUNCTION_SET);
//Afficher les caractères A, B et C
lcd_write_data(fd_screen, 'A');
lcd_write_data(fd_screen, 'B');
lcd_write_data(fd_screen, 'C');
//pour test, forcer BACKLIGHT à 0 pour éteindre l'écran
printf("Display OFF dans 2s.\n");
sleep(2);
wiringPiI2CWrite(fd_screen, DISPLAY_OFF);
exit(EXIT_SUCCESS);
}
/******************************************************************************
* lcd_write_cmd(): ecriture d'une commande vers l'écran. Pour une commande,
* RS = 1, RW = 0, LCD_BACKLIGHT = 1, EN = 1 puis 0 pour valider
* Entrée: fd_screen, descripteur de fichier du port I2C; data, donnée à écrire
* Sortie:
* ***************************************************************************/
void lcd_write_cmd(int fd_screen, unsigned char data)
{
unsigned char cmd = 0;
//BL EN RW RS
wiringPiI2CWrite(fd_screen, ((LCD_BACKLIGHT | EN) & ~RS) & ~RW); //1 1 0 0
usleep(100);
cmd = ((data & 0xF0) | (((LCD_BACKLIGHT | EN) & ~RS) & ~RW)); //1 1 0 0
wiringPiI2CWrite(fd_screen, cmd);
usleep(100);
cmd = ((data & 0xF0) | (((LCD_BACKLIGHT & ~EN) & ~RS) & ~RW)); //1 1 0 0
wiringPiI2CWrite(fd_screen, cmd); //1 0 0 0
usleep(100);
wiringPiI2CWrite(fd_screen, ((LCD_BACKLIGHT | EN) & ~RS) & ~RW); //1 1 0 0
usleep(100);
cmd = (((data << 4) & 0xF0) | (((LCD_BACKLIGHT | EN) & ~RS) & ~RW)); //1 1 0 0
wiringPiI2CWrite(fd_screen, cmd);
usleep(100);
cmd = (((data << 4) & 0xF0) | (((LCD_BACKLIGHT & ~EN) & ~RS) & ~RW));//1 1 0 0
wiringPiI2CWrite(fd_screen, cmd); //1 0 0 0
usleep(100);
}
/******************************************************************************
* lcd_write_data(): ecriture d'une donnée vers l'écran. Pour une donnée,
* RS = 0, RW = 0, LCD_BACKLIGHT = 1, EN = 1 puis 0 pour valider
* Entrée: fd_screen, descripteur de fichier du port I2C; data, donnée à écrire
* Sortie:
* ***************************************************************************/
void lcd_write_data(int fd_screen, unsigned char data)
{
unsigned char dt;
wiringPiI2CWrite(fd_screen, ((LCD_BACKLIGHT | EN) | RS) & ~RW);
usleep(100);
dt = ((data & 0xF0) | (((LCD_BACKLIGHT | EN) | RS) & ~RW));
wiringPiI2CWrite(fd_screen, dt);
usleep(100);
dt = ((data & 0xF0) | (((LCD_BACKLIGHT & ~EN) | RS) & ~RW));
wiringPiI2CWrite(fd_screen, dt);
usleep(100);
wiringPiI2CWrite(fd_screen, ((LCD_BACKLIGHT | EN) | RS) & ~RW);
usleep(100);
dt = (((data << 4) & 0xF0) | (((LCD_BACKLIGHT | EN) | RS) & ~RW));
wiringPiI2CWrite(fd_screen, dt);
usleep(100);
dt = (((data << 4) & 0xF0) | (((LCD_BACKLIGHT & ~EN) | RS) & ~RW));
wiringPiI2CWrite(fd_screen, dt);
usleep(100);
} |
Partager