Laweack
Newbie level 6
Hello everybody, i'm a new user of pic and i tried to program a pic to control an lcd.
The pic is a 18F47J53 ( starter kit )
The LCD is a BTHQ 100032V-FSTF-LEDwhite W.C. using SED1520
So i start to program it on MPLAB IDE and i have already some difficulties :s
I connected differents pin on the LCD : On the PORTD i have connected DB0 to DB7 and on the PORTB i have connected E2,E1,A0 and R/W respectivly on the bit 4 , 5 , 6 and 7.
I have made a C code too :
(Commentaries are in french )
I take this code on the post : https://www.edaboard.com/threads/97884/
and i made modification because i didnt find the same value for the configuration of the differents ports but with this code all of the line of my LCD are on and i dont understand why :s This is the first time i program a pic and i really want to make the LCD works ! i dont know if i put all the necessary librairies but apparently i did..
Thx for your answers if you have some ideas (and sorry for my bad english )
The pic is a 18F47J53 ( starter kit )
The LCD is a BTHQ 100032V-FSTF-LEDwhite W.C. using SED1520
So i start to program it on MPLAB IDE and i have already some difficulties :s
I connected differents pin on the LCD : On the PORTD i have connected DB0 to DB7 and on the PORTB i have connected E2,E1,A0 and R/W respectivly on the bit 4 , 5 , 6 and 7.
I have made a C code too :
Code:
#include <stdio.h>
#include <stdlib.h>
#include <p18f47j53.h>
#include <GenericTypeDefs.h>
#include <pconfig.h>
#include <io.h>
//Prototype des fonctions
void Display(int Status);
void Display_Start_Line(int ligne);
void Column_Address(int colonne);
void SetPage(int page);
void Write_Display(int Line);
void ADC_Select(int Output);
void DutyCycle(int Switch);
void Static_Drive(int Drive);
void End();
void Delay();
void Delay()
{
int i;
for(i=0; i<100; i++);
}
void Display(int Status) // attention statut = 0 ou 1
{
static int DATA;
DATA=0xAE ;// Status; // On effectue un ou avec le statut permettant dobtenir les deux choix possibles soit D7->D0 = AE ou AF
//PORTD=DATA;
//PORTB=0x00; // A0 = Bit 0
// R/W = Bit 1
// E2 = Bit 2
// E1 = Bit 3
PORTB=0x90; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 1 et E2 = 0 ( Controle de la partie gauche de l'écran )
PORTD=DATA; // On ecrit la bonne sequence ds le portD
PORTB=0xA0; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 0 et E2 = 1 ( Controle de la partie droite de l'écran )
PORTD=DATA;
PORTD=0x00; // On reinitialise les ports a la valeur 0
PORTB=0x00;
}
void Display_Start_Line(int ligne) // attention ligne compris entre 0 et 31
{
static int DATA;
DATA=0xC0 | ligne ; // On effectue un ou avec la variable ligne (mot de 5bits) permettant dobtenir la combinaison definissant une des 32 lignes
PORTD=DATA;
PORTB=0x00; // A0 = Bit 0
// R/W = Bit 1
// E2 = Bit 2
// E1 = Bit 3
PORTB=0xA0; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 1 et E2 = 0 ( Controle de la partie gauche de l'écran )
PORTD=DATA; // On ecrit la bonne sequence ds le portD
Delay();
PORTB=0x90; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 0 et E2 = 1 ( Controle de la partie droite de l'écran )
PORTD=DATA;
Delay();
PORTD=0x00; // On reinitialise les ports a la valeur 0
PORTB=0x00;
}
void Column_Address(int colonne) // attention colonne compris entre 0 et 79
{
static int DATA;
DATA=0x00 | colonne ; // On effectue un ou avec la variable colonne (mot de 7bits) permettant dobtenir la combinaison definissant une des 79 colonnes
PORTD=DATA;
PORTB=0x00; // A0 = Bit 0
// R/W = Bit 1
// E2 = Bit 2
// E1 = Bit 3
PORTB=0xA0; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 1 et E2 = 0 ( Controle de la partie gauche de l'écran )
PORTD=DATA; // On ecrit la bonne sequence ds le portD
Delay();
PORTB=0x90; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 0 et E2 = 1 ( Controle de la partie droite de l'écran )
PORTD=DATA;
Delay();
PORTD=0x00; // On reinitialise les ports a la valeur 0
PORTB=0x00;
}
void Page(int page) // attention page compris entre 0 et 3
{
static int DATA;
DATA=0x00 | page ; // On effectue un ou avec le nummero de la page nous permettant de nous placer sur la bonne page
PORTD=DATA;
PORTB=0x00; // A0 = Bit 0
// R/W = Bit 1
// E2 = Bit 2
// E1 = Bit 3
PORTB=0xA0; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 1 et E2 = 0 ( Controle de la partie gauche de l'écran )
PORTD=DATA; // On ecrit la bonne sequence ds le portD
Delay();
PORTB=0x90; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 0 et E2 = 1 ( Controle de la partie droite de l'écran )
PORTD=DATA;
Delay();
PORTD=0x00; // On reinitialise les ports a la valeur 0
PORTB=0x00;
}
void DutyCycle(int Switch) // attention Switch = 0 ou 1
{
static int DATA;
DATA=0xA8 | Switch; // On effectue un ou avec la variable switch permettant dobtenir les deux choix possibles soit D7->D0 = AE ou AF
PORTD=DATA;
PORTB=0x00; // A0 = Bit 0
// R/W = Bit 1
// E2 = Bit 2
// E1 = Bit 3
PORTB=0xA0; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 1 et E2 = 0 ( Controle de la partie gauche de l'écran )
PORTD=DATA; // On ecrit la bonne sequence ds le portD
Delay();
PORTB=0x90; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 0 et E2 = 1 ( Controle de la partie droite de l'écran )
PORTD=DATA;
Delay();
Delay();
PORTD=0x00; // On reinitialise les ports a la valeur 0
PORTB=0x00;
}
void ADC_Select(int Output) // attention Output = 0 ou 1
{
static int DATA;
DATA=0xA0 | Output; // On effectue un ou avec la variable Output permettant dobtenir les deux choix possibles soit D7->D0 = AE ou AF
PORTD=DATA;
PORTB=0x00; // A0 = Bit 0
// R/W = Bit 1
// E2 = Bit 2
// E1 = Bit 3
PORTB=0xA0; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 1 et E2 = 0 ( Controle de la partie gauche de l'écran )
PORTD=DATA; // On ecrit la bonne sequence ds le portD
Delay();
PORTB=0x90; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 0 et E2 = 1 ( Controle de la partie droite de l'écran )
PORTD=DATA;
Delay();
Delay();
PORTE=0x00; // On reinitialise les ports a la valeur 0
PORTB=0x00;
}
void End()
{
PORTD=0xEE;
PORTB=0x00; // A0 = Bit 0
// R/W = Bit 1
// E2 = Bit 2
// E1 = Bit 3
PORTB=0xA0; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 1 et E2 = 0 ( Controle de la partie gauche de l'écran )
PORTD=0xEE; // On ecrit la bonne sequence ds le portD
PORTB=0x90; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 0 et E2 = 1 ( Controle de la partie droite de l'écran )
PORTD=0xEE;
PORTD=0x00;
PORTB=0x00;
}
void Write_Display(int Line)
{
static int DATA;
DATA=0x00 | Line ; // On effectue un ou avec la variable line permettant dobtenir le mot que l'on voulait ecrire
PORTD=DATA;
PORTB=0x00; // A0 = Bit 0
// R/W = Bit 1
// E2 = Bit 2
// E1 = Bit 3
PORTB=0x90; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 1 et E2 = 0 ( Controle de la partie gauche de l'écran )
PORTD=DATA; // On ecrit la bonne sequence ds le portD
PORTB=0xA0; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 0 et E2 = 1 ( Controle de la partie droite de l'écran )
PORTD=DATA;
PORTD=0x00; // On reinitialise les ports a la valeur 0
PORTB=0x00;
}
void Static_Drive(int Drive)
{
static int DATA;
DATA=0xA4 | Drive;
PORTD=DATA;
PORTB=0x00; // A0 = Bit 0
// R/W = Bit 1
// E2 = Bit 2
// E1 = Bit 3
PORTB=0x90; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 1 et E2 = 0 ( Controle de la partie gauche de l'écran )
PORTD=DATA; // On ecrit la bonne sequence ds le portD
PORTB=0xA0; // On initialise le portB avec A0 = 0, R/W = 1 , E1 = 0 et E2 = 1 ( Controle de la partie droite de l'écran )
PORTD=DATA;
// PORTE=0x00;
// PORTB=0x00;
}
void main (void)
{
TRISD = 0;
TRISB = 0;
PORTB = 0x00;
PORTD = 0x00;
DutyCycle(0x00);
Display(0x00);
Display_Start_Line(0x00);
Static_Drive(0x00);
Column_Address(0x03);
Page(0x03);
ADC_Select(0x00);
Write_Display(0xFF);
}
I take this code on the post : https://www.edaboard.com/threads/97884/
and i made modification because i didnt find the same value for the configuration of the differents ports but with this code all of the line of my LCD are on and i dont understand why :s This is the first time i program a pic and i really want to make the LCD works ! i dont know if i put all the necessary librairies but apparently i did..
Thx for your answers if you have some ideas (and sorry for my bad english )