Bonjour,
je veux utiliser un écran GDM200D en mode bus 4 bits avec un expandeur de bus I2C PCF8574.
J'utilise wiringPi I2C et son extension dédiée pour le 8574 en écrivant d'abord le quartet de poids de mes octets (commande et donnée) et en pilotant en parallèle les signaux de commande (RW, RS, EN et BACKLIGHT).
Mon code:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
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);
}
Rien ne se passe à l'écran. La dernière ligne du main() arrive pourtant bien à éteindre l'écran. J'en déduis que wiringPiI2CWrite() fonctionne...
Vu la doc, je pense que je respecte le chronogramme d'écriture sur le GDM2004D.
Si quelqu'un a déjà utilisé cet écran avec cet expandeur, je prend toutes les remarques car je sèche!
Merci.