All pastes #408202 Raw Edit

AfficheurLCD4x20

public c v1 · immutable
#408202 ·published 2007-03-24 17:50 UTC
rendered paste body
/*********************************************************************       COMMANDE DE L'AFFICHEUR 4 Lignes de 20 car      **********        PIC18F252 10 MHz avec LCD en mode 4-bit        **********************************************************************/#include "pic18.h"#include "afficheur.h"/************************************************** Fonctions pour l'afficheur**************************************************/near unsigned char cL;void pulse_E(){ E = 1;  asm("nop"); //450 ns mini asm("nop");asm("nop");asm("nop");  E = 0;}void init_lcd(void) {  // initialisation des PORTS  ADCON1 = 0b10001110; // spcifique pour porta  // AN0 entre analogique, le reste en TOR  // rsultat conversion cadr  droite#if POIDS_FORT     TRIS_LCD = TRIS_LCD & 0b00001111; //met en sortie les poids forts#else    TRIS_LCD = TRIS_LCD & 0b11110000; //met en sortie les poids faibles#endif  TRIS_RS = 0; // mise en sortie de RS, RW et E    TRIS_E = 0;  PORT_LCD =0;  RS = 0;  E = 0;#ifdef RW  RW = 0;TRIS_RW = 0;#endif      // ****   initialisation LCD *****#if POIDS_FORT  // version donnes branches sur poids fort de PORT_LCD   tempo1ms(32); //32ms  afficheur  PORT_LCD = (PORT_LCD & 0x0F) | 0x30;  pulse_E();  tempo1ms(5); // 4,1 ms E inclus  pulse_E();  tempo10us(15); // 150s  PORT_LCD = (PORT_LCD & 0x0F) | 0x20; // passe en mode 4 bits  pulse_E();  tempo10us(15); // 150 s#else  // version donnes branches sur poids faible de PORT_LCD   tempo1ms(32); //32ms  afficheur  PORT_LCD = (PORT_LCD & 0xF0) | 0x03;  pulse_E();  tempo1ms(5); // 4,1 ms E inclus  pulse_E();  tempo10us(15); // 150s  PORT_LCD = (PORT_LCD & 0xF0) | 0x02; // passe en mode 4 bits  pulse_E();  tempo10us(15); // 150 s#endif  //**** initialisation paramtres LCD **********************************  put_lcd(0x28,0);  // Mode 4 bits 2 lignes  put_lcd(1,0);     // Efface l'affichage initialisation  DD-ram  put_lcd(0x0C,0);  // Affichage des caractres de gauche  droite et curseur se dplace  put_lcd(6,0);     // Dplacement vers la droite } /**********************************************************  fonction put_lcd : envoi d'un octet de code  l'afficheur   1er parametre  : code   2eme parametre :   commande   : 0                      code ascii : 1 **********************************************************/  void put_lcd(unsigned char cVar, unsigned char cLcd_RS)     {	    unsigned char b3;    // recopie de cLcd_RS sur RS    if(cLcd_RS == 0) { RS = 0; }		        else { RS = 1; }#if POIDS_FORT    //version donnes branches sur poids fort de PORT_LCD			// envoi 4 bit poids fort    b3 = cVar & 0xF0;       PORT_LCD = (PORT_LCD & 0x0F) | b3;     pulse_E();    tempo10us(13); // 128 s   	// envoi 4 bits poids faible    b3 = cVar << 4; 	  	        PORT_LCD = (PORT_LCD & 0x0F)| b3;      pulse_E();    if((cVar>2) || (cLcd_RS!=0)) tempo10us(12); 		// tempo 120s			    else tempo1ms(5);	// tempo 5ms #else	    //version donnes branches sur poids faible de PORT_LCD    // envoi 4 bit poids fort    b3 = cVar>>4;       PORT_LCD = (PORT_LCD & 0xF0) | b3;     pulse_E();    tempo10us(13); // 128 s   	// envoi 4 bits poids faible    b3 = cVar & 0x0F; 	  	        PORT_LCD = (PORT_LCD & 0xF0)| b3;      pulse_E();    if((cVar>2) || (cLcd_RS!=0)) tempo10us(12); 		// tempo 120s			    else tempo1ms(5);	// tempo 5ms #endif } void Ligne_LCD(char cLigne)	{ 	if(cLigne==1) put_lcd(0x80,0); // afficheur ligne 1	else if (cLigne==2) put_lcd(0xC0,0); // afficheur ligne 2	}	 void Efface_LigneLCD(char cEff)	{		if(cEff==1)		{					put_lcd(0x80,0);      // set DDRAM passe 1 ere ligne		for(cL=0;cL<=15;cL++)put_lcd(0x20,1);  // affiche des espaces        put_lcd(0x80,0); // remet en dbut de ligne0.		}	     	if(cEff==2)		{					put_lcd(0xC0,0);      // set DDRAM passe 2 eme ligne 		for(cL=0;cL<=15;cL++)put_lcd(0x20,1);  // affiche des espaces		put_lcd(0xC0,0); // remet en dbut de ligne		} 	  	 	}	void efface_lcd(void)	{	 put_lcd(1,0); 	}   /* criture d'une chaine de caractres sur le LCD    partir de la position indique dans pos_car   1ere ligne de 0  39, 2me de 40  79 etc   */void puts_lcd(const char* texte,unsigned char pos_car)    	{	char cCount=0;    unsigned char ddram;    ddram = 0x80;    if((pos_car>= 40) && (pos_car< 80)) { ddram = 0xC0 - 40; }	if((pos_car>= 80) && (pos_car<120)) { ddram = 0x94 - 80; }	if((pos_car>=120) && (pos_car<160)) { ddram = 0xD4 - 120; }    put_lcd(ddram+pos_car,0); // positionne le 1er car de la chaine.	while (texte[cCount] != 0 )     	put_lcd(texte[cCount++],1);	}//****** tempo pas 1 milliseconde 		******void tempo1ms(int x){ int i,j; // variables locales  for(i=0; i<x; i++)		{ // boucle interne de 1 ms 		  for(j=0;j<TEMPO1MS;j++) { ; }		}}//****** tempo pas 10 microsecondes		******void tempo10us(unsigned char x){ unsigned char i, j; // variables locales  for(i=0; i<x; i++)		{ // boucle interne de 10s          #if FQUARTZ != 4		           for(j=0; j< TEMPO10US; j++) {asm("nop");}          #else         asm("nop");asm("nop");asm("nop");          #endif		}}