Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
Créer sa propre librairie pour LCD
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour ,
Voila je me suis mis en tête d'apprendre à créer ma propre librairie pour afficher du texte sur un LCD tout ce qu'il y a de plus classique .
Je possède MikroC pro avec cette librairie déjà implanté ; Il me suffirais donc d'ecrire Lcd_init() et LCD_out pour ecrire du texte tout seul .
Oui mais ce n'ai pas très instructif !.
Je dis pas que je veux ré-inventer la roue, mais inventer ma propre roue ( avec ces défauts certes mais la mienne). Je pense pouvoir apprendre beaucoup en faisant cela. ensuite je pourrais utiliser sans vergogne la librairie toute faites de mikroC.
Je travaille avec un PIC 18F46K22
ma plaque easy PIC 7 tant qu'a faire . Et voici l'écran que j'ai dessus : Lien vers DS
Je bloque d'entrée de jeu sur la facon de faire l'initialisation.
Je dois créer une fonction pour envoyer des commandes . avec le registre-select (RS) à 0 mettre la données sur le PORTB . Oui mais comment l'envoyer ensuite ? qu'est ce qui fait que ca l'envoie la donnée ? comme il n'y a pas d'horloge !
Voici le schéma de cablage :
Je pense déjà qu'il faut que j'arrive à affiche les valeurs sur le PORTB correctement en fonction de la donnée que je veux envoyer !. Pour avoir une fonction généraliste .
Ensuite je confusionne un peu tout !
Page 15 de la DS de l''écran , pour envoyer un clear display : il faut mettre DB0 à 1 . donc le PORTB donc être = 0b00000001.
mais le PORTB n'a que 4 sorties de branchées(mode 4 bits), il faut donc envoyer en deux fois . d'abord 4 bit puis les 4 bit suivantes ? mais dans quel ordre ? les LSB, ou MSB en premier ?
Voila je me suis mis en tête d'apprendre à créer ma propre librairie pour afficher du texte sur un LCD tout ce qu'il y a de plus classique .
Je possède MikroC pro avec cette librairie déjà implanté ; Il me suffirais donc d'ecrire Lcd_init() et LCD_out pour ecrire du texte tout seul .
Oui mais ce n'ai pas très instructif !.
Je dis pas que je veux ré-inventer la roue, mais inventer ma propre roue ( avec ces défauts certes mais la mienne). Je pense pouvoir apprendre beaucoup en faisant cela. ensuite je pourrais utiliser sans vergogne la librairie toute faites de mikroC.
Je travaille avec un PIC 18F46K22
ma plaque easy PIC 7 tant qu'a faire . Et voici l'écran que j'ai dessus : Lien vers DS
Je bloque d'entrée de jeu sur la facon de faire l'initialisation.
Je dois créer une fonction pour envoyer des commandes . avec le registre-select (RS) à 0 mettre la données sur le PORTB . Oui mais comment l'envoyer ensuite ? qu'est ce qui fait que ca l'envoie la donnée ? comme il n'y a pas d'horloge !
Voici le schéma de cablage :
Je pense déjà qu'il faut que j'arrive à affiche les valeurs sur le PORTB correctement en fonction de la donnée que je veux envoyer !. Pour avoir une fonction généraliste .
Ensuite je confusionne un peu tout !
Page 15 de la DS de l''écran , pour envoyer un clear display : il faut mettre DB0 à 1 . donc le PORTB donc être = 0b00000001.
mais le PORTB n'a que 4 sorties de branchées(mode 4 bits), il faut donc envoyer en deux fois . d'abord 4 bit puis les 4 bit suivantes ? mais dans quel ordre ? les LSB, ou MSB en premier ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Créer sa propre librairie pour LCD
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Oui mais comment l'envoyer ensuite ? qu'est ce qui fait que ca l'envoie la donnée ? comme il n'y a pas d'horloge !
Un problème de moins, c'est la broche ENABLE qui va faire office d'horloge . Il faudra bien pensé a la remettre à 0 a chaque fois.
Créer sa propre librairie pour LCD
Créer sa propre librairie pour LCD
Créer sa propre librairie pour LCD
Salut
Oui, c'est la broche Enable qui déclenche la lecture du port data par l'afficheur. D'après les timings dans ta doc, il faut lever Enable, positionner les datas, et ensuite baisser Enable. De mon côté, j'ai toujours d'abord positionné les datas, ensuite une impulsion high/low sur Enable
Pour le mode 4 bit, on utilise les broches db7 à db3, et on envoie d'abord le quartet haut MSB, puis le quartet bas LSB. Le problème est qu'il démarre en mode 8 bits, donc il faudrait commencer par lui envoyer la commande 8 bits 0x28 (set mode 4 bits, 2 ligne 5x8)
Mais on a que 4 bits de données, dont on envoie le quartet 0x02 (set mode 4 bits) sur les 4 broches hautes. Mais c'est pas encore suffisant car le démarrage en 4 bits est un peu poussif, voila ce que fait Arduino dans sa librairie :
// we start in 8bit mode, try to set 4 bit mode
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms
// second try
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms
// third go!
write4bits(0x03);
delayMicroseconds(150);
// finally, set to 4-bit interface
write4bits(0x02);
Oui, c'est la broche Enable qui déclenche la lecture du port data par l'afficheur. D'après les timings dans ta doc, il faut lever Enable, positionner les datas, et ensuite baisser Enable. De mon côté, j'ai toujours d'abord positionné les datas, ensuite une impulsion high/low sur Enable
Pour le mode 4 bit, on utilise les broches db7 à db3, et on envoie d'abord le quartet haut MSB, puis le quartet bas LSB. Le problème est qu'il démarre en mode 8 bits, donc il faudrait commencer par lui envoyer la commande 8 bits 0x28 (set mode 4 bits, 2 ligne 5x8)
Mais on a que 4 bits de données, dont on envoie le quartet 0x02 (set mode 4 bits) sur les 4 broches hautes. Mais c'est pas encore suffisant car le démarrage en 4 bits est un peu poussif, voila ce que fait Arduino dans sa librairie :
// we start in 8bit mode, try to set 4 bit mode
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms
// second try
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms
// third go!
write4bits(0x03);
delayMicroseconds(150);
// finally, set to 4-bit interface
write4bits(0x02);
Modifié en dernier par satinas le dim. 20 mars 2016 18:00, modifié 2 fois.
Créer sa propre librairie pour LCD
Créer sa propre librairie pour LCD
Créer sa propre librairie pour LCD
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
La nuit porte conseil ....
J'ai pensé à ceci , pour extraire les MSB et LSB de la donnée à traiter . Pour ensuite pouvoir affecter ces MSB et LSB de la donnée au LSB du PORTB, car ce sont RB0 à RB3 qui sont connectées.
Qu'en pensez vous dans les grandes lignes?
Ma réflexion fut :
je doit envoyer une donnée de 8bits, en mode 4 bit. Donc je dois la divisée en deux pour récupérer chaque moitiés.
Une fois les moitiés enregistrer je dois les mettre sur le PORTB mais que sur les 4 premiers bits car les autres sont occupés. donc je fais un masque.
PAr contre j'ai un mauvais pressentiment sur le brochage. RB0 est mon LSB du PORTB . il est relié à D4 d'aprés le schéma? J'ai l'impression que D4 est le MSB de l'ecran ( 4bit) ? Il faudrait donc que j'inverse mes sorties ?
J'ai pensé à ceci , pour extraire les MSB et LSB de la donnée à traiter . Pour ensuite pouvoir affecter ces MSB et LSB de la donnée au LSB du PORTB, car ce sont RB0 à RB3 qui sont connectées.
Qu'en pensez vous dans les grandes lignes?
Code : Tout sélectionner
void LCD_cmde (int donnee)
{
LCD_RS = 0 ;
MSB = donnee >> 4 ; // on sort les 4 MSB de la donnée envoyé
LSB = donnee & 0x0F; // On sort les 4 LSB
PORTB = (PORTB & 0xF0) + MSB ; // On affecte le MSB de la donnée au LSB du PORTB sans toucher au MSB du PORTB
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
PORTB = (PORTB & 0xF0) + LSB ; // On affecte le MSB de la donnée au LSB du PORTB sans toucher au MSB du PORTB
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
}
Ma réflexion fut :
je doit envoyer une donnée de 8bits, en mode 4 bit. Donc je dois la divisée en deux pour récupérer chaque moitiés.
Une fois les moitiés enregistrer je dois les mettre sur le PORTB mais que sur les 4 premiers bits car les autres sont occupés. donc je fais un masque.
PAr contre j'ai un mauvais pressentiment sur le brochage. RB0 est mon LSB du PORTB . il est relié à D4 d'aprés le schéma? J'ai l'impression que D4 est le MSB de l'ecran ( 4bit) ? Il faudrait donc que j'inverse mes sorties ?
Créer sa propre librairie pour LCD
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Ehehe j'ai avancé un peu, mais je me suis fais des idées .
En fait après programmation du PIC, sa fonctionne bien( j'affiche un le caractère 'A').
Mais si j’éteins tout après avoir programmé, et que je rallume cela ne fonctionne plus .
Certainement une erreur dans la configuration. J'a iessayé de respecter à la lettre la DS de l'écran . On voit au départ de la configuration que je fais un seul envoie comme sur la DS . Puis après je passe avec ma fonction "normale".
Voici mon code :
En fait après programmation du PIC, sa fonctionne bien( j'affiche un le caractère 'A').
Mais si j’éteins tout après avoir programmé, et que je rallume cela ne fonctionne plus .
Certainement une erreur dans la configuration. J'a iessayé de respecter à la lettre la DS de l'écran . On voit au départ de la configuration que je fais un seul envoie comme sur la DS . Puis après je passe avec ma fonction "normale".
Voici mon code :
Code : Tout sélectionner
// Connexions du module LCD
// Broche Read/Write est reliée à la masse
#define LCD_RS PORTB.B4 // H:DATA, L:INST
#define LCD_EN PORTB.B5
#define DATA4 PORTB.B0
#define DATA5 PORTB.B1
#define DATA6 PORTB.B2
#define DATA7 PORTB.B3
// Fin de connexion
unsigned int MSB,LSB, donnee ;
void LCD_cmde (int donnee)
{
LCD_RS = 0 ;
MSB = donnee >> 4 ; // on sort les 4 MSB de la donnée envoyé
LSB = donnee & 0x0F; // On sort les 4 LSB
PORTB = (PORTB & 0xF0) + MSB ; // On affecte le MSB de la donnée au LSB du PORTB sans toucher au MSB du PORTB
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
PORTB = (PORTB & 0xF0) + LSB ; // On affecte le MSB de la donnée au LSB du PORTB sans toucher au MSB du PORTB
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
}
void LCD_data (int donnee)
{
LCD_RS = 1 ;
MSB = donnee >> 4 ; // on sort les 4 MSB de la donnée envoyé
LSB = donnee & 0x0F; // On sort les 4 LSB
PORTB = (PORTB & 0xF0) + MSB ; // On affecte le MSB au PORTB
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
PORTB = (PORTB & 0xF0) + LSB ; // On affecte le LSB au PORTB
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
}
void LCD_conf(){
DATA4 = 1;
DATA5 = 1;
DATA6 = 0;
DATA7 = 0;
delay_ms(10);
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
delay_ms(1);
LCD_cmde (0x28);
delay_ms(1);
LCD_cmde (0x28);
delay_ms(1);
LCD_cmde (0x0F);
delay_ms(1);
LCD_cmde (0x01);
delay_ms(1);
LCD_cmde (0x06);
delay_ms(1);
}
void main() {
ANSELB = 0; // PORTB en digital
TRISB = 0; // PORTB en sortie
LCD_EN = 0; // LCD désactivé
delay_ms(10);
LCD_conf();
delay_ms(10);
while(1)
{
LCD_data(66);
delay_ms(100);
}
}
Créer sa propre librairie pour LCD
Qui est en ligne
Utilisateurs parcourant ce forum : Google [Bot] et 44 invités