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); } /***************************************************/
-----