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
bonjour
pourquoi ces 2 fonctions une sur le positionnement du curseur et une sur le positionnement du pointeur toujours suivant la DS le curseur suit le pointeur apres il est affiché ou pas suivant le jeux set DONC tu ne dois avoir d'une seule routine positionnement DD_RAM
pouquoi faire des routines commande et donnée car dans ton cas il n'y a que la routine d écriture en donnée un simple RS=0 dans les routine commande ou RS=1 dans la routine d’écriture et affaire réglé
Pour la gestion du 4 ou 8bits JE TE LE DIS ET LE RÉPÈTE c'est dans la fonction ENABLE que cela se traite
pouquoi faire des routines commande et donnée car dans ton cas il n'y a que la routine d écriture en donnée un simple RS=0 dans les routine commande ou RS=1 dans la routine d’écriture et affaire réglé
Pour la gestion du 4 ou 8bits JE TE LE DIS ET LE RÉPÈTE c'est dans la fonction ENABLE que cela se traite
Créer sa propre librairie pour LCD
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Yop maï,
Un petit effort sur la ponctuation stp, car je dois déchiffrer tes phrases par moments
Je ne souhaite pas me jeter la dedans car je ne pourrais pas tester le mode 8Bits ma plaque étant déjà câblée. Dès que j'ai finis de peaufiner encore ma mini librairie, je veux bien essayé sur un plan purement théorique, car j'aimerais bien savoir faire.
Sinon pour le reste je suis pas trop sur d'avoir tout compris.
est ce que jai bon en disant :
-Fusionné les deux SUB permettant d’envoyer les données ( data ou cmde)
Je ne vois pas ou je positionne le pointeur ? , je place seulement le curseur avant ecriture pour dire ou je dois commencer à ecrire .
Un petit effort sur la ponctuation stp, car je dois déchiffrer tes phrases par moments
Pour la gestion du 4 ou 8bits JE TE LE DIS ET LE RÉPÈTE c'est dans la fonction ENABLE que cela se traite
Je ne souhaite pas me jeter la dedans car je ne pourrais pas tester le mode 8Bits ma plaque étant déjà câblée. Dès que j'ai finis de peaufiner encore ma mini librairie, je veux bien essayé sur un plan purement théorique, car j'aimerais bien savoir faire.
Sinon pour le reste je suis pas trop sur d'avoir tout compris.
est ce que jai bon en disant :
-Fusionné les deux SUB permettant d’envoyer les données ( data ou cmde)
Je ne vois pas ou je positionne le pointeur ? , je place seulement le curseur avant ecriture pour dire ou je dois commencer à ecrire .
Créer sa propre librairie pour LCD
Bonjour
Pourquoi ces 2 fonctions, une sur le positionnement du curseur, et une sur le positionnement du pointeur. Toujours suivant la DS le curseur suit le pointeur, après il est affiché ou pas suivant le jeux set.
DONC tu dois avoir d'une seule routine positionnement DD_RAM.
Pourquoi faire des routines commande et donnée, car dans ton cas, il n'y a que la routine d écriture en donnée, un simple RS=0 dans les routine commande, ou RS=1 dans la routine d’écriture et affaire réglé.
Pour la gestion du 4 ou 8bits JE TE LE DIS ET LE RÉPÈTE c'est dans la fonction ENABLE que cela se traite
---------------------------------------------------------------------------------------------------------------------------
voila j'ai repris avec mes excuses pour la ponctuation
Pour le routine en voila une:
et voila l'autre
Qui si je ne me trompe pas font du positionnement en DD_RAM, pour la deuxième tu as rajouter la fonction écriture, a la limite a quoi sert la première ?
Donc ok, pas de lib ,juste une adaptation a ta platine ,je ne te tracasse donc plus avec cette lib ni avec tes doublons
A+
DONC tu dois avoir d'une seule routine positionnement DD_RAM.
Pourquoi faire des routines commande et donnée, car dans ton cas, il n'y a que la routine d écriture en donnée, un simple RS=0 dans les routine commande, ou RS=1 dans la routine d’écriture et affaire réglé.
Pour la gestion du 4 ou 8bits JE TE LE DIS ET LE RÉPÈTE c'est dans la fonction ENABLE que cela se traite
---------------------------------------------------------------------------------------------------------------------------
voila j'ai repris avec mes excuses pour la ponctuation
Pour le routine en voila une:
Code : Tout sélectionner
void LCD_pos (int ligne, int colonne)et voila l'autre
Code : Tout sélectionner
void LCD_txt (int ligne, int colonne, char txt[])Qui si je ne me trompe pas font du positionnement en DD_RAM, pour la deuxième tu as rajouter la fonction écriture, a la limite a quoi sert la première ?
Donc ok, pas de lib ,juste une adaptation a ta platine ,je ne te tracasse donc plus avec cette lib ni avec tes doublons
A+
Créer sa propre librairie pour LCD
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
En suivant tes conseils, si je les ai compris voila ce que ca donne qu'en pensez-vous?
Ça fonctionne parfaitement. Effectivement ça devait faire doublon.... bien vu . T'inquiéte pas, t une me tracasse pas , c'est jsute que j'ai fais ceci pour m'entrainer et comprendre un peu mieux. Ainsi que le bon déroulé d'un programme, et grâce à vos interventions j'avance bien. Il faudrait aussi que je le retienne
.
SI tu ne vois pas d'autre ameliorations possibles, je pense ouvrir un post pour ce fameux conditions à la compilation en mode 4 bit ou 8 bit .
Code : Tout sélectionner
/*##################################################################################
Programme de test pour librairie ecran LCD en mode 4 bit
Fait par Jérémy pour www.FantasPic.fr
- Version du "08-04-2016"
- MikroC version 6.6.2
- PIC 18F46K22 FOSC a 8MHZ ,Quartz 8Mhz, PLL DISable
- Data-Shit du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
#################################################################################*/
// Connexions du module LCD
// La broche Read/Write est reliée à la masse pour ecriture permanente
#define LCD_RS LATB.B4 // 1:Data, 0:Cmde
#define LCD_EN LATB.B5 // Impulsion d'envoie
#define DATA4 LATB.B0 // les 4 bits de données
#define DATA5 LATB.B1
#define DATA6 LATB.B2
#define DATA7 LATB.B3
// Fin de connexion
//-------------------- Variables --------------------------------
unsigned int j=0,temp;
unsigned char compteur[7];
//------------------- FIN variables --------------------------------
//############################################################################################################
//------------------ Valide un Envoi de donnée ---------------------------------------
void Pulse(){
LCD_EN = 1;
delay_us(1);
LCD_EN = 0;
delay_us(45);
}
//------------------ Fonction qui envoi une commande ---------------------------------
//--- Parametre d'entree : la commande à envoyer
void Envoi (int donnee) {
LATB = (LATB & 0xF0) + (donnee >> 4 ) ; // On sort les 4 MSB de la donnée recue et on les affecte au LSB du PORTB sans toucher au MSB du PORTB
Pulse(); // On envoi la commande
if ( ((donnee==0x01) || (donnee==0x02) || (donnee==0x03 ))&&(LCD_RS==0) ) delay_us(1600); //Si la commande est un "clear display" ou un "Return Home" alors grosse pause
LATB = (LATB & 0xF0) + (donnee & 0x0F) ; // On sort les 4 LSB et on les affecte au LSB du PORTB sans toucher au MSB du PORTB
Pulse(); // On envoi la commande
if ( ((donnee==0x01) || (donnee==0x02) || (donnee==0x03 ))&&(LCD_RS==0) ) delay_us(1600); //Si la commande est un "clear display" ou un "Return Home" alors grosse pause
}
//---------------------------- Fonction qui configure le LCD ----------------------------
void LCD_conf(){
unsigned char i;
LCD_RS = 0 ; // Registre Commande
LATB = (LATB & 0xF0) + 3 ; // On place le portB à 0b:xxxx0011 pour passer en mode 4bits
for (i=0;i<=2;i++) Pulse(); // on l'envoie trois fois pour etre certains de passer en mode 4 bits
Envoi (0x02); // Je pense qu'on envoi 2 car on ne sait pas quand le LCD est passé en mode 4 bit au premier deuxieme ou troisieme coup
Envoi (0x28); // On envoi le mode 4 bit, sur 2 lignes et avec Dot5x8
Envoi (0x0C); // Envoi de 0b:0000 puis de 0b:1100 display:On curseur:Off et clignotement:Off
Envoi (0x01); // Envoi de 0b:0000 puis de 0b:0001 pour effacer l'ecran
Envoi (0x06); // Envoi de 0b:0000 puis de 0b:0110 pour direction du curseur et shift auto
}
//---------------------- Fonction qui affiche du texte à la position voulue --------------------
//--- Parametre d'entree : (n° de la ligne 1 ou 2 , n° de la colonne 0 à 15 , texte à afficher entre guillemets ou une variable)
void LCD_txt (int ligne, int colonne, char txt[]){
char i=0, position ;
LCD_RS = 0 ; // Registre commande
if (ligne == 2)
position = 0b11000000 + colonne; // Si ligne=2 on rajoute 0x40 pour passer sur la deuxieme ligne
else position = 0b10000000 + colonne; // Sinon on met seulement 128 pour indiquer que l'on positionne le curseur
Envoi (position); // on positionne le curseur en DDRAM
LCD_RS = 1 ; // Registre commande
while (txt[i]!= 0) // On reboucle tant que l'on a pas recu de terminateur de string
{
Envoi(txt[i]); // On affcihe notre caractere
i++; // On incremente le pointeur du tableau de caracteres
}
}
//#############################################################################################################
//------------------------------ Programme principal --------------------------------------------------
void main() {
ANSELA = 1; // Broche RA0 en analogique pour lecture ADC
ANSELB = 0; // PORTB en digital
ANSELD = 0; // PORTD en digital
TRISA = 1; // Brcohe RA0 en entrée pour lecture de la tension
TRISB = 0; // PORTB en sortie
TRISD = 255; // Le PORTD en Entrée pour les BP
LATB = 0; // RAZ du PORTB
delay_ms(10);
ADC_init(); // Initialisation du registre ADC
LCD_conf(); // Initialisation de l'ecran LCD
Sound_Init(&PORTE, 1);
delay_ms(10);
LCD_txt(1,0,"ceci est un test"); // ligne, colonne, texte
//#############################################################################################################
while(1)
{
temp = ADC_Read(0); // lecture analogique et stockage dans la variable "temp"
IntToStr(temp, compteur); // Conversion de la variable en chaine de caractere
LCD_txt(2,0,compteur); // On affiche la chaine de caractere
if ((PORTD.B0==1) && (j<65535)) // Si le BP(RB0) est appuyé
{
j++; // On incrémente le compteur
Sound_Play(1000, 50); // On fait un BIP à une fréquence de 1000Hz pendant 50ms
while (PORTD.B0==1); // Boucle anti-rebond
}
if ((PORTD.B1==1) && (j>0)) // Si le BP(RB1) est appuyé
{
j--; // On décrémente le compteur
Sound_Play(3000, 50); // On fait un BIP à une fréquence de 3000Hz pendant 50ms
while (PORTD.B1==1); // Boucle anti-rebond
}
IntToStr(j, compteur); // Conversion de la variable en chaine de caractere
LCD_txt(2,10,compteur); // On affiche la chaine de caractere
}
} Ça fonctionne parfaitement. Effectivement ça devait faire doublon.... bien vu . T'inquiéte pas, t une me tracasse pas , c'est jsute que j'ai fais ceci pour m'entrainer et comprendre un peu mieux. Ainsi que le bon déroulé d'un programme, et grâce à vos interventions j'avance bien. Il faudrait aussi que je le retienne
SI tu ne vois pas d'autre ameliorations possibles, je pense ouvrir un post pour ce fameux conditions à la compilation en mode 4 bit ou 8 bit .
Créer sa propre librairie pour LCD
pour te repondre sur ENABLE j'aime pas, pourquoi 2 routines c'est tres compliqué voila comment je fait en 4 bits
je charge une variable (Tempo) de la donnée 8 bits a envoyer regarde la routine d'ecriture
explication:
Donnée est le port
E est la broche enable
j'utilise ici le delay_us mais pas dans la lib
on efface le poids fort du port (and 0xf0)
on récupéré et envoi le poids fort de la variable Tempo et on la charge dans donnée donc dans le port avec un OU, je pense que c'est pas la peine,de le préciser quoi que
E=1
tempo 1µs
E=0
tempo 1µs
POIDS FORT REGLE
on efface le poids fort du port (and 0xf0)
on récupéré et envoi le poids faible de la variable Tempo et on la charge dans donnée donc le port
E=1
tempo 1µs
E=0
tempo 1µs
POIDS FAIBLE REGLE
apres dans la fonction je fais une tempo suivant le type d'instruction a vrai dire il y a en deux une 50µS et une de 2ms
voila pas plus simple que ca CA C'EST MA FONCTION void Pulse_XC8_LCD () avec la partie 8bits
si tu voyais ma lib ,pas tres complique, tout simple comme j'aime mais je te laisse chercher
A+
je charge une variable (Tempo) de la donnée 8 bits a envoyer regarde la routine d'ecriture
Code : Tout sélectionner
Donnee & = 0XF0;
Donnee | = ((Tempo>>4)&0x0f); //*poids fort
E=1;
__delay_us(1);
E=0;
__delay_us(1);
Donnee & = 0xF0;
Donnee | = (0X0F & Tempo); // poids faible
E=1;
__delay_us(1);
E=0;
__delay_us(1);
explication:
Donnée est le port
E est la broche enable
j'utilise ici le delay_us mais pas dans la lib
on efface le poids fort du port (and 0xf0)
on récupéré et envoi le poids fort de la variable Tempo et on la charge dans donnée donc dans le port avec un OU, je pense que c'est pas la peine,de le préciser quoi que
E=1
tempo 1µs
E=0
tempo 1µs
POIDS FORT REGLE
on efface le poids fort du port (and 0xf0)
on récupéré et envoi le poids faible de la variable Tempo et on la charge dans donnée donc le port
E=1
tempo 1µs
E=0
tempo 1µs
POIDS FAIBLE REGLE
apres dans la fonction je fais une tempo suivant le type d'instruction a vrai dire il y a en deux une 50µS et une de 2ms
voila pas plus simple que ca CA C'EST MA FONCTION void Pulse_XC8_LCD () avec la partie 8bits
si tu voyais ma lib ,pas tres complique, tout simple comme j'aime mais je te laisse chercher
A+
Modifié en dernier par Anonymous le ven. 8 avr. 2016 17:37, modifié 1 fois.
Créer sa propre librairie pour LCD
oups pas vue ton post dessus.
Oui c'est deja mieux,tu as une routine d’écriture avec positionnement de DD_RAM.
Ce qui serait bien, c'est de supprimer la fonction Envoi (position); et de la faire dérouler dans la fonction écriture, tu vas gagner, encore en simplicité et lisibilité et de plus en gain de temps
Oui c'est deja mieux,tu as une routine d’écriture avec positionnement de DD_RAM.
Ce qui serait bien, c'est de supprimer la fonction Envoi (position); et de la faire dérouler dans la fonction écriture, tu vas gagner, encore en simplicité et lisibilité et de plus en gain de temps
Créer sa propre librairie pour LCD
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Ce qui serait bien, c'est de supprimer la fonction Envoi (position); et de la faire dérouler dans la fonction écriture, tu vas gagner, encore en simplicité et lisibilité et de plus en gain de temps
J'ai beau chercher, je ne vois pas comment supprimer ceci !.
Pour moi , dans tous les cas il faudra bien que j'envoie les "coordonnes" du texte à afficher, avant de l’afficher, je suis donc obligé de le faire non ?
la donnée position est juste déterminée par la valeur de ligne et de colonne que l'on envoi comme n'importe qu'elle autre donnée
Créer sa propre librairie pour LCD
voila avec ma lib comment je fais pour regrouper position et ecriture
tu es un peu coince avec ta procédure, je le conçoit . Tu peux améliore la position avec le switch c'est déjà cela
c'est juste un principe manque la variable NB il doit y avoir aussi incompatibilité char int 
Code : Tout sélectionner
void LCD_txt (int ligne, int colonne, char txt[]){
RS=0; /*mode commande*/
NOP();
switch (ligne)
{
case 0:
Tempo=128+colonne ; /*ligne 0*/
Pulse_XC8_LCD();
__delay_us (50);
break;
default:
Tempo= 192+colonne; /*ligne 1*/
Pulse_XC8_LCD();
__delay_us (50);
break;
}
RS=1; /*mode donn?e*/
NOP();
for (i=0;i<NB;i++)
{
Tempo=TXT[i]; /*donn?e sur port du LCD*/
Pulse_XC8_LCD();
__delay_us (50);
}
}
tu es un peu coince avec ta procédure, je le conçoit . Tu peux améliore la position avec le switch c'est déjà cela
Créer sa propre librairie pour LCD
Créer sa propre librairie pour LCD
-
Jérémy

Administrateur du site- Messages : 2750
- Âge : 46
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
il faudrait mettre un smilles ou l'on pleure
il y a celui-ci mais ce n'est pas flagrant :
Je vais en cherche r un autre c'est une bonne idée.
jeremy pourquoi n'as tu point fait de ASM
Pour moultes raisons, mais la principal c'est le temps d'apprentissage et de réalisation, qui est beaucoup trop long . Je ne suis qu'un hobbyistes.... . Même si je ne le cautionne pas, je comprends tout à fait ceux qui font de l'arduino. En quelques jours ont a des résultats sans se prendre la tête et ca , ca suffit a beaucoup de monde.
L'ASM c'est la crême, cherche la petite bête, la perfection .... mais sa demande du temps. De plus je connaissais déjà le BASIC avec les picaxes, et le C est nettement plus proches.
Le probléme avec l'ASM, c'est programme doit être trés dur à reprendre et à comprendre quand on ne l'a pas fait soit même.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités


