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 ---
Forum général sur le langage C !

Modérateur : Jérémy

Créer sa propre librairie pour LCD
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#31 Message par Guest » ven. 8 avr. 2016 14:41

bonjour
:mrgreen: 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

Créer sa propre librairie pour LCD
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#32 Message par Jérémy » ven. 8 avr. 2016 15:29

Yop maï,

Un petit effort sur la ponctuation stp, car je dois déchiffrer tes phrases par moments :oops:

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 .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Créer sa propre librairie pour LCD
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#33 Message par Guest » ven. 8 avr. 2016 16:50

Bonjour
:mrgreen: 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:

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
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#34 Message par Jérémy » ven. 8 avr. 2016 17:05

En suivant tes conseils, si je les ai compris voila ce que ca donne qu'en pensez-vous?

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 >> ) ;                                  // 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 ;                     // Registre Commande
  
LATB = (LATB 0xF0) + ;       // 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 ligneint colonnechar txt[]){
    
char i=0position ;
    
LCD_RS ;                            // 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 ;                            // 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(&PORTE1);
  
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(tempcompteur);         // 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(100050);      // 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(300050);      // On fait un BIP à une fréquence de 3000Hz pendant 50ms
            
while (PORTD.B1==1);       // Boucle anti-rebond
           
}
  
IntToStr(jcompteur);            // 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 :D .

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 .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Créer sa propre librairie pour LCD
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#35 Message par Guest » ven. 8 avr. 2016 17:17

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

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 :lol:
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
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#36 Message par Guest » ven. 8 avr. 2016 17:34

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

Créer sa propre librairie pour LCD
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#37 Message par Jérémy » ven. 8 avr. 2016 18:43

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
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Créer sa propre librairie pour LCD
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#38 Message par Guest » ven. 8 avr. 2016 19:13

voila avec ma lib comment je fais pour regrouper position et ecriture

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

:!: c'est juste un principe manque la variable NB il doit y avoir aussi incompatibilité char int ;)

Créer sa propre librairie pour LCD
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#39 Message par Guest » ven. 8 avr. 2016 19:31

AAAAAA;..... jeremy pourquoi n'as tu point fait de ASM, que de messages aurions nous pu échangé et faire monter ce sacré compteur ASM.
80% de mes messages sont sur le C et de plus est ce n'est pas ma tasse de thé :lol: allez encore un :lol: tient il faudrait mettre un smilles ou l'on pleure

bon exit

Créer sa propre librairie pour LCD
Jérémy
Administrateur du site
Administrateur du site
Messages : 2750
Âge : 46
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#40 Message par Jérémy » ven. 8 avr. 2016 19:41

il faudrait mettre un smilles ou l'on pleure

il y a celui-ci mais ce n'est pas flagrant : :cry:
Je vais en cherche r un autre c'est une bonne idée.

jeremy pourquoi n'as tu point fait de ASM

:mrgreen:
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.
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités