Mise en oeuvre de l'écran picdem 2 plus demo board sur 4 bits - compilateur ccs

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 083 fois - Téléchargée 23 fois

Contenu du snippet

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 / Exemple :


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

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
samedi 19 novembre 2011
Statut
Membre
Dernière intervention
20 novembre 2011

salut
dans le cadre d'un petit projet, je désire réalisé un système alarme à domicile comportant un afficheur LCD et un clavier 12 touches. l'activation et la désactivation de mon système se fait aprés la saisie d'un code de sécurité. le projet est basé sur le PIC 16F877 ou 18Fxxx qui gére les signaux des capteurs de contacts implantés au niveaux des portes puis il déclenche une sirène et allume une LED en cas de besoin . le probléme que j'arrive pas à trouver un code adéquat, je demande votre aide SVP merci tout le monde.
Messages postés
6
Date d'inscription
samedi 6 janvier 2007
Statut
Membre
Dernière intervention
27 mai 2007

Il me semble que j'avais eu ce problème. C'était l'initialisation de l'écran qui n'était pas bien faite
Messages postés
23
Date d'inscription
mardi 19 octobre 2004
Statut
Membre
Dernière intervention
16 avril 2007

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.
Messages postés
2
Date d'inscription
vendredi 20 août 2004
Statut
Membre
Dernière intervention
9 avril 2007

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.