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 : 8 441

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;	
}

Historique

09 mars 2007 17:12:52 :
mots-clés changés

Commentaires et avis

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 dans le forum

control entre vers de C++ [ par bolix ] je recherche la ligne de commande qui puisse me faire appeler à partir du c++ des programme en asembleurs.je recherche aussi la ligne de commande pou Récupérer la couleur d'un pixel à la position x,y de l'écran [ par atao ] quelqu' un sait il comment peut on récupérer la couleur d'un pixel à la position x,y de l'écranmerciatao. API capte l'écran [ par Bin Laden ] Salut, Je cherche une fonction API qui capte le contenu de l'écran. Problème d'IHM [ par FLOX ] Bonjour à tous,Je vais construire 2 classes (avec C++ Builder) qui aurons pour fonctions de représenter deux écrans. La première représentera un écran Effacer l'écran [ par JosueClement ] Je ne réussi pas à utiliser la fonction "clrscr".les librairies que j'ai inclu sont:<iostream.h><stdlib.h><stdio.h><conio.h>&l Plein écran [ par Thanatos ] Bonjour,Comment fait-on pour mettre la fenêtre DOS en plein écran sous Borland C++ ? Coordonnées de la souris et résolution de l'écran [ par Thanatos ] Bonjour,Comment récupérer et afficher les coordonnées de la souris avec Borland c++ Builder ? Et commment récupérer la résolution de l'écran? plein écran sous dos [ par bouba ] comment faire pour passer en mode plein écran sous dos ? Plein écran [ par JosueClement ] Comment faut-il faire pour qu'un programme s'ouvre en plein écran plutot que fenetré?Merci d'avance.Josué Clémentjosue-clement@bluewin.ch Fond d' écran [ par vdox05 ] J' aimerais savoir comment on peut changer le fond d' écran du bureau à partir d' un programme ...


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.