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

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

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.