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