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