Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1545 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8
Auteur Sujet :

[ Divers / C ] Ecrire pour un afficheur LCD

n°2109186
gilou
Modérateur
Modzilla
Posté le 02-11-2011 à 05:22:00  profilanswer
 

Reprise du message précédent :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/io.h>
  5. // Base port cablé sur LPT1 ici
  6. #define BASEPORT    0x378
  7. #define DATAREG     BASEPORT+0
  8. #define STATUSREG   BASEPORT+1
  9. #define CONTROLREG  BASEPORT+2
  10. #define REGISTER_DELAY 1
  11. /* ***************************************************************************** */
  12. /*                       Commandes de bas niveau                                 */
  13. /* ***************************************************************************** */
  14. // Envoi de commandes SPP -> LCD
  15. void send_cmd(unsigned char cmd) { // Cas RS=0, (Emission et) RW=0
  16.    
  17.     outb(cmd,  DATAREG);    // Set command in DATA
  18.     outb(0x0B, CONTROLREG); // Set Control [0x0B 0: Emission, B: RS RW E inactive]
  19.     usleep(REGISTER_DELAY);
  20.     outb(0x0A, CONTROLREG); // Signal LCD with a strobe [0x0A 0: Emission, A: E active]
  21.     usleep(REGISTER_DELAY);
  22.     outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Emission, B: RS RW E inactive]
  23.     usleep(REGISTER_DELAY);
  24. }
  25. // Envoi d'un caractere SPP -> LCD
  26. void send_char(char c) {    // Cas RS=1, (Ecriture et) RW = 0
  27.     outb(c,    DATAREG);    // Set command in DATA
  28.     outb(0x03, CONTROLREG); // Set Control [0x03 0: Emission, 3: RS active]
  29.     usleep(REGISTER_DELAY);
  30.     outb(0x02, CONTROLREG); // Signal LCD with a strobe [0x02 0: Emission, 2: RS E active]
  31.     usleep(REGISTER_DELAY);
  32.     outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Emission, B: RS RW E inactive]
  33.     usleep(REGISTER_DELAY);
  34. }
  35. // Lecture busy + addresse courante RAM LCD -> SPP
  36. unsigned char address_read() { // Cas RS=0, (Reception et) RW = 1
  37.     unsigned char address = 0x7F; // Mask for D6..D0
  38.     outb(0x29, CONTROLREG); // Set Control [0x29 2: Reception, 9: RW active]
  39.     usleep(REGISTER_DELAY);
  40.     outb(0x28, CONTROLREG); // Signal LCD with a strobe [0x28 2: Reception, 8: RW E active]
  41.     usleep(REGISTER_DELAY);
  42.     outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Emission, B: RS RW E inactive]
  43.     usleep(REGISTER_DELAY);
  44.     address &= inb(DATAREG);
  45.     return address;
  46. }
  47. // Test du flag busy du LCD.  
  48. int is_busy() {             // Cas RS=0, (Reception et) RW = 1
  49.     unsigned char busy = 0x80; // Mask for D7
  50.     outb(0x29, CONTROLREG); // Set Control [0x29 2: Reception, 9: RW active]
  51.     usleep(REGISTER_DELAY);
  52.     outb(0x28, CONTROLREG); // Signal LCD with a strobe [0x28 2: Reception, 8: RW E active]
  53.     usleep(REGISTER_DELAY);
  54.     outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Emission, B: RS RW E inactive]
  55.     usleep(REGISTER_DELAY);
  56.     busy &= inb(DATAREG);
  57.     return (busy?1:0);
  58. }
  59. // Lecture valeur a l'addresse courante RAM LCD -> SPP
  60. unsigned char data_read() {   // Cas RS=1, (Reception et) RW = 1
  61.     unsigned char data;
  62.     outb(0x21, CONTROLREG); // Set Control [0x21 2: Reception, 1: RS RW active]
  63.     usleep(REGISTER_DELAY);
  64.     outb(0x20, CONTROLREG); // Signal LCD with a strobe [0x20 2: Reception, 0: RS RW E active]
  65.     usleep(REGISTER_DELAY);
  66.     outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Emission, B: RS RW E inactive]
  67.     usleep(REGISTER_DELAY);
  68.     data = inb(DATAREG);
  69.     return data;
  70. }
  71. void busy_wait() { // Cas RS=0, (Reception et) RW = 1
  72.     outb(0x29, CONTROLREG); // Set Control [0x29 2: Reception, 9: RW active]
  73.     usleep(REGISTER_DELAY);
  74.     // Strobe loop
  75.     do {
  76. outb(0x28, CONTROLREG); // Signal LCD with a strobe [0x28 2: Reception, 8: RW E active]
  77. usleep(REGISTER_DELAY);
  78. outb(0x29, CONTROLREG); // Set Control [0x29 2: Reception, 9: RW active]
  79. usleep(REGISTER_DELAY);
  80.     }
  81.     while(0x80 & inb(DATAREG));
  82.     outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Emission, B: RS RW E inactive]
  83.     usleep(REGISTER_DELAY);
  84. }
  85. /* ***************************************************************************** */
  86. /*                       Commandes du LCD                                        */
  87. /* ***************************************************************************** */
  88. // cas 00000001
  89. void LCD_Clear() {
  90.     unsigned char command = 0x01;  // Clear command
  91.     busy_wait();
  92.     send_cmd(command);
  93. }
  94. // cas 0000001x
  95. void LCD_Home() {
  96.     unsigned char command = 0x02;  // Home command
  97.     busy_wait();
  98.     send_cmd(command);
  99. }
  100. // cas 000001xx
  101. void LCD_EntryMode(int lr, int shift) {
  102.     unsigned char command = 0x04;  // Entry Mode command
  103.     if (lr)      command |= 0x02; // Left -> Right [else Right Left] default
  104.     if (shift)   command |= 0x01; // Shift visible  
  105.     busy_wait();
  106.     send_cmd(command);
  107. }
  108. // cas 00001xxx
  109. void LCD_Display(int on, int cursor, int blink) {
  110.     unsigned char command = 0x08;  // DISPLAY command
  111.     if (on)      command |= 0x04; // Display on/off bit
  112.     if (cursor)  command |= 0x02; // Cursor on/off bit
  113.     if (blink)   command |= 0x01; // Cursor blink on/off bit
  114.     busy_wait();
  115.     send_cmd(command);
  116. }
  117. // cas 0001xxxx -> LCD CursorMove (et Display Move)
  118. // cas 001xxxxx
  119. void LCD_Mode(int size8, int line2, int bigfont) {
  120.     unsigned char command = 0x20;  // Mode command
  121.     if (size8)   command |= 0x10; // 8 bit data [else 4 bit data mode] default
  122.     if (line2)   command |= 0x08; // 2 lines mode [else 1 line mode] default
  123.     if (bigfont) command |= 0x04; // 5x11 font [else 5x8 font, default]
  124.     busy_wait();
  125.     send_cmd(command);
  126. }
  127. // cas 01xxxxxx -> LCD Set CGRAM
  128. // cas 1xxxxxxx -> LCD Set DDRAM
  129. /* ***************************************************************************** */
  130. /*                       Fonctions de "haut niveau"                              */
  131. /* ***************************************************************************** */
  132. // Ecriture d'un caractère
  133. void LCD_WriteChar(char c) {
  134.     busy_wait();
  135.     send_char(c);
  136. }
  137. // Ecriture d'une chaine
  138. void LCD_WriteString(char *s) {
  139.     while (*s) {
  140. busy_wait();
  141. send_char(*s++);
  142.     }
  143. }
  144. // Reset du LCD et Initialisation
  145. // Note le hard reset de mise sous tension equivaut a LCD_SoftReset(1,0,0)
  146. void LCD_SoftReset(int size8, int line2, int bigfont) {
  147.     unsigned char command = 0x20;  // Mode command
  148.     if (size8)   command |= 0x10; // 8 bit data [else 4 bit data mode] default
  149.     if (line2)   command |= 0x08; // 2 lines mode [else 1 line mode] default
  150.     if (bigfont) command |= 0x04; // 5x11 font [else 5x8 font, default]
  151.     // Sequence de reinitialisation
  152.     // D'abord, 3 commandes Mode avec la valeur voulue pour bit8
  153.     busy_wait();  // Le flag busy inutilisable ensuite
  154.     send_cmd(command); //  
  155.     usleep(5000);      // more than 4.1 ms
  156.     send_cmd(command);
  157.     usleep(500);      // more than 100 µs
  158.     send_cmd(command); // Maintenant Le flag busy va fonctionner  
  159.    
  160.     // Sequence de parametrage
  161.     LCD_Mode(size8, line2, bigfont); // les valeurs passees seront inchangeables dorenavant
  162.     LCD_Display(0, 0, 0);            // Display Off
  163.     LCD_Clear();                     // Display Clear
  164.     LCD_EntryMode(1, 0);             // Left-Right, no shift
  165. }
  166. int main (int argc, char * argv[]) {
  167.     if (ioperm(BASEPORT, 3, 1)) {
  168. perror("can't set IO permissions!" );
  169. return -1;
  170.     }
  171.     // Attente de fin de l'initialisation hardware le cas échéant
  172.    
  173.     // LCD_SoftReset(1,1,0); // Ce serait bien de tester ceci aussi
  174.     LCD_Display(1, 1, 1); // Display On LCD ON Cursor ON Cursor Blink
  175.     // On peut afficher du texte
  176.     LCD_WriteString("Bonjour le monde ! " );
  177.     printf("Taper quelque chose pour quitter le programme\n" );
  178.     getchar();
  179.     if (ioperm(BASEPORT, 3, 0)) {
  180. perror("can't reset IO permissions!" );
  181. return -1;
  182.     }
  183.     return 0;
  184. }


En jouant sur la valeur de REGISTER_DELAY on devrait finir par tomber sur une qui marche
 
Les changements de mes deux codes précédents:
1) Réécriture en deux phases dans le registre de contrôle, au lieu d'une seule, ça colle mieux avec le datasheet (sinon, le strobe risque de démarrer quand le voltage est pas assez haut sur RS ou RW)  
2) (code suivant)
    code avec busy_wait, au lieu de is_busy  (et donc juste une boucle de strobe-lecture)
Bon, ce coup ci, j’arrête la machine.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 02-11-2011 à 05:22:00  profilanswer
 

n°2109188
Profil sup​primé
Posté le 02-11-2011 à 07:15:48  answer
 

Bonjour Gilou !
 
J'ai rebooté.
J'ai mis les données à zero. (pas de tension sur le bit 8 (en partant de 1) du registre de données)  
J'ai exécuté le programme (avec busy_wait)
Je me trouve avec de la tension faible sur le bit en question. Faible tension mais tension.
Et impossible de le mettre à zéro. Obligé de rebouter.
 
A côté de la broche en question sur le LCD j'ai bien le +5 volt pour le rétro-éclairage mais c'est pas la même tension.
Puis il s'allume qu'à l'exécution du programme.
 
Enfin, soit y a un truc à creuser, j'espère... Ou le port parallèle qui aurait surchauffé ??  

Bonne nuit si non ?
 
 
edit : d'ailleurs, tout les bit de donnée sont à 1.
 
edit 2 : mais dans la version précédente et qui fonctionne ça fait pareil.
 
edit 3 : j'ai pas dormis moi, en fait non, le programme précédent termine avec le bit 8 à zéro.  
 
Désolé Gilou. :/
 
Mine de rien je t'ai tout fait ré-écrire sans parapin a cause d'une soudure.... Je te dois une boutanche.


Message édité par Profil supprimé le 02-11-2011 à 18:47:46
n°2109523
gilou
Modérateur
Modzilla
Posté le 03-11-2011 à 11:51:28  profilanswer
 

[:aka44] I'm baaack!
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109528
Profil sup​primé
Posté le 03-11-2011 à 11:57:11  answer
 

Hello Gilou !  :hello:

n°2109552
gilou
Modérateur
Modzilla
Posté le 03-11-2011 à 13:32:26  profilanswer
 

Bon alors si tu me récapitulais ce qui marche ou pas...
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109582
Profil sup​primé
Posté le 03-11-2011 à 14:58:19  answer
 

busy wait dans les deux dernier code que tu a posté et dans ceux avec parapin, le busy fonction pas non plus.

n°2109586
Profil sup​primé
Posté le 03-11-2011 à 15:03:57  answer
 


Ca c'est ce que marche pas., (je me réveil).
 
Le code précédent les deux dernier, soit celui que je vais poster ici fonctionnerait mais comme je t'ai dis mon afficheur est mort. :/
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/io.h>
  6.  
  7. // Base port cablé sur LPT1 ici
  8. #define BASEPORT    0x378
  9. #define DATAREG     BASEPORT+0
  10. #define STATUSREG   BASEPORT+1
  11. #define CONTROLREG  BASEPORT+2
  12. /* ***************************************************************************** */
  13. /*                       Commandes de bas niveau                                 */
  14. /* ***************************************************************************** */
  15. // Envoi de commandes SPP -> LCD
  16. void send_cmd(unsigned char cmd) { // Cas RS=0, (Emission et) RW=0
  17.  outb(cmd, DATAREG);        // Set command in DATA
  18.  usleep(10);              // Strobe duration: 500 ns  
  19.  outb(0x0A,    CONTROLREG); // Signal LCD with a strobe [0x0A 0: Emission, A: E active]
  20.  usleep(10);                 // Strobe duration: 500 ns    
  21.  outb(0x0B,    CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  22.  usleep(20);                 // Wait before next strobe: 500 ns
  23. }
  24. // Envoi d'un caractere SPP -> LCD
  25. void send_char(char c) {    // Cas RS=1, (Ecriture et) RW = 0
  26.  outb(c,    DATAREG);    // Set command in DATA
  27.  usleep(10);              // Strobe duration: 500 ns  
  28.  outb(0x02, CONTROLREG); // Signal LCD with a strobe [0x02 0: Emission, 2: RS E active]
  29.  usleep(10);              // Strobe duration: 500 ns  
  30.  outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  31.  usleep(20);              // Wait before next strobe: 500 ns
  32. }
  33. // Lecture addresse courante RAM LCD -> SPP
  34. unsigned char address_read (void) { // Cas RS=0, (Reception et) RW = 1
  35.  unsigned char address = 0x7F; // Mask for D6..D0
  36.  
  37.  //outb(0x00, DATAREG);    // reset DATA [NOTE: C'est peut être une précaution inutile, a tester sans ]
  38.  outb(0x28, CONTROLREG); // Signal LCD with a strobe [0x28 2: Reception, 8: RW E active]
  39.  usleep(10);              // Strobe duration: 500 ns
  40.  address &= inb(DATAREG);
  41.  outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  42.  usleep(20);              // Wait before next strobe: 500 ns
  43.  return address;
  44. }
  45. // Test du flag busy du LCD.  
  46. int is_busy() {             // Cas RS=0, (Reception et) RW = 1
  47.  unsigned char busy = 0x80; // Mask for D7
  48.  
  49.  //outb(0x00, DATAREG);    // reset DATA [NOTE: C'est peut être une précaution inutile, a tester sans ]
  50.  outb(0x28, CONTROLREG); // Signal LCD with a strobe [0x28 2: Read, 8: RW E active]
  51.  usleep(10);              // Strobe duration: 500 ns
  52.  busy &= inb(DATAREG);
  53.  outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  54.  usleep(20);              // Wait before next strobe: 500 ns
  55.  return (busy?1:0);
  56. }
  57.  
  58. // Lecture valeur a l'addresse courante RAM LCD -> SPP
  59. unsigned char data_read (void){   // Cas RS=1, (Reception et) RW = 1
  60.  unsigned char data;
  61.  
  62.  //outb(0x00, DATAREG);    // reset DATA [NOTE: C'est peut être une précaution inutile, a tester sans ]
  63.  outb(0x20, CONTROLREG); // Signal LCD with a strobe [0x20 2: Read, 0: RS RW E active]
  64.  usleep(10);              // Strobe duration: 500 ns  
  65.  data = inb(DATAREG);
  66.  outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
  67.  usleep(20);              // Wait before next strobe: 500 ns
  68.  return data;
  69. }
  70. /* ***************************************************************************** */
  71. /*                       Commandes du LCD                                        */
  72. /* ***************************************************************************** */
  73. // cas 00000001
  74. void LCD_Clear() {
  75.  unsigned char command = 0x01;  // Clear command
  76.  send_cmd(command);
  77.  while (is_busy())
  78.    usleep(10);
  79.  //{ printf("Clear\n" ); }
  80.  /* wait */
  81. }
  82. // cas 0000001x
  83. void LCD_Home() {
  84.  unsigned char command = 0x02;  // Home command
  85.  send_cmd(command);
  86.  while (is_busy()) /* wait */;
  87. }
  88. // cas 000001xx
  89. void LCD_EntryMode(int lr, int shift) {
  90.  unsigned char command = 0x04;  // Entry Mode command
  91.  if (lr)      command |= 0x02; // Left -> Right [else Right Left] default
  92.  if (shift)   command |= 0x01; // Shift visible  
  93.  send_cmd(command);
  94.  while (is_busy())
  95.    usleep(10);
  96.  //{ printf("EntryMode\n" ); }
  97.  /* wait */
  98. }
  99. // cas 00001xxx
  100. void LCD_Display(int on, int cursor, int blink) {
  101.  unsigned char command = 0x08;  // DISPLAY command
  102.  if (on)      command |= 0x04; // Display on/off bit
  103.  if (cursor)  command |= 0x02; // Cursor on/off bit
  104.  if (blink)   command |= 0x01; // Cursor blink on/off bit
  105.  send_cmd(command);
  106.  while (is_busy())    
  107.    usleep(10);
  108.  //{ printf("Display\n" ); }
  109.  /* wait */
  110.      
  111. }
  112. // cas 0001xxxx -> LCD CursorMove (et Display Move)
  113. // cas 001xxxxx
  114. void LCD_Mode(int size8, int line2, int bigfont) {
  115.  unsigned char command = 0x20;  // Mode command
  116.  if (size8)   command |= 0x10; // 8 bit data [else 4 bit data mode] default
  117.  if (line2)   command |= 0x08; // 2 lines mode [else 1 line mode] default
  118.  if (bigfont) command |= 0x04; // 5x11 font [else 5x8 font, default]
  119.  send_cmd(command);
  120.  while (is_busy())
  121.    usleep(10);
  122.  //{ printf("Mode !\n" ); }
  123.  /* wait */
  124. }
  125. // cas 01xxxxxx -> LCD Set CGRAM
  126. // cas 1xxxxxxx -> LCD Set DDRAM
  127. /* ***************************************************************************** */
  128. /*                       Fonctions de "haut niveau"                              */
  129. /* ***************************************************************************** */
  130. // Ecriture d'un caractère
  131. void LCD_WriteChar(char c) {
  132.  send_char(c);
  133.  while (is_busy())
  134.    usleep(10);
  135.  //{ printf("WriteChar !\n" ); }
  136.  /* wait */
  137. }
  138. // Ecriture d'une chaine
  139. void LCD_WriteString(char *s) {
  140.  while (*s) {
  141.    send_char(*s++);
  142.    while (is_busy())
  143.      usleep(10);
  144.      //{ printf("WriteString !\n" ); }
  145.    /* wait */
  146.  }
  147. }
  148. // Reset du LCD et Initialisation
  149. // Note le hard reset de mise sous tension equivaut a LCD_SoftReset(1,0,0)
  150. void LCD_SoftReset(int size8, int line2, int bigfont) {
  151.  unsigned char command = 0x20;  // Mode command
  152.  if (size8)   command |= 0x10; // 8 bit data [else 4 bit data mode] default
  153.  if (line2)   command |= 0x08; // 2 lines mode [else 1 line mode] default
  154.  if (bigfont) command |= 0x04; // 5x11 font [else 5x8 font, default]
  155.  // Sequence de reinitialisation
  156.  // D'abord, 3 commandes Mode avec la valeur voulue pour bit8
  157.  
  158.  send_cmd(command); //
  159.  usleep(500);      // more than 4.1 ms
  160.  send_cmd(command);
  161.  usleep(500);      // more than 100 µs
  162.  send_cmd(command); // Maintenant is_busy va fonctionner
  163.  usleep(1300);      //  Peut être un peu de délai en rab avant de tester busy
  164.  //while (is_busy()) /* wait */;   // peut être le remplacer contre un délai long (usleep(5000); par exemple)
  165.  // Sequence de parametrage
  166.  LCD_Clear();                     // Display Clear  // Peut être mettre ceci avant LCD_Mode(size8, line2, bigfont); car dans le reset hard, c'est en premier
  167.  usleep(500);
  168.  LCD_Mode(size8, line2, bigfont); // les valeurs passees seront inchangeables dorenavant
  169.  usleep(500);  
  170.  LCD_Display(0, 0, 0);            // Display Off
  171.  usleep(500);  
  172.  LCD_EntryMode(1, 0);             // Left-Right, no shift
  173.  
  174. }
  175. int main (int argc, char * argv[]) {
  176.  
  177.  if (ioperm(BASEPORT, 3, 1)) {
  178.    perror("can't set IO permissions!" );
  179.    return -1;
  180.  }
  181.  //sleep(1); // Temps necessaire a l'initialisation hard du LCD
  182.  //while (is_busy()) /* wait */; // Ce serait bien de tester ceci à  la place du sleep(1)
  183.  LCD_SoftReset(1,1,0); // Ce serait bien de tester ceci aussi
  184.  //usleep(500);
  185.  LCD_Display(1, 1, 1); // Display On LCD ON Cursor ON Cursor Blink
  186.  printf("Affichage de la chaîne...\n" );
  187.  
  188.  // On peut afficher du texte
  189.  LCD_WriteString(" Hello world !      " );
  190.  
  191.  //printf("Taper quelque chose pour quitter le programme\n" );
  192.  //getchar();
  193.  if (ioperm(BASEPORT, 3, 0)) {
  194.    perror("can't reset IO permissions!" );
  195.    return -1;
  196.  }
  197.  return 0;
  198. }

n°2109590
Profil sup​primé
Posté le 03-11-2011 à 15:31:52  answer
 

Et un truc que je pige pas, à la fin de l'exécution de ce programme ci-dessus, les pin de données sont à 1
Si j'envoie, 0 sur le port de données, ça n'éteint pas, si j'envoie 11 sur le port de contrôle les pin de données s'éteignent.
 
Et je dois envoyer 255 sur le port de contrôle à la finc du programme ci-dessus pour que le texte s'affiche correctement.


Message édité par Profil supprimé le 03-11-2011 à 15:38:12
n°2109607
gilou
Modérateur
Modzilla
Posté le 03-11-2011 à 16:28:28  profilanswer
 

Citation :

Et je dois envoyer 255 sur le port de contrôle à la finc du programme ci-dessus pour que le texte s'affiche correctement.


 
C'est pas normal ça.
 

Citation :

Si j'envoie, 0 sur le port de données, ça n'éteint pas, si j'envoie 11 sur le port de contrôle les pin de données s'éteignent.


0 sur le port de données et 11 en décimal, soit 0x0B en hexa? en principe mon programme envoie 0x0B après toute commande.
outb(0x0B, CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]
 
A+,

Message cité 1 fois
Message édité par gilou le 03-11-2011 à 16:30:43

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109618
Profil sup​primé
Posté le 03-11-2011 à 17:36:40  answer
 

gilou a écrit :


 
0 sur le port de données et 11 en décimal, soit 0x0B en hexa?  


 
oui, j'envoie 0 et 11 en décimal.

mood
Publicité
Posté le 03-11-2011 à 17:36:40  profilanswer
 

n°2109637
gilou
Modérateur
Modzilla
Posté le 03-11-2011 à 19:11:32  profilanswer
 

Et avant ça, le texte ne s'affiche pas correctement?
Y'a rien d'affiché ou du garbage d'affiché?
C'est comme si il avait pas vu le précédent fin de strobe.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109692
Profil sup​primé
Posté le 04-11-2011 à 07:44:27  answer
 

Bonjour gilou !
Y a du texte, mais il est quasiment complètement effacé, et ça scintille.

n°2109702
Profil sup​primé
Posté le 04-11-2011 à 08:57:36  answer
 

j'ai testé le texte suivant :
 

Code :
  1. LCD_WriteString("...... Hello world !" );
  2. LCD_WriteString("                    " ); // ligne vide pour sauter à la seconde ligne.
  3. LCD_WriteString("Bonjour le monde." );


 
A l'affichage, j'ai bien la totalité du texte ; Sauf les 8 premier caractère de la première et seconde ligne qui sont à peine lisible.
Et les pin de données sont bien à zéro.
 
Je pense que c'est du à l'afficheur qui serait en partie grillé.
 
Si j'envoie 255 sur le registre de contrôle, le début des lignes apparaissent, et les pins de donnée sont mis à 1.

n°2109728
gilou
Modérateur
Modzilla
Posté le 04-11-2011 à 11:24:36  profilanswer
 

Citation :

Sauf les 8 premier caractère de la première et seconde ligne qui sont à peine lisible.
 
Si j'envoie 255 sur le registre de contrôle, le début des lignes apparaissent

C'est louche, ça.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109751
Profil sup​primé
Posté le 04-11-2011 à 12:48:51  answer
 

J'ai testé un autre afficheur, mieux soudé et tout, ça marche pas du tout ; Donc, je peut pas avancer pour le moment.
J'irai voir si il y a moyen d'acquérir d'autres afficheurs cet après midi.

n°2109762
gilou
Modérateur
Modzilla
Posté le 04-11-2011 à 13:35:05  profilanswer
 

ça marche, mais partiellement sur un afficheur, et pas du tout sur un autre en meilleur état?  :pt1cable:  
Cette histoire des 8 premiers caractères mal lisibles sur l'autre, qui deviennent visibles avec un demi-strobe en rab, c'est très bizarre.
J'ai plus l'impression d'un pb de synchro qu'autre chose
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109793
Profil sup​primé
Posté le 04-11-2011 à 14:32:44  answer
 

gilou, y aurait il moyen que tu me montre avec ce programme comment en faire une librairie que je pourrais exploiter avec Ada en faisant un import des divers fonction utiliser ici ?
Si tu as du temps.

n°2109823
gilou
Modérateur
Modzilla
Posté le 04-11-2011 à 15:18:20  profilanswer
 

Tu es sous unix/linux, c'est ça?
 
Normalement, une librairie C, c'est comme un programme, sauf que il n'y a pas de main, et tu compiles pour une librairie (en général, son nom commencera par lib) et pas pour un exécutable (tu dois avoir des options de compilation pour cela).
Après, pour l'utiliser depuis ADA, je sais pas trop, mais c'est au niveau
1) de l'édition de lien
2) des conventions d'appel des fonctions (passage de paramêtre, retour de valeur)
qu'il faut vérifier que tout est compatible
 
A+,
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109825
gilou
Modérateur
Modzilla
Posté le 04-11-2011 à 15:26:54  profilanswer
 

En cherchant un peu:
Au niveau du code c, rien à changer, pas besoin de lib, tu peux linker directement avec l'objet résultant de la compilation du code C.
Au niveau Ada, il faut faire les déclarations ad-hoc, avce des Pragma Import cf: http://gcc.gnu.org/onlinedocs/gnat [...] acing-to-C
Et il faut linker le tout au moment de l'édition de lien.
 
A+,


Message édité par gilou le 04-11-2011 à 15:27:39

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109831
Profil sup​primé
Posté le 04-11-2011 à 15:44:21  answer
 

J'ai compilé l'objet C avec l'option "-c" ; j'obtiens un ".o"
 
Après je compile avec gnatmake paralcd -largs c_object.o  
J'ai fait l'import de is_busy en utilisant interfaces.C;
Je me tape un storage_error juste en utilisant is_busy.
 
C'est pas gagné. Mais...
Merci gilou !

n°2109834
Profil sup​primé
Posté le 04-11-2011 à 16:04:59  answer
 

Ca marche !  :o

n°2109894
Profil sup​primé
Posté le 05-11-2011 à 09:07:07  answer
 

Bonjour,
Bonjour à tous.
Bonjour Gilou si tu me lis.
 
Vous ne m'en voudrez pas si je colle un petit bout de code écrit avec Ada j'espère.
J'ai écrit un programme qui affiche un texte défilant sur l'afficheur avec Ada depuis lequel j'ai importé les fonctions qui vont bien.
Je fais défiler le texte caractère par caractère de droite à gauche sur une ligne, le texte fait 19 caractères.
Malheureusement, après quelque itération le programme plante dans une boucle de test de is_busy, soit dans LCD_WriteString, soit dans LCD_Home.
Voici mon code si nécessaire.

Code :
  1. with Interfaces.C;
  2. use Interfaces;
  3. procedure Paralcd is
  4.  
  5.   procedure LCD_SoftReset(Size8 : in C.Int; Line2 : in C.Int; Bigfont : in C.Int);
  6.   pragma Import (C, LCD_SoftReset, "LCD_SoftReset" );
  7.   procedure LCD_Display(on : in C.Int; cursor : in C.Int; blink : in C.Int);
  8.   pragma Import (C, LCD_Display, "LCD_Display" );
  9.   procedure LCD_WriteString(Text : in C.Char_Array);
  10.   pragma Import (C, LCD_WriteString, "LCD_WriteString" );
  11.   procedure LCD_Clear;
  12.   pragma Import (C, LCD_Clear, "LCD_Clear" );
  13.   procedure LCD_Home;
  14.   pragma Import (C, LCD_Home, "LCD_Home" );
  15.   procedure Finalize;
  16.   pragma Import (C, Finalize, "finalize" );
  17.   procedure Open_Port;
  18.   pragma Import (C, Open_Port, "open_port" );
  19.   procedure Close_Port;
  20.   pragma Import (C, Close_Port, "close_port" );
  21.  
  22.   Text1    : String(1..19) := "Bonjour le monde...";
  23.  
  24.   window : String(1..19) := (others => ' ');
  25.  
  26.  
  27.   Size    : C.Int := 1;
  28.   Line    : C.Int := 1;
  29.   Bigfont : C.Int := 0;
  30.   On      : C.Int := 1;
  31.   Cursor  : C.Int := 1;
  32.   Blink   : C.Int := 1;
  33.   use Interfaces.C;
  34.  
  35.   Index : Positive := 1;
  36. begin
  37.   Open_Port;
  38.   LCD_SoftReset(Size, Line, Bigfont);
  39.   delay 0.1;
  40.   LCD_Display(On, Cursor, Blink);
  41.   delay 0.1;
  42.   loop
  43.      for I in reverse 1..19 loop
  44.         Window(I..19) := Text1(1..Index);
  45.         LCD_WriteString(To_C(window));
  46.         delay 0.5;
  47.         --Finalize;
  48.         --delay 0.1;
  49.         LCD_Home;
  50.         delay 0.1;
  51.         Index := Index + 1;
  52.  
  53.      end loop;
  54.      Index := 1;
  55.      window := (others => ' ');
  56.   end loop;
  57.   Close_Port;
  58. end Paralcd;


 
La fonction Finalize est un envoie de la valeur 0x0B sur le registre de contrôle du port parallèle. Elle n'est utile théoriquement que dans mon cas, c'est à dire avec un afficheur partiellement défectueux. Ceci dit le comportement est le même sans son utilisation.
 
J'écris pour creuser l'affaire, à défaut, vous serez avisés.
Par ailleurs, peut-être serait-il intéressant d'implémenter un fonction "LCD_Position" pour positionner le curseur à un emplacement précis de l'afficheur.


Message édité par Profil supprimé le 05-11-2011 à 09:10:37
n°2109895
Profil sup​primé
Posté le 05-11-2011 à 09:57:09  answer
 

Voici une fonction de positionnement du curseur dans l'afficheur.

Code :
  1. void LCD_Position(int pos) {
  2.  outb(0x08, CONTROLREG);
  3.  usleep(20);
  4.  outb(128+pos, DATAREG);
  5.  usleep(20);
  6.  outb(0x0A,    CONTROLREG); // Signal LCD with a strobe [0x0A 0: Emission, A: E active]                                                    
  7.  usleep(10);                 // Strobe duration: 500 ns                                                                                    
  8.  outb(0x0B,    CONTROLREG); // Reset CONTROL [0x0B 0: Write, B: RS RW E inactive]                                                          
  9.  usleep(50);                 // Wait before next strobe: 500 ns                                                                            
  10. }


 
J'ai réussi.  [:chadouw]

n°2109896
gilou
Modérateur
Modzilla
Posté le 05-11-2011 à 11:11:30  profilanswer
 

Oui, au cas ou tu veux savoir quoi envoyer dans reg:
en binaire: 00W0 X0YZ
X 0 on met le port (le registre Data en fait, je pense) en mode sortie, 1 on met le port en mode entrée.
Y: RS inversé [si le bit est a 0, le pin est a 1, etc]
Y: RW inversé
Z: E inversé
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109897
gilou
Modérateur
Modzilla
Posté le 05-11-2011 à 11:15:21  profilanswer
 

Après, ce que tu peux faire, c'est  
Stocker le numéro de ligne et la position dans la ligne dans des variables positionnées et mises à jour dans le programme (et quand tu fais un write, vérifier que tu écris pas plus loin que la limite possible (80 caractères en tout).
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109899
Profil sup​primé
Posté le 05-11-2011 à 11:30:56  answer
 

gilou a écrit :

Oui, au cas ou tu veux savoir quoi envoyer dans reg:
en binaire: 00W0 X0YZ
X 0 on met le port (le registre Data en fait, je pense) en mode sortie, 1 on met le port en mode entrée.
Y: RS inversé [si le bit est a 0, le pin est a 1, etc]
Y: RW inversé
Z: E inversé
 
A+,


C'est trop compliqué pour moi. (c'est quoi cette histoire d'inverse, je croyais que c'était la broche 16 qui était inversée... ??).

gilou a écrit :

Après, ce que tu peux faire, c'est  
Stocker le numéro de ligne et la position dans la ligne dans des variables positionnées et mises à jour dans le programme (et quand tu fais un write, vérifier que tu écris pas plus loin que la limite possible (80 caractères en tout).
A+,


 
Je vais le tordre en deux cet afficheur.
 
A part ça, je pense que la défaillance de l'afficheur influe sur le processus logiciel.
La j'utilise que les derniers caractères de la première ligne, lesquels sont en bon état de fonctionnement et le programme à l'air de tourner.
 
J'affiche "Bonjour !" caractère par caractère de droite à gauche puis je fait clignoter le text complet 5 fois dans une boucle infini.
 
C'est encore écrit avec Ada, je vais le faire avec C.
 

Code :
  1. Size    : C.Int := 1;
  2.   Line    : C.Int := 1;
  3.   Bigfont : C.Int := 0;
  4.   On      : C.Int := 1;
  5.   Cursor  : C.Int := 1;
  6.   Blink   : C.Int := 1;
  7.   Position: C.Int := 18;
  8.   use Interfaces.C;
  9.  
  10. begin
  11.   Open_Port;
  12.   LCD_SoftReset(Size, Line, Bigfont);
  13.   delay 0.2;
  14.   LCD_Display(On, Cursor, Blink);
  15.   delay 0.2;
  16.   LCD_Position(position);
  17.   loop
  18.      for I in 1..9 loop
  19.         LCD_WriteString(To_C(Text1(1..I)));
  20.         delay 0.5;
  21.         Position := Position - 1;
  22.         LCD_Position(position);
  23.         delay 0.1;
  24.      end loop;
  25.      for I in 1..5 loop
  26.         LCD_SoftReset(Size, Line, Bigfont);
  27.         delay 0.2;
  28.         LCD_Display(On, Cursor, Blink);
  29.         delay 0.2;
  30.         LCD_Position(position);
  31.         delay 1.0;
  32.         LCD_WriteString(To_C(Text1(1..9)));
  33.         delay 1.0;
  34.      end loop;
  35.      Position := 18;
  36.      LCD_Position(position);
  37.   end loop;
  38.   Close_Port;
  39. end Paralcd;


 
 
 
A oui, aussi, j'ai testé avec BigFont à 1, ça change rien. C'est pas normal. ??
 
Et la simple utilisation de firefox suffis à perturber l'exécution du programme.
J'ai testé en mettant un renice -5, c'est pas mieux.
Je resterais, je vais écrire le même programme avec C.

n°2109900
Profil sup​primé
Posté le 05-11-2011 à 11:38:43  answer
 

J'ai une autre question sur la production de logiciel avec C.
 
Comment faire pour séparer le main de la bibliothèque ?
 
De souvenir, il faut produire un ".h" mais je ne me souviens pas des détails.

n°2109903
Profil sup​primé
Posté le 05-11-2011 à 12:06:47  answer
 


 
J'ai trouvé.

n°2109905
Profil sup​primé
Posté le 05-11-2011 à 12:19:28  answer
 

Voici le même programme écrit avec C, sauf que j'ai utilisé LCD_WriteChar au lieu de LCD_WriteString.

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <libparalcd.h>
  6.  
  7. int main (void)
  8. {
  9.  if (ioperm(BASEPORT, 3, 1)) {
  10.    perror("can't set IO permissions!" );
  11.    return -1;
  12.  }
  13.  int i;
  14.  int position = 18;
  15.  char FullText[9] = {'B', 'o', 'n', 'j', 'o', 'u', 'r', ' ', '!'};
  16.  port_clear();  
  17.  LCD_SoftReset(1,1,0);
  18.  usleep(500);
  19.  LCD_Display(1, 1, 1); // Display On LCD ON Cursor ON Cursor Blink  
  20.  LCD_Position(position);
  21.  while (1) {
  22.    for (i = 0; i <= 8 ; i++) {
  23.      int j;
  24.      for (j = 0 ; j <= i ; j++) {
  25.     LCD_WriteChar(FullText[j]);
  26.      }
  27.      sleep(1);
  28.      position = position - 1;
  29.      LCD_Position(position);
  30.    }
  31.    for (i = 1 ; i <= 5 ; i++) {
  32.      LCD_SoftReset(1, 1, 0);
  33.      usleep(500);
  34.      LCD_Display(1, 1, 1);
  35.      usleep(500);
  36.      sleep(2);
  37.      LCD_Position(position);
  38.      usleep(500);
  39.      int j;
  40.      for (j = 0 ; j <= 8 ; j++) {
  41.     LCD_WriteChar(FullText[j]);
  42.      }
  43.      sleep(3);
  44.    }
  45.    position = 18;
  46.    LCD_Position(position);
  47.  }
  48.  if (ioperm(BASEPORT, 3, 0)) {
  49.    perror("can't reset IO permissions!" );
  50.    return -1;
  51.  }  
  52.  return 0;
  53. }

n°2109910
gilou
Modérateur
Modzilla
Posté le 05-11-2011 à 13:47:27  profilanswer
 

Les 4 bits du bas du registre CONTROL sont associés a des pins (en écriture seulement) du port //.
Bit 0 -> Pin 0 (E)
Bit 1 -> Pin 14 (RW)
Bit 2 -> Pin 16 (pas utilisé)
Bit 3 -> Pin  17 (RS)
 
Les 3 qu'on utilise sont inversés (si le bit est a 0, le pin est a 1 et réciproquement) [alors que celui qu'on utilise pas est pas inversé, lui :pt1cable: ]
C'est assez facile ensuite de se faire une table de correspondance:
Si on veut en sortie:  alors CONTROL a en bits du bas:
                             Sans strobe   Avec Strobe
RS = 0 et RW = 0             B                 A
RS = 0 et RW = 1             9                 8
RS = 1 et RW = 0             3                 2
RS = 1 et RW = 1             1                 0
Et les bits du haut de CONTROL, c'est 0: DATA en écriture // -> LCD  
                                                   2: DATA en lecture  // <- LCD
                             
 
 

Citation :

A oui, aussi, j'ai testé avec BigFont à 1, ça change rien. C'est pas normal. ??


Ca laisse penser que le SoftReset marche pas
 

Citation :

Et la simple utilisation de firefox suffis à perturber l'exécution du programme.

:ouch:  :ouch:  :ouch:  
Très très bizarre, ça.
A+,


Message édité par gilou le 05-11-2011 à 13:51:03

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109914
Profil sup​primé
Posté le 05-11-2011 à 15:14:44  answer
 

Merci gilou.
 
A quoi sert is_busy en fait ?
Je l'ai biaisé, j'ai mis un usleep(2000); à la place, ça fonctionne.

n°2109941
gilou
Modérateur
Modzilla
Posté le 05-11-2011 à 18:52:51  profilanswer
 

Le is_busy attends que le LCD dise qu'il est prêt pour recevoir l'instruction suivante.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109944
Profil sup​primé
Posté le 05-11-2011 à 19:06:38  answer
 

gilou a écrit :

Le is_busy attends que le LCD dise qu'il est prêt pour recevoir l'instruction suivante.
A+,


La ça fait trois heure que ça tourne sans is_buzy, mais parfois ça marche parfois ça marche pas (ça affiche pas le texte défilant à 20 char/s)
Je vais tester un autre jeux de délais d'attente, mais c'est pas le même partout parce que j'ai essayé avec REGISTERY_DELAY, ça n'a pas marché.
 

n°2109949
Profil sup​primé
Posté le 05-11-2011 à 19:43:44  answer
 

j'ai mis 500nano seconde partout, ça tourne mais ça affiche pas.  :D  :lol:

n°2109953
Profil sup​primé
Posté le 05-11-2011 à 20:02:56  answer
 

En fait buzy rempli pas ça fonction j'ai l'impression. Ou alors, l'afficheur est mort de ce côté aussi.
La j'ai registery_delay à 500 nano seconde et j'ai mis du delay entre les appel au diverses fonction, et l'affichage est crade.
Si non ça tourne.

n°2109956
Profil sup​primé
Posté le 05-11-2011 à 20:32:18  answer
 

gilou a écrit :

Code :


En jouant sur la valeur de REGISTER_DELAY on devrait finir par tomber sur une qui marche
 
Les changements de mes deux codes précédents:
1) Réécriture en deux phases dans le registre de contrôle, au lieu d'une seule, ça colle mieux avec le datasheet (sinon, le strobe risque de démarrer quand le voltage est pas assez haut sur RS ou RW)  
2) (code suivant)
    code avec busy_wait, au lieu de is_busy  (et donc juste une boucle de strobe-lecture)
Bon, ce coup ci, j’arrête la machine.
 
A+,


 
Dans ce code il y a LCD_Clear qui bug.

n°2109967
Profil sup​primé
Posté le 05-11-2011 à 21:38:45  answer
 


 
Il faut que je reprène ce code, parce qu'apparemment le code suivant, selon l'ordre des fonction la fonction LCD_Home marche pas.
Je dis ça de mémoire. Dans celui- ci on sauvegarde le registre c'est intéressant.
 

gilou a écrit :

[:wark0]  
 
 
Bon ben maintenant que ça marche, on va essayer un code propre et efficace:
 

Message cité 1 fois
Message édité par Profil supprimé le 05-11-2011 à 21:39:31
n°2109968
Profil sup​primé
Posté le 05-11-2011 à 21:48:59  answer
 


 
 
Puré, tout est encore faux, je vois pas le curseur @Home parce que l'afficheur est défectueux.  :(  :sweat:

n°2109972
Profil sup​primé
Posté le 05-11-2011 à 22:40:05  answer
 

Je suis tout décalé.
 
Pour aller sur le 11iemme caractère de la seconde ligne je dois mettre 82 comme position maintenant.  :heink:  
 
Ca fonctionnait bien tout à l'heure.  :pt1cable:

n°2109979
gilou
Modérateur
Modzilla
Posté le 06-11-2011 à 04:43:02  profilanswer
 

Tiens, si tu as l'occasion, tu peux me tester cela?
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/io.h>
  5. // Base port cablé sur LPT1 ici
  6. #define BASEPORT    0x378
  7. #define DATAREG     BASEPORT+0
  8. #define STATUSREG   BASEPORT+1
  9. #define CONTROLREG  BASEPORT+2
  10. // Clear E : outb(control |= 0x01, CONTROLREG);  
  11. // Clear RW: outb(control |= 0x02, CONTROLREG);  
  12. // Clear RS: outb(control |= 0x08, CONTROLREG);
  13. // Set E   : outb(control &= 0xFE, CONTROLREG);
  14. // Set RW  : outb(control &= 0xFD, CONTROLREG);  
  15. // Set RS  : outb(control &= 0xF7, CONTROLREG);
  16. // Set incoming: outb(control |= 0x20, CONTROLREG);
  17. // Set outgoing: outb(control &= 0xD0, CONTROLREG);
  18. #define Clear_E(z)   outb(z |= 0x01, CONTROLREG)
  19. #define Clear_RW(z)  outb(z |= 0x02, CONTROLREG)
  20. #define Clear_RS(z)  outb(z |= 0x08, CONTROLREG)
  21. #define Set_E(z)     outb(z &= 0xFE, CONTROLREG)
  22. #define Set_RW(z)    outb(z &= 0xFD, CONTROLREG)
  23. #define Set_RS(z)    outb(z &= 0xF7, CONTROLREG)
  24. #define DataIn(z)    outb(control |= 0x20, CONTROLREG)
  25. #define DataOut(z)   outb(control &= 0xD0, CONTROLREG)
  26. #define GetControl() inb(CONTROLREG)
  27. #define GetData()    inb(DATAREG)
  28. #define SetData(z)   outb(z, DATAREG)
  29. void wait_LCD() {
  30.     unsigned char control = GetControl();
  31.     unsigned char data = 0xFF;
  32.     int maxtries = 255;
  33.     while (data && maxtries) {
  34. Clear_E(control);     
  35. Clear_RS(control);   
  36. Set_RW(control);     
  37. SetData(0xFF);         // Set All Pins to FF before read
  38. DataIn(control);     
  39. Set_E(control);        // Strobe command to LCD
  40. data = GetData();      // Read Data
  41. data &= 0x80;          // Get high bit
  42. DataOut(control);     
  43. --maxtries;
  44.     }
  45.     Clear_E(control);     
  46.     Clear_RW(control);      // Avoid Bus conflict
  47. }
  48. void LCD_Init(){
  49.     unsigned char control = GetControl();
  50.    
  51.     Clear_RS(control);
  52.     SetData(0x38);      // 8 bits, 2 lignes, (Fonte 5x8)
  53.     Set_E(control);
  54.     Clear_E(control);
  55.     wait_LCD();
  56.     Clear_RS(control);
  57.     SetData(0x0E);      // Display ON Cursor ON
  58.     Set_E(control);
  59.     Clear_E(control);
  60.     wait_LCD();
  61.     Clear_RS(control);
  62.     SetData(0x06);      // Left -> Right
  63.     Set_E(control);
  64.     Clear_E(control);
  65.     wait_LCD();
  66. }
  67. void LCD_ClearDisplay() {
  68.     unsigned char control = GetControl();
  69.     Clear_RS(control);
  70.     SetData(0x01);
  71.     Set_E(control);
  72.     Clear_E(control);
  73.     wait_LCD();
  74. }
  75. void LCD_WriteChar(char c) {
  76.     unsigned char control = GetControl();
  77.    
  78.     Set_RS(control);
  79.     SetData(c);
  80.     Set_E(control);
  81.     Clear_E(control);
  82.     wait_LCD();
  83. }
  84. void LCD_WriteString(char *s) {
  85.     while (*s)
  86. LCD_WriteChar(*s++);
  87. }
  88. void LCD_CursorStartLine1() {
  89.     unsigned char control = GetControl();
  90.    
  91.     Clear_RS(control);
  92.     SetData(0x80);
  93.     Set_E(control);
  94.     Clear_E(control);
  95.     wait_LCD();
  96. }
  97. void LCD_CursorStartLine2() {
  98.     unsigned char control = GetControl();
  99.    
  100.     Clear_RS(control);
  101.     SetData(0xC0);
  102.     Set_E(control);
  103.     Clear_E(control);
  104.     wait_LCD();
  105. }
  106. int main (int argc, char * argv[]) {
  107.     if (ioperm(BASEPORT, 3, 1)) {
  108. perror("can't set IO permissions!" );
  109. return -1;
  110.     }
  111.     LCD_Init();
  112.     LCD_ClearDisplay();
  113.     LCD_WriteString("Hello" );
  114.     LCD_CursorStartLine2();
  115.     LCD_WriteString("Jovalise!" );
  116.     printf("Taper quelque chose pour quitter le programme\n" );
  117.     getchar();
  118.     if (ioperm(BASEPORT, 3, 0)) {
  119. perror("can't reset IO permissions!" );
  120. return -1;
  121.     }
  122.     return 0;
  123. }


 
Bon, je vais dormir.
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2109983
Profil sup​primé
Posté le 06-11-2011 à 08:04:23  answer
 

Bonjour gilou.
 
J'arrive au getchar du main, mais j'affiche rien.
J'ai mis des délais de 500ns un peu partout, ça donne pas mieux.
 
A la fin de l'exécution tous les pin de données sont à 1.

Message cité 1 fois
Message édité par Profil supprimé le 06-11-2011 à 10:33:47
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8

Aller à :
Ajouter une réponse
 

Sujets relatifs
[C] Modifier un tableau existant ... pour bouger un pion ![C# / .Net] Migration OS 32Bits vers OS 64Bits. Quid des Perfs?
[C#] FormView, edit/insert mode[C] programme cherche les racines des polynomes
[C] trouver la longueur de la plus longue suite decroissante en CC++, Compter des caractères ...
Linux C/C++ broadcast UDP sur machine sans gatewayConvolution de 2 tableaux unidimensionnels avec FFTW C++
Plus de sujets relatifs à : [ Divers / C ] Ecrire pour un afficheur LCD


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR