Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Probleme avec Clavier et LCD sur meme PORT



  1. #1
    c_po_simple

    Probleme avec Clavier et LCD sur meme PORT


    ------

    Bonjours a tous
    Voila je me prend la tête avec mon code C (cc5x + MPlab) pour faire fonctionner sur le meme bus , le PORTD d'un PIC 16F877. Lafficheur est un 2X16 car hd44780 et le clavier 4T en matrice ( je sais je ne gagne rien) .Les librairies que j'ai trouvée sur le NET et modifiée pour mes besoin fonctionnent tres bien tant que Aff et Clavier sont sur des BUS separé ( PORTD pour Aff et PORTB pour Clavier) mais si je mets tout en portD , ça ne marche pas. Mon LCD affiche obstinement le car de la 1er touche. C'est certainement un probleme de validation/devalidation du LCD pendant cycle clavier ???mais chais pô . Alors si quelqu'un pouvais me dire ou je m...
    @+
    Ci dessous le code
    JE VOUS PRIE DE M'EXCUSER POUR LA PRESENTATION, MAIS AU COPIER/COLLER
    L'INDENTATION A DISPARUE (depuis corrigé par Hulk)
    fichier main
    Code:
    /***************************************************************/
    // Teste le 25/03/2007 avec bootloader Tinybldwin : test OK
    // Aff 2x16 sur port D et clavier 12 Tches sur port B
    // Compilateur CC5X version 3.1
    //  Programme de definition des fonctions gestion clavier 
    // Modifie le 23/02/06 pour utilisation avec bootloader: soit
    // changé le 16f877.h microchip par 16f877.h JP Mandon
    // puis ajoué #pragma org 4
    
    /***************************************************************/
    #pragma chip PIC16F877
    #pragma config |= 0x3F3A
    #pragma origin 4				// pour ne pas ecraser le bootloader
    
    #include "Delay_2.h"
    #include "Lib_LCD.h"
    #include "Lib_Clavier_4T.h"
    
    #define led1 PORTB.1
    
    char texte[10];
    unsigned char Touche;
    int compt ,i ;
    
    /****************************************************************/
    // test avec clavier 4T + aff sur portd le 10/04/08
    // ce prog fonctionne parfaitement si aff sur portd et clavier sur portb
    
    void main (void)
    {
    TRISB=0b11111101 ;
    bSignal=0;
    bRep=0;
    
    led1 =0 ;
    
    texte[0]='\0';
    
    
    	LCD_Setup();
    
    	Lcd_Print_Ligne1("Prog test Clav",0);
    	Lcd_Print_Ligne2("Touche :",0);
    
    
    
    	while (1)
    	{
    
    	delay_ms(500);		//
    	led1 = 1;			// fait clignoter led1 sur portb1
    	delay_ms(500);		//  pour verifier le passage ds boucle
    	led1 = 0;			//
    
    	Touche=Traitement_Touche_Clavier();
    		
    
    		if (Touche != 0x00)
    		{
    			texte[0]=Touche;
    			texte[1]='\0';
    		}
    
    		Lcd_Print_Ligne2(texte,12);  // affiche la touche appuyer
    	}
    
    }
    librairie LCD
    /***********************************************************************
    *                                                                     
    * FICHIER :  Lib_LCD.h 
    * DATE : 28/10/2005
    * AUTEURS :  Jean-Hugues, Jérémy 
    * BUT : Definir des fonctions qui permettent de piloter le lcd en Mode BITs 
    * 
    * REMARQUES :modifie le 22/09/05 par SP
    *	
    ************************************************************************/
    
    // Déclaration des E/S POUR L'afficheur en PortD
    bit LCD_SEL    @ PORTD.0;   // Port B bit 0 ( Enables LCD )                  
    bit LCD_WR     @ PORTD.2;   // Port B bit 2 ( Logic 0 = Write )              
    bit LCD_RS     @ PORTD.1;  // Port B bit 1 ( Register select )              
    bit LCD_DATA_4 @ PORTD.4;   // LCD BIT 4                                     
    bit LCD_DATA_5 @ PORTD.5;   // LCD BIT 5                                     
    bit LCD_DATA_6 @ PORTD.6;   // LCD BIT 6                                     
    bit LCD_DATA_7 @ PORTD.7;   // LCD BIT 7   
    
    /**********************************************************************/
    void Init_Port_Aff (void)
    {
    
    TRISD=0x00;	// mettre les pin connecteés sur le LCD en port D en Sortie 
    PORTD=0x00;	// Init a 0 les sorties 
    
    } 
    /*********************************************************************** 
     * commandes LCD (à compléter si besoin   )                             *
     ***********************************************************************/ 
    
    #define CLEAR_LCD         0x01 // Clear Display                         
    #define RETURN_HOME       0x02 // Cursor to Home position               
    #define ENTRY_MODE        0x06 // Normal entry mode                     
    #define ENTRY_MODE_SHIFT  0x07 // - with shift                          
    #define SYSTEM_SET_8_BIT  0x38 // 8 bit data mode 2 line ( 5x7 font )   
    #define SYSTEM_SET_4_BIT  0x28 // 4 bit data mode 2 line ( 5x7 font )   
    #define DISPLAY_ON        0x0c // Switch ON Display                     
    #define DISPLAY_OFF       0x08 // Cursor plus blink                     
    #define SET_DD_LINE1      0x80 // Line 1 position 1                     
    #define SET_DD_LINE2      0xC0 // Line 2 position 1
    
    #define SET_DD_LINE3      0x90 // Line 3 position 1    // Pour Aff 4 lignes                
    #define SET_DD_LINE4      0xD0 // Line 4 position 1    // Pour Aff 4 lignes               
                       
    #define SET_DD_RAM        0x80 // Line 1 position 1                     
    #define WRITE_DATA        0x00 // With RS = 1                           
    #define CURSOR_ON         0x0E // Switch Cursor ON                      
    #define CURSOR_OFF        0x0C // Switch Cursor OFF                     
    #define CURSOR_UP		  0x1c                                                                    
    
    /***********************************
     * Délai de réaction du LCD        * 
     * A ajuster en fonction du LCD    * 
     ***********************************/ 
    void LCD_Delay(void) 
    { 
     delay_ms(1); 
    }
    
    /*********************************** 
     * Mets le LCD en mode Function    *
     ***********************************/ 
    void LCD_FunctionMode() 
    { 
       // à changer si on doit ne pas affecter tout le portb
       LCD_RS=0; 
       LCD_Delay(); 
    } 
    /*********************************** 
     * Mets le LCD en mode Data        *
     ***********************************/ 
    void LCD_DataMode() 
    { 
       LCD_RS=1; 
       LCD_Delay(); 
    } 
    /************************************** 
     * Ecrit un seul octet du LCD         * 
     * en mode 8 bits                     * 
     **************************************/ 
    void LCD_Write_8_Bit( char d) 
    { 
       LCD_WR=0;  // Write Mode
       LCD_Delay(); 
      
       // sortie sur DATA4 à DATA7 en fonction de d
       if (d & 0x80) LCD_DATA_7=1; 
       else LCD_DATA_7=0; 
      
       if (d & 0x40) LCD_DATA_6=1; 
       else LCD_DATA_6=0; 
      
       if (d & 0x20) LCD_DATA_5=1; 
       else LCD_DATA_5=0; 
      
       if (d & 0x10) LCD_DATA_4=1; 
       else LCD_DATA_4=0; 
      
       LCD_Delay(); 
       LCD_SEL=1; // Select LCD 
       LCD_Delay(); 
       LCD_SEL=0;  // De-select LCD
    } 
    /************************************** 
     * Ecrit un seul octet du LCD         * 
     * en mode 4 bits                     * 
     **************************************/
    void LCD_Write_4_Bit(char d ) 
    { 
       LCD_WR=0;    // Write Mode
       LCD_Delay(); 
     
       // on écrit les 4 bits de poids fort                                   
       if (d & 0x80) LCD_DATA_7=1; 
       else LCD_DATA_7=0; 
      
       if (d & 0x40) LCD_DATA_6=1;
       else LCD_DATA_6=0; 
      
       if (d & 0x20) LCD_DATA_5=1; 
       else LCD_DATA_5=0; 
      
       if ( d & 0x10 ) LCD_DATA_4=1; 
       else LCD_DATA_4=0; 
     
       LCD_Delay(); 
       LCD_SEL=1; // Select LCD 
       LCD_Delay(); 
       LCD_SEL=0;  // De-select LCD
       LCD_Delay();
    
       // on écrit les 4 bits de poids faibles
       d <<= 4; 
      
       if (d & 0x80) LCD_DATA_7=1; 
       else LCD_DATA_7=0; 
      
       if (d & 0x40) LCD_DATA_6=1; 
       else LCD_DATA_6=0; 
      
       if (d & 0x20) LCD_DATA_5=1; 
       else LCD_DATA_5=0; 
      
       if (d & 0x10) LCD_DATA_4=1; 
       else LCD_DATA_4=0; 
      
       LCD_Delay(); 
       LCD_SEL=1; // Select LCD 
       LCD_Delay(); 
       LCD_SEL=0;  // De-select LCD
      } 
    
    /*********************************** 
     * Initialisation du curseur_on           * 
     ***********************************/ 
    void curseur_on(int eff_lcd ,int pos) 
    { 
       delay_ms(30);                        // Délai de mise en route 
       
       LCD_FunctionMode();  
    
    	if (eff_lcd == 1)
    	{
       	LCD_Write_4_Bit(CLEAR_LCD);			//0x01
    	delay_ms(2);
    	LCD_Write_4_Bit(CLEAR_LCD);			//0x01
    	delay_ms(2);
    	}
    
       LCD_Write_4_Bit(SET_DD_LINE1+pos);	//0x01
       delay_ms(2);
     
       LCD_Write_4_Bit(CURSOR_ON);			//0x01
                      
    } 
    
    /*********************************** 
     * Initialisation du LCD           * 
     ***********************************/ 
    void LCD_Setup() 
    { 
    	Init_Port_Aff();
       delay_ms(30);                        // Délai de mise en route 
       
       LCD_FunctionMode();  
                    // mode fonction
     
       // cette séquence initialise le LCD en mode 4 bits, 2 ligne 
       LCD_Write_8_Bit( SYSTEM_SET_4_BIT ); 
       delay_ms(5); 
       LCD_Write_8_Bit( SYSTEM_SET_4_BIT ); 
       delay_ms(5); 
       LCD_Write_8_Bit( SYSTEM_SET_4_BIT ); 
       delay_ms(5);
    
       LCD_Write_4_Bit( SYSTEM_SET_4_BIT ); //0x28
       delay_ms(2);
    	LCD_Write_4_Bit( SYSTEM_SET_4_BIT ); //0x28
       delay_ms(2);
    	LCD_Write_4_Bit( SYSTEM_SET_4_BIT ); //0x28
       delay_ms(2);
    
       LCD_Write_4_Bit( DISPLAY_OFF ); 		//0x08
       delay_ms(2); 
    
       LCD_Write_4_Bit( ENTRY_MODE ); 		//0x06
       delay_ms(2); 
    
       LCD_Write_4_Bit( DISPLAY_ON ); 		//0x0c
       delay_ms(2); 
    
       LCD_Write_4_Bit( SET_DD_RAM ); 		//0x0c
       delay_ms(2); 
    
       LCD_Write_4_Bit(CLEAR_LCD);			//0x01
       delay_ms(2); 
    
                      
    } 
    /*********************************************/
    void Lcd_Print_Ligne2(const char *texte,int Pos)
    {
    	Init_Port_Aff();
    
    	LCD_FunctionMode();
    
    	LCD_Write_4_Bit(SET_DD_LINE2+Pos);
    
    
    	delay_ms(2);
    	
    	LCD_DataMode();// mode données 
    
    	// affichage d une chaine à l ecran du LCD.
    	while(*texte != '\0')		// Affichage tant qu on est pas à la fin de la chaine
    		{ 
    		LCD_Write_4_Bit(*texte++);
    		}
    }
    /*********************************************/
    void Lcd_Print_Ligne1(const char *texte,int Pos)
    {
    	Init_Port_Aff();
    
    	LCD_FunctionMode();
    
    	LCD_Write_4_Bit(SET_DD_LINE1+Pos);
    
    	delay_ms(2);
    	
    	LCD_DataMode();// mode données 
    
    	// affichage d une chaine à l ecran du LCD.
    	while(*texte != '\0')		// Affichage tant qu on est pas à la fin de la chaine
    		{ 
    		LCD_Write_4_Bit(*texte++);
    		}
    }
    /*********************************************/
    void choix_ligne(int ligne)
    {
    	LCD_FunctionMode();
    	switch(ligne)
    	{
    	case 1 :LCD_Write_4_Bit(SET_DD_LINE1);
    			delay_ms(2);
    			break;   
    	case 2 :LCD_Write_4_Bit(SET_DD_LINE2);
    			delay_ms(2);
    			break;
    	case 0 :break;
    	}
       LCD_DataMode();// mode données 
    }
    
    librairie Clavier
    /****************************************************************/
    /*                         										*/                                            
    /* FICHIER : Lib_Clavier_4T.h 									*/
    /* DATE : 04/09/2003											*/
    /* AUTEURS :													*/
    /* BUT : Gestion d'un clavier 4 Touches							*/
    /*																*/
    /* REMARQUES :	modifie /adapte le 08/04/08 par SP				*/
    /*																*/
    /*******************************************************/
    
    
    //bit L1 @ PORTB.5;	// Definir ici les Lignes et 
    //bit L2 @ PORTB.4;	// les Colonnes du Clavier
    //bit C1 @ PORTB.2;	// sur PORTB
    //bit C2 @ PORTB.3;	//
    
    bit L1 @ PORTD.7;	// Definir ici les Lignes et 
    bit L2 @ PORTD.6;	// les Colonnes du Clavier
    bit C1 @ PORTD.5;	// sur PORTD
    bit C2 @ PORTD.4;	//
    
    
    bit bSignal,bRep;
    unsigned char cCompter,cT,a,Touche, Car,Car1;
    
    /****************************************************************/
    void Init_Port_Clavier(void)
    {
    // Init du PortB pour Clavier
    //TRISB=0b00001100;	// TRISB configure soit en entrée par 1, soit en sortie par 0
    //PORTB=0b00110000;	// PORTB initialise le port A, soit état haut 1, soit état bas 0 
    
    TRISD=0b00110000;	// TRISD configure soit en entrée par 1, soit en sortie par 0
    PORTD=0b11000000;	// PORTD initialise le port A, soit état haut 1, soit état bas 0
    }
    /****************************************************************/
    
    char  Touche_Clavier(void)
    {
    	a=1;
    	for(cT=1;cT<=2;cT++)
    	{
    	if(cT==1){L1=0;delay_ms(1);}
    	if(cT==2){L2=0;delay_ms(1);}
    
    	if(!C1)return(a);
    	if(!C2)return(a+1);
    
    	Init_Port_Clavier();
    
    	a+=2;
    	}
    bRep=0;
    return(0);
    }
    
    /****************************************************************/
    char Traitement_Touche_Clavier(void)
    {
    	Init_Port_Clavier();
    
    	Car=Touche_Clavier();
    	// si bRep=1 (répétition touche) ou si cTouche=0 (pas d'action clavier) 
    	// on sort de la routine sans traitement avec return
    
    	if((bRep) || (!Car))return(0);
    
    	//  Placer ici votre code pour traiter les touches
    	if(Car==0x01) Car1=0x37;	//	1
    	if(Car==0x02) Car1=0x32;	//	2	
    	if(Car==0x03) Car1=0x33;	//	3
    	if(Car==0x04) Car1=0x34;	//	4	
    
    	bRep=1;	// place 1 pour indiquer qu'une touche est actionné	
    	bSignal=0;	
    	cCompter=0;
    
    
    	return (Car1); 
    	
    }
    
    /***************************************************/

    -----
    Dernière modification par HULK28 ; 11/04/2008 à 07h46.

  2. Publicité
  3. #2
    invite03481543

    Re : Probleme avec Clavier et LCD sur meme PORT

    Salut,

    pour conserver l'indentation il faut utiliser les balises [code] ..prog.. [/code*] pour encadrer ton programme(il faut enlever l'astérisque, je l'ai mis pour que tu puisses le voir).
    J'ai modifié ton message en conséquence.
    @+

  4. #3
    invite03481543

    Re : Probleme avec Clavier et LCD sur meme PORT

    Salut,

    pour pouvoir utiliser le clavier et l'afficheur sur les mêmes ports il faut utiliser des interruptions.
    Ton clavier est sur le portB donc utilise la détection de changement d'état en validant à 1 RBIE (bit3) et en surveillant le flag de RBIF (bit0) dans le registre INTCON, INTEDG (bit6) dans le registre OPTION doit être mis à 1 pour autoriser la détection des changements de fronts sur RB4~RB7.

    Le principe est simple, tant que tu n'as pas de détection de changement d'état sur RB4~RB7, le LCD fonctionne en priorité, dès qu'un changement d'état est détecté, le clavier est lu, traité, et ensuite on repasse en traitement affichage.

    @+

  5. #4
    c_po_simple

    Re : Probleme avec Clavier et LCD sur meme PORT

    bonjour Hulk, matinal !!
    merci, pour cette reponse, je vais tester cela . quand j'aurai un moment, et te tiendrai au courant.
    Bonne journée, @+

  6. A voir en vidéo sur Futura
  7. #5
    c_po_simple

    Re : Probleme avec Clavier et LCD sur meme PORT

    Bonsoir a tous.
    Je reactive le post, car je n'ai pas mis en pratique encore la solution Hulk, qui m'interresse mais suis aussi ouvert a tout autres solutions n'utilisant pas les interruptions. 1 pour faire l'économie de cet interruptions et 2 pour ma culture personnel.
    Merci d'avance @+

Discussions similaires

  1. port pcmia sur tv lcd?
    Par yvessavoir dans le forum Électronique
    Réponses: 4
    Dernier message: 31/03/2008, 18h19
  2. afficheur LCD avec clavier
    Par mejdi_electronique dans le forum Électronique
    Réponses: 3
    Dernier message: 19/04/2007, 19h24
  3. Souris/clavier PS2 sur port USB
    Par Papy Octet dans le forum Matériel - Hardware
    Réponses: 4
    Dernier message: 16/06/2006, 11h17
  4. mini clavier sur port //
    Par NYghost dans le forum Électronique
    Réponses: 1
    Dernier message: 27/06/2003, 10h57
  5. LCD sur port // Xiamen Ocular
    Par lio123456 dans le forum Électronique
    Réponses: 10
    Dernier message: 21/06/2003, 13h50
Découvrez nos comparatifs produits sur l'informatique et les technologies.