// Exemple de gestion d'un afficheur Lcd graphique GDM12864A  
// avec pic18F452, programme sous MCC18      
// C.Dupaty 04/2003 
// IUFM d'Aix-Marseille            
// d'après une étude d'Angeliz 

#include <p18f452.h>

// les "define" ci dessous dépendent de la configuration métérielle

#define LCD_ctrl	PORTB
#define LCD_data	PORTD
#define TRIS_ctrl   TRISB
#define TRIS_data	TRISD
#define LCD_E 		PORTBbits.RB0
#define LCD_RS 		PORTBbits.RB2
#define LCD_CS1 	PORTBbits.RB3
#define LCD_CS2 	PORTBbits.RB4
#define LCD_RST 	PORTBbits.RB5
#define LCD_RW 		PORTBbits.RB1


rom char data[]={
0x00,0xC0,0xFC,0xF2,0xBC,0xC0,0xFE,0xC0,0xF4,0xBA,0xFE,0xC0,0xDE,0xDE,0xFE,0xC2,0xF4,0xC2,0xFE,0x40,0xD4,0xEA,0xBE,0xFE,0xC0,0xFE,0x40,0xDC,0xE2,0x7E,
0xC0,0xD4,0xD4,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xFC,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x3C,0x78,0xF8,0xF0,0xC0,0x00,0x00,0x00,0x00,0xFC,0xFC,
0xFC,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0x78,0x38,0x3C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x38,0x78,0xF0,0xF0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,
0xC0,0x80,0x00,0x00,
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xDF,0xFF,0xBF,0xFF,0xEF,0x7F,0xFF,0xDF,0x7F,0xFF,0xFF,0xDF,0xBF,0xFF,0xFF,0xFF,0xF6,0xFF,0xFB,0xDF,0x7F,0xF7,
0xBD,0xFF,0xEF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xF0,0x78,0x7F,0x3F,0x0F,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0x00,0x00,0x00,0x00,0xFE,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0x3C,0x0E,0x03,0x01,0x00,0x00,0x00,0xC0,0x78,0xDC,0x07,0x81,0xC1,0xC0,0x70,0x39,
0x0F,0x03,0x00,0x00,
0x00,0xFF,0x7F,0x2F,0x1D,0x3F,0x73,0xC0,0x80,0x00,0x03,0x0D,0x1F,0x77,0xE1,0x80,0x00,0x01,0x07,0x0F,0x37,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFD,
0xEF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x01,0x0F,0x1F,0x3E,0x78,0xF0,0xE0,0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xE0,0xF0,0x7C,0x3E,0x1E,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x1C,0x0E,0x07,0x83,0xF1,0x7C,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x07,0x07,0x03,0x03,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,
0x00,0xFF,0xF8,0xE0,0xF0,0xF8,0xDC,0xFF,0xFB,0xDE,0x78,0xF0,0xA0,0xF0,0xFC,0xDF,0xF7,0xFC,0xB8,0xE0,0xE0,0xF0,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x41,0x81,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF0,0xFC,
0xFC,0x7F,0x1F,0x01,0x00,0x00,0x00,0x80,0xF8,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xC0,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0x00,0x00,
0x00,0x00,0x00,
0x00,0x01,0x01,0x81,0x71,0x09,0x71,0x81,0x01,0x01,0xC1,0x21,0x21,0x21,0x41,0x01,0x41,0xA1,0xA1,0xA1,0xC1,0x01,0xC1,0x21,0x21,0x41,0xF9,0x01,0xC1,0xA1,0xA9,
0xA5,0xC1,0x00,0xE0,0x40,0x20,0xE0,0x20,0x20,0xC0,0x00,0xE8,0x00,0xC0,0xA0,0xA0,0xA0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x7F,0xF8,0xC0,0x80,0x00,0x00,0x00,0x80,0xE0,0xF0,0x7C,0x1F,0x0F,0xC3,0xF9,
0x3F,0x03,0x00,0x00,0x00,0x00,0x40,0xE8,0xFF,0xAF,0x80,0x80,0xC0,0xE0,0x70,0x38,0x9C,0x0F,0xD7,0xFF,0xFF,0x7D,0x3C,0x0E,0x07,0x03,0x01,0xFF,0xFF,0x1F,0x00,
0x00,0x00,0x00,0x00,
0x00,0x00,0x06,0x01,0x01,0x01,0x01,0x01,0x06,0x00,0x03,0x04,0x04,0x04,0x02,0x00,0x03,0x04,0x04,0x02,0x07,0x00,0x03,0x04,0x04,0x02,0x07,0x00,0x03,0x04,0x04,0x04,
0x02,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x07,0x00,0x07,0x00,0x03,0x04,0x04,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x1F,0xDF,0xFC,0xFE,0x7F,0xFF,0x63,0xE0,0xF0,0xFA,0xFF,0x71,0xE0,0x70,
0x70,0x70,0x38,0x3C,0xFE,0xFF,0xFF,0x0F,0x07,0x03,0x21,0x01,0x10,0x00,0x08,0x00,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x07,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
0x00,0x00,0xF0,0x08,0x08,0x90,0xFE,0x00,0x0E,0x00,0x80,0x60,0x5C,0x42,0x5C,0x60,0x80,0x00,0xFA,0x00,0x08,0x90,0x60,0x90,0x08,0x00,0x40,0x40,0x40,0x00,0xFE,
0x0C,0x70,0x80,0x70,0x0C,0xFE,0x00,0xD0,0x28,0x28,0xA8,0xF0,0x00,0xF8,0x10,0x08,0x00,0x90,0x28,0x28,0x48,0x90,0x00,0xF0,0x28,0x28,0x28,0xB0,0x00,0xFA,0x00,
0xFE,0x00,0xFE,0x00,0xF0,0x28,0x28,0x28,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x1F,0x3F,0x03,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x02,
0x00,0x00,0x00,0x02,0x00,0x00,0x3F,0x3F,0x76,0x38,0x18,0x1C,0x0E,0x0E,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,
0xF0,0xF0,0xF0,0xF1,0xF1,0xF0,0xF1,0xF0,0xF0,0xF0,0xF1,0xF0,0xF0,0xF0,0xF0,0xF0,0xF1,0xF0,0xF1,0xF0,0xF1,0xF0,0xF0,0xF0,0xF1,0xF0,0xF0,0xF0,0xF0,0xF0,0xF1,
0xF0,0xF0,0xF1,0xF0,0xF0,0xF1,0xF0,0xF0,0xF1,0xF1,0xF0,0xF1,0xF0,0xF1,0xF0,0xF0,0xF0,0xF0,0xF1,0xF1,0xF1,0xF0,0xF0,0xF0,0xF1,0xF1,0xF1,0xF0,0xF0,0xF1,0xF0,
0xF1,0xF0,0xF1,0xF0,0xF0,0xF1,0xF1,0xF1,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,
0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,
0xF0,0xF0,0xF0,0xF0
  };

void ecr_data(char ddata)  	// envoi de l'octet vers lcd
   {
   LCD_RS=1;		  		// vers registre données
   LCD_data=ddata;        
   LCD_E=1;           		// validation  
   LCD_E=0;
   }

void ecr_ctrl(char dctrl)  	// envoi de l'octet vers lcd
   {
   LCD_RS=0;				// vers registre de controle
   LCD_data=dctrl;        
   LCD_E=1;         		// validation  
   LCD_E=0;
   }
   
void chip(unsigned char cs)	// 0 pour gauche,  1 pour droite
{
	LCD_CS1=!cs; 
	LCD_CS2=cs; 
} 

void init_lcd(void)
{
   TRIS_ctrl=0;					//  port CTRL en sortie
   TRIS_data=0;					//  port data en sortie
   LCD_E=0;              		// init E , RW
   LCD_RW=0;         
   LCD_RST=0;            		// reset LCD
   LCD_RST=1;  
  
   chip(0);
   ecr_ctrl(0xC0);        	// RAM 0 sur haut afficheur coté gauche
   ecr_ctrl(0x3F);        	// lcd allumé
   
   chip(1);
   ecr_ctrl(0xC0);        	// RAM 0 sur haut afficheur coté droit
   ecr_ctrl(0x3F);  	  	// lcd allumé
}

void main(void)
{
unsigned char ligne,pix;
unsigned int ptr=0;					// pointeur table data
       
   init_lcd();
       
   for(ligne=0;ligne<8;ligne++)
   {
        chip(0);  				// coté gauche
        ecr_ctrl(0x40);     	// colonne 0         
        ecr_ctrl(0xB8 + ligne); // page ++ 
   		for(pix=0;pix<64;pix++) ecr_data(data[ptr++]);	// envoie 64 données
 		chip(1);				// coté droit
        ecr_ctrl(0x40);     	// colonne 0         /
        ecr_ctrl(0xB8 + ligne); // page ++
	   	for(pix=0;pix<64;pix++)ecr_data(data[ptr++]);  // envoie 64 données
   }
   
 while(1);  
}


