Forum Électro-Bidouilleur

Merci de vous connecter ou de vous inscrire.

Connexion avec identifiant, mot de passe et durée de la session
Recherche avancée  

Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=register Les demandes d'inscription sont révisées quotidiennement.

Auteur Sujet: LCD liaison parallèle  (Lu 3359 fois)

Le bricolaïre

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
LCD liaison parallèle
« le: avril 02, 2017, 12:53:25 pm »

Bonjour tout le monde,
voulant créer un module d'affichage de la tension de sortie d'un amplificateur, je me suis tourné vers un de ces petits écrans lcd 2x16 (doc technique : http://www.gotronic.fr/pj-1144.pdf).
Cependant, étant radin, j'ai voulu acheter le moins cher mais de ce fait l'afficheur ne possède pas de liaison série. ;D
Pas de problème, je comptais de toute façon me lancer le défi de le faire fonctionner en parallèle, c'est normalement censé être quelque chose d'assez facile...
Et voilà  le problème, cela fait plusieurs jours que j'essaie de le faire fonctionner sans succès, même après avoir épluché maintes fois sa documentation technique :'( de plus, je n'ai pas trouvé beaucoup de documentation sur internet, la majorité des personnes utilisant soit des arduinos (qui apparement ont une librairie intégrée pour les afficheurs), soit une liaison série. Pour ma part, je travaille avec un Picaxe 20M2.
Voici mon schéma de branchement :

Voici mon code actuel inspiré de la doc :
gosub initialisation ;aller au sous programme init
pause 200 ;pause de 200ms

main:
let b1 = 84 ;envoie 87 ("T", ASCII) dans la variable b1
gosub sendchar
pause 500

let b1 = 69 ;envoie "E"
gosub sendchar
pause 500

let b1 = 101 ;envoie "e"
gosub sendchar
pause 500

let b1 = 115 ;envoie "s"
gosub sendchar
pause 500

let b1 = 116 ;envoie "t"
gosub sendchar

pause 4000

let b1 = 2 ;return home
gosub sendinstr
pause 2000

goto main


initialisation: ;sous programme d'initialisation
pause 500
let b1 = 56 ;indique à  l'afficheur que l'on veut travailler avec 8 bits sur 2 lignes
gosub sendinstr
pause 50

let b1 = 14 ;active l'affichage
gosub sendinstr
pause 50

let b1 = 6 ;incremente l'adresse
gosub sendinstr
pause 50
return

sendchar: ;sous programme d'envoi d'un caractere
pause 10
high C.0 ;RS = 1
let pinsB = b1
high C.1 ;E = 1
pause 10
low C.1 ;E = 0
pause 10
return

sendinstr: ;sous programme d'envoi d'une instruction
pause 10
low C.0 ;RS = 0
let pinsB = b1
high C.1 ;E = 1
pause 10
low C.1 ;E = 0
pause 10
return
Avec ce code j'obtiens... le néant ::)

L'afficheur reste comme ça éternellement :'(
Voilà  pourquoi je viens aujourd'hui demander votre aide car je n'ai absolument plus aucune idée d'où le problème peut venir, j'ai surement dû louper une étape... ou je suis juste nul ::)
Merci d'avance
Le bricolaïre

PS : Electro-bidouilleur, si vous passez par là , je tenais à  vous remercier pour le travail que vous faites sur votre chaîne youtube et le contenu que vous nous proposez. C'est toujours intéressant et on en apprend plus à  chaque épisode. Vraiment, c'est cool  :)
IP archivée

Électro-Bidouilleur

  • Administrator
  • Hero Member
  • *****
  • Messages: 929
  • C'est moi le boss!
    • Voir le profil
    • Site Web Électro-Bidouilleur
Re : LCD liaison parallèle
« Réponse #1 le: avril 02, 2017, 03:36:54 pm »

Bonjour,

Merci des gentils commentsires sur ma chaîne!  :D 8)

Ça fait depuis 2009 que je n'ai pas touché à  un LCD 44780 en mode parallèle. Alors mon aide sera limitée. Mais avez-vous bien fait l'ajustement du contraste du LCD? Ça peut nous faire croire que rien ne fonctionne...

De mémoire, je l'adressais en 4 bits. Voici la partie de code C PIC pertinent à  l'affichage. Peut-être verrez-vous une instruction que vous avez oubliée.

// LCD Initialisation
send_cmd_lcd(FOUR_BIT_INIT); // Sets the interface to 4 bits. Must be sent first.
send_cmd_lcd(FOUR_BIT_INIT2); // Sets the interface to 4 bits, display to 2-lines, character size to 5x8. Must be sent second.
send_cmd_lcd(ENTRY_INC); // Set the character entry mode to cursor increment to the right
send_cmd_lcd(DDRAM_L1_C1); // Set the DDRAM address location

// transfer custom-made characters into CGRAM of display
// Right arrow character transfer into CGRAM
send_cmd_lcd(CGRAM_CHAR_1_ADDR); //Position the pointer to first CGRAM character line-1 address
for (i=0; i<=6; i++)
{
send_char_lcd(Arrow_rgt_Array[i]);
}
// Left arrow character transfer into CGRAM
send_cmd_lcd(CGRAM_CHAR_2_ADDR); //Position the pointer to second CGRAM character line-1 address
for (i=0; i<=6; i++)
{
send_char_lcd(Arrow_lft_Array[i]);
}
// Complete LCD Initialisation
send_cmd_lcd(CLR_DISP); // Clear display and bring cursor home
send_cmd_lcd(DISP_ON); // Turn on display

// Character displaying section. Here, a simulation of an antenna rotator is shown.
while(1)
{
/* i=0;
send_cmd_lcd(DDRAM_L1_C1); // Set the DDRAM address location for line 1, column 1.
send_char_lcd('A'); // Sends character
send_char_lcd('z'); // Sends character
send_char_lcd('\x00'); // Sends character
send_char_lcd(' '); // Sends character
send_char_lcd('2'); // Sends character
send_char_lcd('8'); // Sends character
send_char_lcd('5'); // Sends character
send_char_lcd('\xDF'); // Sends character
send_cmd_lcd(DDRAM_L2_C1); // Set the DDRAM address location for line 2, column 1.
send_char_lcd('E'); // Sends character
send_char_lcd('l'); // Sends character
send_char_lcd('\x01'); // Sends character
send_char_lcd(' '); // Sends character
send_char_lcd('3'); // Sends character
send_char_lcd('7'); // Sends character
send_char_lcd('\xDF'); // Sends character
*/
send_str_lcd(DDRAM_L1_C1,"ALLO toi!\x00");
}

Voici le fichier header des fonctions:
/* lcd_driver.h
v1, February 2009

TARGET device: PIC18F2220
Compiler: SourceBoost's BoostC for PIC
IDE: SourceBoost IDE

Make sure you assign the LCD lines as follows:
- In the main program .c object file, assign the lcd_port variable to @PORTA, @PORTB, @PORTC or @PORTD
  based on the PIC port to which the LCD is wired to.

- In the main program .c object file, assign the lcd_tris variable to @TRISA, @TRISB, @TRISC or @TRISD
  based on the PIC port to which the LCD is wired to.

- Connect the LCD signals to the selected PIC port as follows:
PIC port pin 0: LCD DB0 signal
PIC port pin 1: LCD DB1 signal
PIC port pin 2: LCD DB2 signal
PIC port pin 3: LCD DB3 signal
PIC port pin 4: LCD E   signal
PIC port pin 5: LCD RW  signal
PIC port pin 6: LCD RS  signal
*/

// Constants and Masks Definition
#define LCD_READ_TRIS 0b00001111  //The mask used to set the LCD port to read
#define LCD_DATA_CLEAR_MASK 0b11110000 //Used to clear the LCD transmitted character nibble on the LCD port.
#define LOW_NIBBLE_MASK 0b00001111 //Used to isolate the low nibble of a char.
#define RS 6 // LCD Register Select control line
#define RW 5 // LCD Read/Write control line
#define E 4 // LCD Enable control line
#define LCD_BUSY_FLAG 3 // This is the LCD Busy flag bit position
#define DISP_ON 0b00001100 // Display on
#define DISP_ON_CURS_ON 0b00001110 // Display on, Cursor on
#define DISP_ON_CURS_ON_BLNK 0b00001111 // Display on, Cursor on, Blink cursor
#define DISP_OFF 0b00001000 // Display off
#define CLR_DISP 0b00000001 // Clear the Display
#define RET_HOME 0b00000010 // Bring the cursor back home
#define LCD_SHIFT_RIGHT         0b00011100 // Shift entire display right by one position
#define LCD_SHIFT_LEFT          0b00011000 // Shift entire display left by one position
#define CURS_SHIFT_RIGHT 0b00010100 // Moves cursot right by one position
#define CURS_SHIFT_LEFT 0b00010000 // Moves cursot left by one position
#define ENTRY_INC 0b00000110 // Sets the cursor move / display shift mode to move right
#define ENTRY_INC_S 0b00000111 // Sets the cursor move / display shift mode to move and shift right
#define ENTRY_DEC 0b00000100 // Sets the cursor move / display shift mode to move left
#define ENTRY_DEC_S 0b00000101 // Sets the cursor move / display shift mode to move and shift left
#define FOUR_BIT_INIT 0b00000010 // Sets the cursor move / display shift mode to move and shift left
#define FOUR_BIT_INIT2 0b00101000 // Sets the cursor move / display shift mode to move and shift left
#define DDRAM_L1_C1 0b10000000 // Least Significant 7-bit are for DDRAM address
#define DDRAM_L2_C1 0b11000000 // Least Significant 7-bit are for DDRAM address
#define CGRAM_CHAR_1_ADDR 0b01000000 // Least Significant 6-bit are for CGRAM address
#define CGRAM_CHAR_2_ADDR 0b01001000 // Least Significant 6-bit are for CGRAM address


char check_busy_lcd(void) // Checks if LCD is busy or ready. 1=busy, 0=ready
{
unsigned char lcd_busy;
lcd_tris = LCD_READ_TRIS; // Set RA6 - 4 = outputs, RA3 - 0 = inputs
clear_bit(lcd_port, RS ); // Set LCD for Command mode
set_bit(lcd_port, RW ); // Setup to read busy flag
set_bit(lcd_port, E ); // Set E high
delay_ms(1);
lcd_busy = test_bit(lcd_port,LCD_BUSY_FLAG); // Read Busy flag value
clear_bit(lcd_port,E); // Set E low
delay_ms(1);
set_bit(lcd_port,E); // Set E high to read other nibble (to flush LCD buffer)
delay_ms(1);
clear_bit(lcd_port,E); // Set E low
clear_bit(lcd_port, RW ); // Setup to write to LCD later
lcd_tris = 0b00000000; // Set RA6 - 4 = outputs, RA3 - 0 = outputs
return lcd_busy; // Send the busy flag to calling code
}


void send_char_lcd(char lcd_char) // This routine checks the busy flag, returns when not busy       
{
while(check_busy_lcd() == 1); // Wait for LCD to become idle
lcd_port = 0; //Clear all bits on the LCD port
lcd_port = lcd_port | (lcd_char >> 4); // transfer the high character nibble into the data bits)
clear_bit(lcd_port, RW ); // Setup to write to LCD
set_bit(lcd_port, RS ); // Set LCD for Data mode
set_bit(lcd_port, E ); // Set E high
delay_ms(1);
clear_bit(lcd_port,E); // Set E low
lcd_port = lcd_port & LCD_DATA_CLEAR_MASK; // Clear the character bits on the port
lcd_port = lcd_port | (lcd_char & LOW_NIBBLE_MASK); // transfer the low character nibble into the data bits
set_bit(lcd_port, E ); // Set E high
delay_ms(1);
clear_bit(lcd_port,E); // Set E low
}

void send_cmd_lcd(char lcd_char) // This routine checks the busy flag, returns when not busy       
{
while(check_busy_lcd() == 1); // Wait for LCD to become ready
lcd_port = 0; //Clear all bits on the LCD port
lcd_port = lcd_port | (lcd_char >> 4); // transfer the high character nibble into the data bits)
clear_bit(lcd_port, RW ); // Setup to write to LCD
clear_bit(lcd_port, RS ); // Set LCD for Command mode
set_bit(lcd_port, E ); // Set E high
delay_ms(1);
clear_bit(lcd_port,E); // Set E low
lcd_port = lcd_port & LCD_DATA_CLEAR_MASK; // Set LCD for 4-bit interface and clear the character bits on the port
lcd_port = lcd_port | (lcd_char & LOW_NIBBLE_MASK); // transfer the low character nibble into the data bits
set_bit(lcd_port, E ); // Set E high
delay_ms(1);
clear_bit(lcd_port,E); // Set E low
}

void send_str_lcd(char lcd_addr, const char* lcd_str)  //This routine sends a string of characters to the display in consecutive positions.
{
send_cmd_lcd(lcd_addr); // Set the DDRAM address location for line 1, column 1.
for(i = 0; i <= (strlen(lcd_str) - 1); i++) // Repeat sending characters until the null terminator (0x00) is found
{
send_char_lcd(lcd_str[i]);
}
}



IP archivée

Le bricolaïre

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re : LCD liaison parallèle
« Réponse #2 le: avril 03, 2017, 05:17:08 am »

Bonjour,
merci beaucoup pour la réponse rapide, je vais éplucher votre code pour voir s'il me manque quelque chose :)
IP archivée

Petimorillo

  • Newbie
  • *
  • Messages: 20
  • Des idées et des pepins plein le citron!
    • Voir le profil
Re : LCD liaison parallèle
« Réponse #3 le: avril 27, 2017, 02:36:15 pm »

Bonjour, si vous avez trouvé quelque chose de plus sur votre problème ça m'intéresse car j'ai quelques lcd parallèles mais pas encore essayé de les mettent en route.
IP archivée