opvini
 
 
  Joined: 27 Apr 2012 Posts: 50 Location: Brazil 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| Nokia 6100 color graphic display complete library | 
			 
			
				 Posted: Tue May 20, 2014 1:52 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Hi everyone,
 
i rewrite the nokia 6100 ARM library to PIC.
 
 
 	  | Code: | 	 		  
 
//****************************************************************
 
//                           Nokia 6100
 
//
 
//                Color Graphic Display
 
//
 
//****************************************************************
 
//
 
//            Federal University of Ouro Preto - UFOP
 
//               Automation Engineer Department
 
//
 
//
 
// Developed by:
 
//
 
// Vinicius Nunes Lage
 
// email: viniciusop[ @ ]gmail.com
 
// Class 09.1
 
// Last Modification: 15/04/2014
 
//
 
//
 
//////// 
 
////////////////////////////////////////////////////////////////////////////////
 
////      Routines graphiques pour écran couleur Nokia 6100                 ////
 
////      Contrôleur graphique Philips PCF8833                              ////
 
////      Résolution 132 x 132 x 65K couleurs logicielle mais 4K réel       ////
 
///       Dans ce module j'utilise que 256 couleur , c'est plus speed       ////
 
////////////////////////////////////////////////////////////////////////////////
 
 
 
////////////////////////////////////////////////////////////////////////////////
 
////  Entrer ici les broches utilisé par l'ecran                            ////
 
////////////////////////////////////////////////////////////////////////////////
 
 
#define  glcd_res            PIN_C0
 
#define  glcd_sdata          PIN_C1
 
#define  glcd_sclk           PIN_C2
 
#define  glcd_cs             PIN_C3
 
 
////////////////////////////////////////////////////////////////////////////////
 
////  Entrer ici les delais pour init ,write_data et write command          ////
 
////  att1 : attente en µSec pour la routine d'initialisation               ////
 
////  att2 : attente en nanoseconde / 100 pour les routines                 ////
 
////         glcd_write_command ,glcd_write_data et glcd_write_dorc         ////
 
////         Pour 40Mhz att2 à 10 represente 1µSec                          ////
 
////////////////////////////////////////////////////////////////////////////////
 
 
#define  att1           1
 
#define  att2           0
 
 
////////////////////////////////////////////////////////////////////////////////
 
 
#define  SCREEN_COLOR   BLACK
 
#define  USE_GRFCN
 
 
////////////////////////////////////////////////////////////////////////////////
 
////  Les valeurs limite de l'ecran                                         ////
 
////////////////////////////////////////////////////////////////////////////////
 
#define  GCLCDX         132
 
#define  GCLCDY         132
 
#define  X_START        0
 
#define  Y_START        0
 
#define  X_END          GCLCDX
 
#define  Y_END          GCLCDY
 
 
////////////////////////////////////////////////////////////////////////////////
 
////  Les commande du PCF8833                                               ////
 
////////////////////////////////////////////////////////////////////////////////
 
 
#define  LCD_NOP        0x00
 
#define  SOFT_RESET     0x01
 
#define  COLOR_8_BIT    0x02
 
#define  COLOR_16_BIT   0x05
 
#define  BOOSTER_ON     0x03
 
#define  BOOSTER_OFF    0x02
 
#define  SLEEP_OUT      0x11
 
#define  SLEEP_IN       0x10
 
#define  DISPLAY_ON     0x29
 
#define  DISPLAY_OFF    0x28
 
#define  PIXELS_OFF     0x22
 
#define  MEM_CONTROL    0x36
 
#define  COLMOD         0x3A
 
#define  SETCON         0x25
 
#define  ADDRX          0x2A
 
#define  ADDRY          0x2B
 
#define  MEMWRITE       0x2C
 
#define  RGBSET         0x2D
 
#define  NORMAL         0x20
 
#define  INVERT         0x21
 
 
#define  MEM_RGB        0x03 // 00001000    "0": ordre RGB, "1": BGR
 
#define  MEM_LAO        0x10 // 00010000    "0":haut vers bas, "1":bas vers haut
 
#define  MEM_VW         0x20 // 00100000    "0":écriture ds le sens X
 
                             //             "1":écriture ds le sens Y
 
#define  MEM_MX         0x00 // 01000000    "0":normal, "1":miroir en X
 
#define  MEM_MY         0x80 // 10000000    "0":normal, "1":miroir en Y
 
                             // Valeur utilisé ici = 0b11000000
 
                             //   Ordre RGB            ----0---
 
                             //   Haut vers Bas        ---0----
 
                             //   Sens X               --0-----
 
                             //   Mirroir X            -1------
 
                             //   Mirroir Y            1-------
 
 
#ifndef  ON
 
#define  ON           1
 
#endif
 
 
#ifndef  OFF
 
#define  OFF          0
 
#endif
 
 
#ifndef  YES
 
#define  YES          1
 
#endif
 
 
#ifndef  NO
 
#define  NO           0
 
#endif
 
 
 
#define  RGB(r,g,b)     ((r & 0xE0) | ((g & 0xE0) >> 3) | (b >> 6))
 
#define  NONE           RGB(0x00, 0x20, 0x00)  // == transparent, un vert en moin
 
 
 
#define BLUE        0x03
 
#define YELLOW      0xFC
 
#define RED         0XE0
 
#define GREEN       0X1C
 
#define BLACK       0X00
 
#define WHITE       0XFF
 
#define BRIGHTGREEN 0X3D
 
#define DARKGREEN   0X14
 
#define DARKRED     0XA0
 
#define DARKBLUE    0X02
 
#define BRIGHTBLUE  0X1F
 
#define ORANGE      0XF8
 
 
// Definições de cores do LCD
 
// cores em 12bits
 
#define BRANCO 0xFFF
 
#define PRETO 0x000
 
#define VERMELHO 0xF00
 
#define VERDE 0x0F0
 
#define AZUL 0x00F
 
#define CIANO 0x0FF
 
#define MAGENTA 0xF0F
 
#define AMARELO 0xFF0
 
#define MARRON 0xB22
 
#define LARANJA 0xFA0
 
#define ROSA 0xF6A
 
 
 
#byte    SSPCON1  =     0xFC6
 
#bit     SSPEN    =     SSPCON1.5
 
 
 
////////////////////////////////////////////////////////////////////////////////
 
////                                                                        ////
 
////                           Declaration des fonctions                    ////
 
////                                                                        ////
 
////////////////////////////////////////////////////////////////////////////////
 
 
void glcd_init(char contrast);
 
void glcd_off(void);
 
void glcd_write_command(char byteforglcd_command);
 
void glcd_write_data(char byteforglcd_data);
 
void glcd_write_dorc(char byteforglcd);
 
void glcd_cls(char color);
 
void glcd_setarea(char startx, char endx, char starty, char endy);
 
void glcd_contrast(char contrast);
 
void glcd_img(char x, char y);
 
void glcd_anim(char x, char y, int8 frame, int16 wait);
 
void glcd_font(void);
 
//int glcd_putc(int16 c);
 
void glcd_newline(void);
 
void glcd_gotoxy(char x, char y);
 
void glcd_fillscreen(char x1, char y1, char x2, char y2,char color);
 
void glcd_pixel(char x, char y, char color);
 
void glcd_line(char x1, char y1, char x2, char y2, char couleur);
 
void glcd_bar(char x1, char y1, char x2, char y2, char width, char color);
 
void glcd_rect(char x1, char y1, char x2, char y2, char width, int1 fill, char color);
 
void glcd_circle(char x, char y, char radius, int1 fill, char color);
 
void glcd_text57(char x, char y, char* textptr, char size, char color, char bkcolor);
 
void glcd_text812(char x, char y, char* textptr, char color, char bkcolor);
 
void glcd_color(char newColor);
 
 
////////////////////////////////////////////////////////////////////////////////
 
////                                                                        ////
 
////                 Librairie des fontes et images                         ////
 
////                                                                        ////
 
////////////////////////////////////////////////////////////////////////////////
 
 
#include <FONT57.c>
 
#include <FONT812.c>
 
#include <image.c>
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Initialisation de l'afficheur                                       //
 
//                                                                            //
 
//        Param : contraste                                                   //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
 
 
unsigned int32 i;
 
char color;
 
 
 
void glcd_init(char contrast)
 
{
 
   set_tris_c(0x00);
 
 
   output_bit(glcd_cs,TRUE);  // Controleur non sélectionné (CE = "1")
 
   delay_us(att1);
 
   output_bit(glcd_res,TRUE); // et pas de reset (RST = "1")
 
   delay_ms(10);             // Délai de 0,5s
 
   output_bit(glcd_res,FALSE);//Reset controleur (RST = "0")
 
   delay_ms(10);             // Délai de 0,5s
 
   output_bit(glcd_res,TRUE); //Arrêt reset (RST = "1")
 
   delay_us(att1);
 
   output_bit(glcd_cs,FALSE);// Sélection du controleur (CE = "0")
 
   delay_us(att1);   
 
   glcd_write_command(SOFT_RESET); // Software Reset
 
   delay_us(att1);
 
   glcd_write_command(SLEEP_OUT);  // Sleep Out
 
   delay_us(att1);
 
   glcd_write_command(BOOSTER_ON); // Booster ON
 
   delay_ms(10);
 
   glcd_write_command(DISPLAY_ON); // Display ON
 
   delay_us(att1);
 
   glcd_write_command(NORMAL);     // Mode NORMAL
 
   delay_us(att1);
 
   glcd_write_command(COLMOD);     // Commande mode couleur
 
   delay_us(att1);
 
   glcd_write_data(COLOR_8_BIT);   // envoyer Mode 256 couleurs
 
   delay_us(att1);
 
   glcd_write_command(RGBSET);     // Commande definition de la palette
 
                                   // de couleurs
 
   delay_us(att1);
 
 
   // Envoyer les données de la  palette pour RGB 256 couleurs
 
   // ROUGE
 
   glcd_write_data(0);
 
   delay_us(att1);
 
   glcd_write_data(2);
 
   delay_us(att1);
 
   glcd_write_data(4);
 
   delay_us(att1);
 
   glcd_write_data(6);
 
   delay_us(att1);
 
   glcd_write_data(8);
 
   delay_us(att1);
 
   glcd_write_data(10);
 
   delay_us(att1);
 
   glcd_write_data(12);
 
   delay_us(att1);
 
   glcd_write_data(15);
 
   delay_us(att1);
 
   // VERT
 
   glcd_write_data(0);
 
   delay_us(att1);
 
   glcd_write_data(2);
 
   delay_us(att1);
 
   glcd_write_data(4);
 
   delay_us(att1);
 
   glcd_write_data(6);
 
   delay_us(att1);
 
   glcd_write_data(8);
 
   delay_us(att1);
 
   glcd_write_data(10);
 
   delay_us(att1);
 
   glcd_write_data(12);
 
   delay_us(att1);
 
   glcd_write_data(15);
 
   delay_us(att1);
 
   // BLEU
 
   glcd_write_data(0);
 
   delay_us(att1);
 
   glcd_write_data(4);
 
   delay_us(att1);
 
   glcd_write_data(9);
 
   delay_us(att1);
 
   glcd_write_data(15);
 
   delay_us(att1);
 
 
   glcd_write_command(LCD_NOP);
 
   delay_us(att1);
 
 
   glcd_write_command(MEM_CONTROL);
 
   delay_us(att1);
 
   
 
   glcd_write_data(MEM_MY|MEM_MX);
 
   delay_us(att1);
 
 
   glcd_contrast(contrast);      // Ajuster le contraste ( 65 est pas mal )
 
   delay_us(att1);
 
 
   //glcd_cls(WHITE);              // Effacer l'ecran
 
   //delay_us(att1);
 
 
}
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Arrêt de l'afficheur                                                //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_off(void)
 
{
 
   glcd_write_command(PIXELS_OFF);    // All pixels Off
 
   glcd_write_command(DISPLAY_OFF);   // Display Off
 
   glcd_write_command(BOOSTER_OFF);   // Booster Off
 
   glcd_write_command(SLEEP_IN);      // Sleep In
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Envoie une commande                                                 //
 
//                                                                            //
 
//        Param : Commande                                                    //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_write_command(char byteforglcd_command)
 
{
 
   output_bit(glcd_sclk,FALSE);
 
   output_bit(glcd_cs,FALSE);
 
 
   // fala que sera enviado um comando
 
   output_bit(glcd_sdata,FALSE);
 
   output_high(glcd_sclk);
 
   output_low(glcd_sclk);
 
 
   glcd_write_dorc(byteforglcd_command);
 
 
   output_bit(glcd_cs,TRUE);
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Envoie une donnée                                                   //
 
//                                                                            //
 
//        Param : donnée                                                      //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_write_data(char byteforglcd_data)
 
{
 
   output_bit(glcd_sclk,FALSE);
 
   output_bit(glcd_cs,FALSE);
 
 
   // seta que sera enviado um dado
 
   output_bit(glcd_sdata,TRUE);
 
   output_high(glcd_sclk);
 
   output_low(glcd_sclk);
 
   
 
   glcd_write_dorc(byteforglcd_data);
 
 
   output_bit(glcd_cs,TRUE);
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Envoie d'un octet en mode série                                     //
 
//                                                                            //
 
//        Param : octet                                                       //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_write_dorc(char byteforglcd)
 
{
 
      output_bit(glcd_sdata,byteforglcd&0x80);
 
      output_high(glcd_sclk);
 
      output_low(glcd_sclk);
 
      
 
      output_bit(glcd_sdata,byteforglcd&0x40);
 
      output_high(glcd_sclk);
 
      output_low(glcd_sclk);
 
      
 
      output_bit(glcd_sdata,byteforglcd&0x20);
 
      output_high(glcd_sclk);
 
      output_low(glcd_sclk);
 
      
 
      output_bit(glcd_sdata,byteforglcd&0x10);
 
      output_high(glcd_sclk);
 
      output_low(glcd_sclk);
 
      
 
      output_bit(glcd_sdata,byteforglcd&0x08);
 
      output_high(glcd_sclk);
 
      output_low(glcd_sclk);
 
      
 
      output_bit(glcd_sdata,byteforglcd&0x04);
 
      output_high(glcd_sclk);
 
      output_low(glcd_sclk);
 
      
 
      output_bit(glcd_sdata,byteforglcd&0x02);
 
      output_high(glcd_sclk);
 
      output_low(glcd_sclk);
 
      
 
      output_bit(glcd_sdata,byteforglcd&0x01);
 
      output_high(glcd_sclk);
 
      output_low(glcd_sclk);
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Efface l'écran                                                      //
 
//                                                                            //
 
//        Param : couleur 00 - FF                                             //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_cls(char color)
 
{
 
   unsigned int16 i,n;
 
 
   //glcd_write_command(DISPLAY_OFF);
 
   n = X_END*Y_END;
 
   glcd_setarea(X_START, X_END, Y_START, Y_END);
 
   glcd_write_command(MEMWRITE);
 
   for(i=n; i>0; i--)
 
   {
 
      glcd_write_data(color);
 
   }
 
   //glcd_write_command(DISPLAY_ON);
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Délimite la zone d'écriture sur l'écran                             //
 
//                                                                            //
 
//        Param : startx, endx, starty, endy                                  //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_setarea(char startx, char endx, char starty, char endy)
 
{
 
   glcd_write_command(ADDRX);
 
   glcd_write_data(startx);
 
   glcd_write_data(endx);
 
   glcd_write_command(ADDRY);
 
   glcd_write_data(starty);
 
   glcd_write_data(endy);
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Défini le contraste de l'affichage                                  //
 
//                                                                            //
 
//        Param : contraste  (65 = niveau standard)                           //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_contrast(char contrast)
 
{
 
   output_bit(glcd_cs,FALSE);
 
   delay_cycles(att2);
 
   glcd_write_command(SETCON);
 
   glcd_write_data(contrast);
 
   output_bit(glcd_cs,TRUE);
 
   delay_cycles(att2);
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Affiche un pixel                                                    //
 
//                                                                            //
 
//        Param : x - absyse du pixel                                         //
 
//                y - ordonnée du pixel                                       //
 
//                color - 00 - FF                                             //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_pixel(char x, char y, char color)
 
{
 
   glcd_setarea(x, x, y, y);
 
   glcd_write_command(MEMWRITE);
 
   glcd_write_data(color);
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Envoi une image sur l'afficheur                                     //
 
//                                                                            //
 
//        Param : x - absyse du pixel                                         //
 
//                y - ordonnée du pixel                                       //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_img(char x, char y)
 
{
 
   unsigned int16 i,n;
 
   char IMGENDX, IMGENDY;
 
 
   IMGENDX = img[0];
 
   IMGENDY = img[1];
 
 
   glcd_setarea(x,IMGENDX-1+x,y,IMGENDY-1+y);
 
   n = (IMGENDX*IMGENDY)+2;
 
   glcd_write_command(MEMWRITE);
 
   for(i=2; i<n; i++)
 
   {
 
      glcd_write_data(img[i]);
 
   }
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Envoi une sequence d'image sur l'afficheur                          //
 
//                                                                            //
 
//        Param : x - absyse du pixel                                         //
 
//                y - ordonnée du pixel                                       //
 
//                frame - nombre d'images                                     //
 
//                wait - attente entre chaque image en ms                     //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_anim(char x, char y, int8 frame, int16 wait)
 
{
 
   unsigned int16 i,j,n;
 
   char IMGENDX, IMGENDY;
 
 
   IMGENDX = img_a[0];
 
   IMGENDY = img_a[1];
 
 
   glcd_setarea(x,IMGENDX-1+x,y,IMGENDY-1+y);
 
   n = IMGENDX*IMGENDY;
 
   glcd_write_command(MEMWRITE);
 
   for (j=0;j<frame;j++)
 
   {
 
     for(i=2; i<n+2; i++)
 
     {
 
         glcd_write_data(img_a[(j*n)+i]);
 
     }
 
     delay_ms(wait);
 
   }
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        positionne le curseur                                               //
 
//                                                                            //
 
//        Param : x - absyse du pixel                                         //
 
//                y - ordonnée du pixel                                       //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_gotoxy(char x, char y)
 
{
 
   glcd_setarea(x, x, y, y);
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Modifie la couleur en cours                                         //
 
//                                                                            //
 
//        Param : newColor 00 - FF                                            //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_color(char newColor)
 
{
 
   color = newColor;
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Rempli une partie de l'écran avec la couleur                        //
 
//                                                                            //
 
//        Param : startx, endx, starty, endy                                  //
 
//                Couleur du pixel 00 - FF                                    //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_fillscreen(char x1, char y1, char x2, char y2,char color)
 
{
 
   int16 dx,dy;
 
   int16 i,n;
 
 
   glcd_setarea(x1,x2,y1,y2);
 
   dx = (int16)abs((signed int16)(x2 - x1))+1;
 
   dy = (int16)abs((signed int16)(y2 - y1))+1;
 
   n = dx*dy;
 
   glcd_write_command(MEMWRITE);
 
   for(i=n; i>0; i--)
 
   {
 
      glcd_write_data(color);
 
   }
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Trace une ligne                                                     //
 
//                                                                            //
 
//        Param : x1,y1 - coordonnée de départ                                //
 
//                x2,y2 - coordonnée de fin                                   //
 
//                color - 00 - FF                                             //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_line(char x1, char y1, char x2, char y2, char couleur)
 
{
 
   int16        dy, dx;
 
   signed int8  addx=1, addy=1;
 
   signed int16 P, diff;
 
 
   int8 i=0;
 
   dx = abs((signed int8)(x2 - x1));
 
   dy = abs((signed int8)(y2 - y1));
 
 
   if(x1 > x2)
 
      addx = -1;
 
   if(y1 > y2)
 
      addy = -1;
 
 
   if(dx >= dy)
 
   {
 
      dy *= 2;
 
      P = dy - dx;
 
      diff = P - dx;
 
 
      for(; i<=dx; ++i)
 
      {
 
         glcd_pixel(x1, y1, couleur);
 
 
         if(P < 0)
 
         {
 
            P  += dy;
 
            x1 += addx;
 
         }
 
         else
 
         {
 
            P  += diff;
 
            x1 += addx;
 
            y1 += addy;
 
         }
 
      }
 
   }
 
   else
 
   {
 
      dx *= 2;
 
      P = dx - dy;
 
      diff = P - dy;
 
 
      for(; i<=dy; ++i)
 
      {
 
         glcd_pixel(x1, y1, couleur);
 
 
         if(P < 0)
 
         {
 
            P  += dx;
 
            y1 += addy;
 
         }
 
         else
 
         {
 
            P  += diff;
 
            x1 += addx;
 
            y1 += addy;
 
         }
 
      }
 
   }
 
 
}
 
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Trace une barre                                                     //
 
//                                                                            //
 
//        Param : x1,y1 - coordonnée de départ                                //
 
//                x2,y2 - coordonnée de fin                                   //
 
//                width - largeur de la barre                                 //
 
//                color - 00 - FF                                             //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_bar(char x1, char y1, char x2, char y2, char width, char color)
 
{
 
   signed int  x, y, addx, addy, j;
 
   signed long P, dx, dy, c1, c2;
 
   int i;
 
 
   dx = abs((signed int)(x2 - x1));
 
   dy = abs((signed int)(y2 - y1));
 
   x = x1;
 
   y = y1;
 
   c1 = -dx*x1 - dy*y1;
 
   c2 = -dx*x2 - dy*y2;
 
 
   if(x1 > x2)
 
   {
 
      addx = -1;
 
      c1 = -dx*x2 - dy*y2;
 
      c2 = -dx*x1 - dy*y1;
 
   }
 
   else
 
      addx = 1;
 
   if(y1 > y2)
 
   {
 
      addy = -1;
 
      c1 = -dx*x2 - dy*y2;
 
      c2 = -dx*x1 - dy*y1;
 
   }
 
   else
 
      addy = 1;
 
 
   if(dx >= dy)
 
   {
 
      P = 2*dy - dx;
 
 
      for(i=0; i<=dx; ++i)
 
      {
 
         for(j=-(width/2); j<width/2+width%2; ++j)
 
         {
 
            if(dx*x+dy*(y+j)+c1 >= 0 && dx*x+dy*(y+j)+c2 <=0)
 
               glcd_pixel((char)x, (char)(y+j), color);
 
         }
 
         if(P < 0)
 
         {
 
            P += 2*dy;
 
            x += addx;
 
         }
 
         else
 
         {
 
            P += 2*dy - 2*dx;
 
            x += addx;
 
            y += addy;
 
         }
 
      }
 
   }
 
   else
 
   {
 
      P = 2*dx - dy;
 
 
      for(i=0; i<=dy; ++i)
 
      {
 
         if(P < 0)
 
         {
 
            P += 2*dx;
 
            y += addy;
 
         }
 
         else
 
         {
 
            P += 2*dx - 2*dy;
 
            x += addx;
 
            y += addy;
 
         }
 
         for(j=-(width/2); j<width/2+width%2; ++j)
 
         {
 
            if(dx*x+dy*(y+j)+c1 >= 0 && dx*x+dy*(y+j)+c2 <=0)
 
               glcd_pixel((char)(x+j), (char)y, color);
 
         }
 
      }
 
   }
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Trace un rectangle                                                  //
 
//                                                                            //
 
//        Param : x1,y1 - coordonnée de départ                                //
 
//                x2,y2 - coordonnée de fin                                   //
 
//                width - largeur du cadre                                    //
 
//                fill  - plein YES ou NO                                     //
 
//                color - couleur 00 - FF                                     //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_rect(char x1, char y1, char x2, char y2, char width, int1 fill, char color)
 
{
 
   if(fill)
 
   {
 
      int y, ymax;                          // Find the y min and max
 
      if(y1 < y2)
 
      {
 
         y = y1;
 
         ymax = y2;
 
      }
 
      else
 
      {
 
         y = y2;
 
         ymax = y1;
 
      }
 
 
      glcd_fillscreen(x1,y,x2,ymax,color);  // Draw box to fill the rectangle
 
   }
 
   else
 
   {
 
      if(width)
 
      {
 
         glcd_bar(x1, y1, x2, y1, width, color);      // Draw the 4 sides
 
         glcd_bar(x1, y2, x2, y2, width, color);
 
         glcd_bar(x1, y1, x1, y2, width, color);
 
         glcd_bar(x2, y1, x2, y2, width, color);
 
      }
 
      else
 
      {
 
         glcd_line(x1, y1, x2, y1, color);
 
         glcd_line(x1, y2, x2, y2, color);
 
         glcd_line(x1, y1, x1, y2, color);
 
         glcd_line(x2, y1, x2, y2, color);
 
      }
 
   }
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Trace un cercle                                                     //
 
//                                                                            //
 
//        Param : x,y - centre du cercle                                      //
 
//                radius - rayon du cercle                                    //
 
//                fill  - plein YES ou NO                                     //
 
//                color - couleur 00 - FF                                     //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_circle(char x, char y, char radius, int1 fill, char color)
 
{
 
   signed int a, b, P;
 
   a = 0;
 
   b = radius;
 
   P = 1 - radius;
 
 
   do
 
   {
 
      if(fill)
 
      {
 
         glcd_line(x-a, y+b, x+a, y+b, color);
 
         glcd_line(x-a, y-b, x+a, y-b, color);
 
         glcd_line(x-b, y+a, x+b, y+a, color);
 
         glcd_line(x-b, y-a, x+b, y-a, color);
 
      }
 
      else
 
      {
 
         glcd_pixel(a+x, b+y, color);
 
         glcd_pixel(b+x, a+y, color);
 
         glcd_pixel(x-a, b+y, color);
 
         glcd_pixel(x-b, a+y, color);
 
         glcd_pixel(b+x, y-a, color);
 
         glcd_pixel(a+x, y-b, color);
 
         glcd_pixel(x-a, y-b, color);
 
         glcd_pixel(x-b, y-a, color);
 
      }
 
 
      if(P < 0)
 
         P+= 3 + 2*a++;
 
      else
 
         P+= 5 + 2*(a++ - b--);
 
    } while(a <= b);
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Ecrit un texte avec la fonte 5 x 7 pixels                           //
 
//                                                                            //
 
//        Param : x,y - coordonnée supérieure gauche du premier caractère     //
 
//                textptr _ pointer sur un tableau chaine                     //
 
//                size - taille du texte : 1 = 5x7, 2 = 10x14                 //
 
//                color - couleur 00 - FF                                     //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_text57(char x, char y, char* textptr, char size, char color, char bkcolor)
 
{
 
   int8 j, k, l, m;                       // Loop counters
 
   int8 pixelData[5];                     // Stores character data
 
 
   for(; *textptr != '\0'; ++textptr, ++x)// Loop through the passed string
 
   {
 
      if(*textptr < 'S') // Checks if the letter is in the first font array
 
         memcpy(pixelData, FONT[*textptr - ' '], 5);
 
      else if(*textptr <= '~') // Check if the letter is in the second font array
 
         memcpy(pixelData, FONT2[*textptr - 'S'], 5);
 
      else
 
         memcpy(pixelData, FONT[0], 5);   // Default to space
 
 
       // Handles newline and carriage returns
 
      switch(*textptr)
 
      {
 
         case '\n':
 
            y += 7*size + 1;
 
            continue;
 
         case '\r':
 
            x = 0;
 
            continue;
 
      }
 
 
      if(x+5*size > X_END)          // Performs character wrapping
 
      {
 
         x = 0;                           // Set x at far left position
 
         y += 7*size + 1;                 // Set y at next position down
 
      }
 
      for(j=0; j<5; ++j, x+=size)         // Loop through character byte data
 
      {
 
         for(k=0; k < 7; ++k)             // Loop through the vertical pixels
 
         {
 
            if(bit_test(pixelData[j], k)) // Check if the pixel should be set
 
            {
 
               for(l=0; l < size; ++l)    // These two loops change the
 
               {                          // character's size
 
                  for(m=0; m < size; ++m)
 
                  {
 
                     glcd_pixel(x+m, y+k*size+l, color); // Draws the pixel
 
                  }
 
 
 
               }
 
            }
 
            else if (bkcolor != NONE)
 
               {
 
                  for(l=0; l < size; ++l)    // These two loops change the
 
                  {                          // character's size
 
                     for(m=0; m < size; ++m)
 
                     {
 
                        glcd_pixel(x+m, y+k*size+l, bkcolor); // Draws the pixel
 
                     }
 
                  }
 
               }
 
         }
 
      }
 
   }
 
}
 
 
////////////////////////////////////////////////////////////////////////////////
 
//                                                                            //
 
//        Ecrit un texte avec la fonte 8 x 12 caracteres                      //
 
//                                                                            //
 
//        Param : x,y - coordonnée supérieure gauche du premier caractère     //
 
//                textptr _ pointer sur un tableau chaine                     //
 
//                color - couleur 00 - FF - NONE                              //
 
//                                                                            //
 
////////////////////////////////////////////////////////////////////////////////
 
void glcd_text812(char x, char y, char* textptr, char color, char bkcolor)
 
{
 
   int8 j, k;                              // Loop counters
 
   int8 pixelData[16];                     // Stores character data
 
 
   for(; *textptr != '\0'; ++textptr)// Loop through the passed string
 
   {
 
      if(*textptr <= '~') //
 
         memcpy(pixelData, FONT812[*textptr - ' '], 16);
 
      else
 
         memcpy(pixelData, FONT812[0], 16);   // Default to space
 
 
       // Handles newline and carriage returns
 
      switch(*textptr)
 
      {
 
         case '\n':
 
            y += 12 + 1;
 
            continue;
 
         case '\r':
 
            x = 0;
 
            continue;
 
      }
 
 
      if(x+8 > X_END)          // Performs character wrapping
 
      {
 
         x = 0;                           // Set x at far left position
 
         y += 12 + 1;                 // Set y at next position down
 
      }
 
      for(j=0; j<8; j++, ++x)         // Loop through character byte data
 
      {
 
         for(k=0; k < 8; ++k)             // Loop through the vertical pixels
 
         {
 
            if(bit_test(pixelData[j], k)) // Check if the pixel should be set
 
            {
 
               glcd_pixel(x, y+k, color); // Draws the pixel
 
            }
 
            else if (bkcolor != NONE)
 
            {
 
               glcd_pixel(x, y+k, bkcolor); // Draws the pixel
 
            }
 
 
         }
 
         for(k=0; k < 4; ++k)             // Loop through the vertical pixels
 
         {
 
            if(bit_test(pixelData[j+8], k)) // Check if the pixel should be set
 
            {
 
               glcd_pixel(x, y+(k+8), color); // Draws the pixel
 
            }
 
              else if (bkcolor != NONE)
 
            {
 
               glcd_pixel(x, y+(k+8), bkcolor); // Draws the pixel
 
            }
 
 
         }
 
 
      }
 
      ++x;
 
   }
 
}
 
 | 	  
 
 
 
EXAMPLE with 18F4520:
 
 
 	  | Code: | 	 		  
 
//****************************************************************
 
//
 
//                           EXAMPLE_nokia6100.c
 
//
 
//**************************************************************** 
 
 
#include <18f452.h>
 
 
#use delay(clock=20000000) 
 
#fuses HS
 
 
 
#define use_portb_lcd true
 
#include <pcf8833.c>
 
#include <string.h>
 
 
#define INC_X 2
 
#define INC_Y 2
 
 
void main(){
 
 
 
   char a[50];
 
   int i=20, j=20, xcl=0, ycl=0, tamX=10, tamY=10;
 
   signed int incX=0, incY=0;
 
   
 
   set_tris_c(0x00);          // Port C en sorties
 
   output_c(0x00);            // tout le port C à 0
 
 
   glcd_init(65);
 
   glcd_cls(PRETO);
 
   glcd_cls(BRANCO);
 
   glcd_cls(PRETO);
 
   
 
   
 
   while(1){
 
 
      glcd_fillscreen(i, j, i+tamX, j+tamY, PRETO);
 
      
 
      i += incX;
 
      j += incY;
 
      
 
      if(i>132 && incX > 0) i=0;
 
      else if(i==0 && incX < 0) i=132;
 
      
 
      if(j>132 && incY > 0) j=0;
 
      else if(j==0 && incY < 0) j=132;
 
      
 
      glcd_fillscreen(i, j,      i+tamX, j+tamY, BRANCO);
 
      
 
      if( input(PIN_D0) ) { incX = -INC_X; incY = 0; }
 
      if( input(PIN_D1) ) { incX =  INC_X; incY = 0; }
 
      
 
      if( input(PIN_D2) ) { incX = 0; incY = -INC_Y; }
 
      if( input(PIN_D3) ) { incX = 0; incY =  INC_Y; }
 
      
 
      delay_ms(100);
 
      
 
   /*
 
      strcpy(a, "Opa");
 
      glcd_text812(10,10,a,WHITE,PRETO);
 
      delay_ms(2000);
 
      
 
      strcpy(a, "Tudo bom?");
 
      glcd_text812(10,10,a,WHITE,PRETO);
 
      delay_ms(2000);
 
      
 
      strcpy(a, "Aqui tudo joia!");
 
      glcd_text812(10,10,a,WHITE,PRETO);
 
      delay_ms(2000);
 
      
 
      strcpy(a, "Abracao...");
 
      glcd_text812(10,10,a,WHITE,PRETO);
 
      delay_ms(2000);
 
      
 
      strcpy(a, "Opa");
 
      glcd_text812(10,10,a,WHITE,PRETO);
 
      delay_ms(2000);
 
      */
 
   }
 
   
 
}
 
 
 | 	 
  | 
			 
		  |