begin process at 2008 07 05 07:10:25
1 205 054 membres
40 nouveaux aujourd'hui
14 118 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MISE EN OEUVRE DE L'ÉCRAN PICDEM 2 PLUS DEMO BOARD SUR 4 BITS - COMPILATEUR CCS


Information sur la source

Catégorie :Chaîne de caractères Classé sous : microcontrôleur, pic, écran, ccs, 4bits Niveau : Débutant Date de création : 09/03/2007 Date de mise à jour : 09/03/2007 17:12:52 Vu : 5 813

Note :
Aucune note

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

Ce code permet de faire fonctionner l'écran qui est disponible sur LE DEMOBOARD Picdem 2 PLUS de Microchip. Il peut aussi servir à d'autres écran (changer les broches si ce ne sont pas celles choisies). Le compilateur utilisé est CCS. Ce code à été prévu pour un microcontrôleur PIC 16f877.

Source

  • /***************************************************************|*|
  • \ Nom du fichier : ecran.c |*|
  • / affichage sur écran PICDEM 2 Plus |*|
  • \ Langage C compilateur CCS |*|
  • / |*|
  • \ Sous-programmes pour utiliser l'ecran PICDEM 2 PLUS |*|
  • / Pour pic 16F877 - Langage C - Compilateur CCS |*|
  • \ Conseils d'utilisation : |*|
  • / -> mettre ce programme dans la rubrique Other Files |*|
  • \ -> metttre #include "[ecran.c]" après la déclaration |*|
  • / #device [ref du PIC] |*|
  • \ pour envoyer afficher une donnée : envoiLCDd([donnée]) |*|
  • / effacer : effaceLCD(); |*|
  • \ commencer sur la ligne 2 : LCD_ligne([0->ligne 1|*|
  • / 1->ligne2) |*|
  • \_/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\_/*/
  • //#device *=16
  • #use delay (clock=4000000)
  • #byte PORTA=0x05
  • #byte PORTD=0x08
  • #byte ADCON1=0x9F
  • //---- Définition des broches pour l'écran --------------//
  • #bit LCD4=PORTD.0 // LCD data bits
  • #bit LCD5=PORTD.1
  • #bit LCD6=PORTD.2
  • #bit LCD7=PORTD.3
  • #bit LCD_E =PORTA.1 // LCD E clock
  • #bit LCD_RW=PORTA.2 // LCD read/write line
  • #bit LCD_RS=PORTA.3 // LCD register select line
  • //------------------------------------------------------//
  • //void initLCD(void);
  • void envoiLCDn(int donnee_n, int1 rs); //(rs=0 ->instruction rs=1 -> données)
  • void envoiLCD(int donnee, int1 rs);
  • int lectureLCD(int1);
  • void LCDoccupe(void);
  • void effaceLCD (void);
  • void envoiLCDd(int a);
  • void LCD_ligne(int1 ligne);
  • void initLCD(void) //initialisation de l'écran
  • {
  • SET_TRIS_A(0b11110001); // E/S port A
  • SET_TRIS_D(0xF0); // E/S port D
  • PORTA=0x00; //Port A à 0
  • LCD_E=0; //} tout à 0
  • LCD_RW=0;//} " "
  • LCD_RS=0;//} " "
  • ADCON1=0b00001110; // broches A/D
  • envoiLCDn(0b00110000,0);// -> 1ère séquence de contôle
  • delay_ms(4); //
  • envoiLCDn(0b00110000,0);// -> 2ème séquence de contôle
  • delay_us(100); //
  • envoiLCDn(0b00110000,0);// -> 3ème séquence de contôle
  • delay_us(100); //
  • envoiLCDn(0b00100000,0);// -> 4ème séquence de contôle
  • delay_ms(4); //
  • LCDoccupe();
  • envoiLCD(0b00101000,0);//5) Function set
  • delay_ms(2);
  • envoiLCD(0b00001101,0);//6) Display = ON
  • delay_ms(2);
  • envoiLCD(0b00000001,0);//7) Display Clear
  • envoiLCD(0b00000110,0);//8) Entry Mod
  • envoiLCD(0b10000000,0);//9) DDRAM addresss 0000
  • return;
  • }
  • void envoiLCDn(int donnee_n, int1 rs) //LCD write Nibble
  • {
  • LCD_RS=rs; //(rs=0 ->instruction rs=1 -> données)
  • LCD_RW=0; //on envoi
  • //TRIS D est déjà en sortie
  • delay_us(1);
  • LCD_E=1;
  • LCD7 = bit_test(donnee_n,7);
  • LCD6=bit_test(donnee_n,6);
  • LCD5=bit_test(donnee_n,5);
  • LCD4=bit_test(donnee_n,4);
  • delay_us(1);
  • LCD_E=0;
  • return;
  • }
  • void envoiLCD(int donnee, int1 rs) //
  • {
  • LCDoccupe();
  • envoiLCDn(donnee,rs);
  • swap(donnee);
  • envoiLCDn(donnee,rs);
  • swap(donnee);
  • return;
  • }
  • int lectureLCD(int1 rs)
  • {
  • int donnee_lue_a,tmp;
  • SET_TRIS_D(0xFF); // E/S port D données en entrée
  • LCD_RS=rs;
  • LCD_RW=1; //on fait une lecture
  • delay_ms(1);
  • LCD_E=1;
  • delay_ms(2);
  • donnee_lue_a=PORTD; //4 bits de poids fort
  • swap(donnee_lue_a); //remis sur les 4 bits de poids fort de l'octet
  • LCD_E=0;
  • delay_us(9);
  • LCD_E=1;
  • tmp=PORTD & 0b00001111; //on ne prend que les bits de poids faible
  • donnee_lue_a=donnee_lue_a | tmp; //on colle les bits de poids faible
  • LCD_E=0;
  • SET_TRIS_D(0xF0); // E/S port D
  • return donnee_lue_a;
  • }
  • void LCDoccupe(void)
  • {
  • int donnee_lue;
  • do {
  • donnee_lue=lectureLCD(0);
  • } while(bit_test(donnee_lue,7)==1);
  • return;
  • }
  • void effaceLCD (void)
  • {
  • envoiLCD(0b00000001,0);//7) Display Clear
  • envoiLCD(0b00000110,0);//8) Entry Mod
  • envoiLCD(0b10000000,0);//9) DDRAM addresss 0000
  • return;
  • }
  • void envoiLCDd(int a)
  • {
  • envoiLCD(a,1);
  • }
  • void LCD_ligne(int1 ligne)
  • {
  • if(!ligne) envoiLCD(0x80,0);
  • else envoiLCD(0xC0,0);
  • return;
  • }
/***************************************************************|*|
\ Nom du fichier : ecran.c					|*|	
/ affichage sur écran PICDEM 2 Plus				|*|
\ Langage C compilateur CCS					|*|
/								|*|
\ Sous-programmes pour utiliser l'ecran PICDEM 2 PLUS		|*|
/ Pour pic 16F877 - Langage C - Compilateur CCS			|*|
\ Conseils d'utilisation :					|*|
/ -> mettre ce programme dans la rubrique Other Files		|*|
\ -> metttre #include "[ecran.c]" après la déclaration 		|*|
/	#device [ref du PIC]					|*|
\	pour envoyer afficher une donnée : envoiLCDd([donnée])	|*|
/		effacer : effaceLCD();				|*|
\		commencer sur la ligne 2 : LCD_ligne([0->ligne 1|*|
/					 1->ligne2)		|*|
\_/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\_/*/




//#device *=16
#use delay (clock=4000000)

#byte PORTA=0x05
#byte PORTD=0x08

#byte ADCON1=0x9F

//---- Définition des broches pour l'écran --------------//

#bit	LCD4=PORTD.0	// LCD data bits
#bit	LCD5=PORTD.1
#bit	LCD6=PORTD.2
#bit	LCD7=PORTD.3

#bit	LCD_E =PORTA.1	// LCD E clock
#bit	LCD_RW=PORTA.2	// LCD read/write line
#bit	LCD_RS=PORTA.3	// LCD register select line

//------------------------------------------------------//

//void initLCD(void);
void envoiLCDn(int donnee_n, int1 rs); //(rs=0 ->instruction rs=1 -> données)
void envoiLCD(int donnee, int1 rs);
int lectureLCD(int1);
void LCDoccupe(void);
void effaceLCD (void);
void envoiLCDd(int a);
void LCD_ligne(int1 ligne);

void initLCD(void) //initialisation de l'écran
{
	SET_TRIS_A(0b11110001); // E/S port A
	SET_TRIS_D(0xF0);  		// E/S port D
	PORTA=0x00; //Port A à 0
	
	LCD_E=0; //} tout à 0
	LCD_RW=0;//}  "   " 
	LCD_RS=0;//}  "   "
	
	ADCON1=0b00001110; // broches A/D
		
	envoiLCDn(0b00110000,0);// -> 1ère séquence de contôle
	delay_ms(4);			// 

	envoiLCDn(0b00110000,0);// -> 2ème séquence de contôle
	delay_us(100);			//

	envoiLCDn(0b00110000,0);// -> 3ème séquence de contôle
	delay_us(100);			//

	envoiLCDn(0b00100000,0);// -> 4ème séquence de contôle
	delay_ms(4);			//

	LCDoccupe();
	envoiLCD(0b00101000,0);//5) Function set
	delay_ms(2);
	envoiLCD(0b00001101,0);//6) Display = ON
	delay_ms(2);
	envoiLCD(0b00000001,0);//7) Display Clear
	envoiLCD(0b00000110,0);//8) Entry Mod
	envoiLCD(0b10000000,0);//9) DDRAM addresss 0000
	
	return;
}


void envoiLCDn(int donnee_n, int1 rs) //LCD write Nibble 
{
	LCD_RS=rs;	//(rs=0 ->instruction rs=1 -> données)
	LCD_RW=0;	//on envoi
	//TRIS D est déjà en sortie
	delay_us(1);
	LCD_E=1;
	
	LCD7 = bit_test(donnee_n,7);
	LCD6=bit_test(donnee_n,6);
	LCD5=bit_test(donnee_n,5);
	LCD4=bit_test(donnee_n,4);
	delay_us(1);
	LCD_E=0;
	return;
}



void envoiLCD(int donnee, int1 rs) //
{
LCDoccupe();
envoiLCDn(donnee,rs);
swap(donnee);
envoiLCDn(donnee,rs);
swap(donnee);
return;
}

int lectureLCD(int1 rs)
{
	int donnee_lue_a,tmp;
	SET_TRIS_D(0xFF);  		// E/S port D données en entrée
	LCD_RS=rs;
	LCD_RW=1; //on fait une lecture
	
	delay_ms(1);
	
	LCD_E=1;
	
	delay_ms(2);
	
	donnee_lue_a=PORTD; //4 bits de poids fort
	swap(donnee_lue_a); //remis sur les 4 bits de poids fort de l'octet
	LCD_E=0;
	
	delay_us(9);
	
	LCD_E=1;
	tmp=PORTD & 0b00001111; //on ne prend que les bits de poids faible
	donnee_lue_a=donnee_lue_a | tmp;	//on colle les bits de poids faible
	LCD_E=0;
	
	SET_TRIS_D(0xF0);  		// E/S port D
	return donnee_lue_a;
}


void LCDoccupe(void)
{
int donnee_lue;
	do {
		donnee_lue=lectureLCD(0);
		} while(bit_test(donnee_lue,7)==1);
	return;
}

void effaceLCD (void)
{
	envoiLCD(0b00000001,0);//7) Display Clear
	envoiLCD(0b00000110,0);//8) Entry Mod
	envoiLCD(0b10000000,0);//9) DDRAM addresss 0000
	return;
}

void envoiLCDd(int a)
{
envoiLCD(a,1);
}	

void LCD_ligne(int1 ligne)
{
	if(!ligne) envoiLCD(0x80,0);
	else envoiLCD(0xC0,0);	
	return;	
}
09 mars 2007 17:12:52 :
mots-clés changés
  • signaler à un administrateur
    Commentaire de eric1357 le 09/04/2007 09:26:20

    Merci pour cette source , bien commentée et claire....

  • signaler à un administrateur
    Commentaire de amine_hassini le 11/05/2007 16:32:35

    Salut
    J'ai fé une source mais les caractère s'affiche à l'envers, cad il faut retourner la carte pour voir les caractères correctement. T'aurai pas une idée de la cause du blem? Sachant que la source fournit chez microchip marche correctement.

  • signaler à un administrateur
    Commentaire de rompiflor le 20/05/2007 11:34:19

    Il me semble que j'avais eu ce problème. C'était l'initialisation de l'écran qui n'était pas bien faite

Ajouter un commentaire

Discussions en rapport avec ce code source

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS