Fork me on GitHub

08/06/13

PIC: Nokia 6610

PIC: Nokia 6610




O display gráfico colorido Nokia 6610. Possui uma resolução de 132x132 pixels, 16, 12 ou 8 bits por cor, trabalha com tensão de 3.3V ou 5.0V e comunicação via SPI (Clock e Data).


É utilizado somente quatro pinos do MCU (Clock, Data, Reset e CS). Então pode-se utilizar qualquer microcontrolador que possui quatros ou mais pinos I/O.


A biblioteca abaixo suporta o controlador Phillips PCF8833.

FUNÇÕES:


void PCF8833_Init()
void PCF8833_Write_Command(char d)
void PCF8833_Write_Data(char d)
void PCF8833_Box(char x1, char y1, char x2, char y2)
void PCF8833_Fill(char color, char x0, char y0, char x1, char y1)
void PCF8833_Set_Pixel(char x, char y,char fColor)
void PCF8833_Circle(char x0, char y0, char radius, char fColor)
void PCF8833_Circle_Fill(char x0, char y0, char radius, int angle, char color, char bColor)
void PCF8833_Line(char x0, char y0, char x1, char y1, char fColor)
void PCF8833_Rect(char x0, char y0, char x1, char y1, char fColor)
void PCF8833_Rect_Fill(char x0, char y0, char x1, char y1, char fColor, char bColor)
void PCF8833_Write_Char(char caracter, char x, char y,const char *pFont, char fColor, char bColor)
void PCF8833_Write_Text(char *pString, char x, char y,const char *pFont, char fColor, char bColor)
void PCF8833_Image(const char *Bitmap)




BIBLIOTECA:
#include "Phillips_Driver.c"
#include "Font.c"
#include "MinhasImagens.c"

#define CS PORTC.F0
#define CLK PORTC.F1
#define DC PORTC.F2
#define RESET PORTC.F4

#define PCF8833_Clear() PCF8833_Fill(BRANCO, 0, 0, 131, 131);

void shiftData(char dat)
{
char i;
    for (i = 0; i < 8; i++)
     {
      DC =  dat.F7;
      CLK = 1;
      CLK = 0;
      dat <<= 1;
     }
}

void PCF8833_Write_Command(char d)
{
  CS = 1;
  CLK = 0;
  CS = 0;
  DC = 0;
  CLK = 1;
  CLK = 0;
  shiftData(d);
  CS = 1;
}

void PCF8833_Write_Data(char dados)
{
  CS = 1;
  CLK = 0;
  CS = 0;
  DC = 1;
  CLK = 1;
  CLK = 0;
  shiftData(dados);
  CS = 1;
}

void PCF8833_Init()
{
   // Initial state
  CLK = 0;
  CS = 1;
  DC = 1;

  // Hardware Reset LCD
  RESET = 0;
  delay_ms(100);
  RESET = 1;
  delay_ms(100);

  // Sleep out (commmand 0x11)
  PCF8833_Write_Command(SLEEPOUT);
  // Inversion on (command 0x20)
  PCF8833_Write_Command(INVOFF);
  // Color Interface Pixel Format (command 0x3A)
  PCF8833_Write_Command(COLMOD);
  PCF8833_Write_Data(0x02);    //0x02 = 8 bits, 0x03 = 12 bits, 0x05 = 16 bits
  
  // Memory access controler (command 0x36)
  PCF8833_Write_Command(MADCTL);
  PCF8833_Write_Data(0B00010000);//configura a memoria ram(0,131)(0,131),write x direction

  // Write contrast (command 0x25)
  PCF8833_Write_Command(SETCON);
  PCF8833_Write_Data(0x50); // contrast 0x30
  delay_ms(1000);
  // Display On (command 0x29)
  PCF8833_Write_Command(DISPON);

}

void PCF8833_Box(char x1, char y1, char x2, char y2)
{
   PCF8833_Write_Command(CASET);
   PCF8833_Write_Data(y1);
   PCF8833_Write_Data(y2);

   PCF8833_Write_Command(PASET);
   PCF8833_Write_Data(x1);
   PCF8833_Write_Data(x2);
}

void PCF8833_Fill(char color, char x0, char y0, char x1, char y1)
{
  int i;
  
  PCF8833_Box(x0, y0, x1, y1);

  PCF8833_Write_Command(RAMWR);

  for (i = 0; i <= (y1 - y0 + 1) * (x1 - x0 + 1); i++)
  {
    PCF8833_Write_Data(color);
  }
}

void PCF8833_Set_Pixel(char x, char y,char color)
{
  PCF8833_Box(x,y,x,y);
  PCF8833_Write_Command(RAMWR);
  PCF8833_Write_Data(color);
}

void PCF8833_Circle(char x0, char y0, char radius, char color)
{
  int f = 1 - radius;
  int ddF_x = 0;
  int ddF_y = -2 * radius;
  int x = 0;
  char y = radius;
  PCF8833_Set_Pixel(x0, y0 + radius, color);
  PCF8833_Set_Pixel(x0, y0 - radius, color);
  PCF8833_Set_Pixel(x0 + radius, y0, color);
  PCF8833_Set_Pixel(x0 - radius, y0, color);
  while (x < y)
  {
    if (f >= 0)
     {
      y--;
      ddF_y += 2;
      f += ddF_y;
     }
    x++;
    ddF_x += 2;
    f += ddF_x + 1;
    PCF8833_Set_Pixel(x0 + x, y0 + y, color);
    PCF8833_Set_Pixel(x0 - x, y0 + y, color);
    PCF8833_Set_Pixel(x0 + x, y0 - y, color);
    PCF8833_Set_Pixel(x0 - x, y0 - y, color);
    PCF8833_Set_Pixel(x0 + y, y0 + x, color);
    PCF8833_Set_Pixel(x0 - y, y0 + x, color);
    PCF8833_Set_Pixel(x0 + y, y0 - x, color);
    PCF8833_Set_Pixel(x0 - y, y0 - x, color);
   }
}

void PCF8833_Line(char x0, char y0, char x1, char y1, char color)
{
  int dy = y1 - y0;
  int dx = x1 - x0;
  int stepx, stepy;
  int fraction;
  
  if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
  if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
  
  dy <<= 1; // dy is now 2*dy
  dx <<= 1; // dx is now 2*dx
  
  PCF8833_Set_Pixel(x0, y0, color);
  
  if (dx > dy)
  {
    fraction = dy - (dx >> 1); // 2*dy - dx
    while (x0 != x1)
    {
      if (fraction >= 0)
      {
        y0 += stepy;
        fraction -= dx; 
      }
      x0 += stepx;
      fraction += dy; 
      PCF8833_Set_Pixel(x0, y0, color);
    }
  }
  else
  {
    fraction = dx - (dy >> 1);
    while (y0 != y1)
        {
      if (fraction >= 0)
          {
        x0 += stepx;
        fraction -= dy;
      }
      y0 += stepy;
      fraction += dx;
      PCF8833_Set_Pixel(x0, y0, color);
    }
  }
}

void PCF8833_Rect(char x0, char y0, char x1, char y1, char fColor)
{
  PCF8833_Line(x0, y0, x1, y0, fColor);
  PCF8833_Line(x0, y1, x1, y1, fColor);
  PCF8833_Line(x0, y0, x0, y1, fColor);
  PCF8833_Line(x1, y0, x1, y1, fColor);
}

void PCF8833_Rect_Fill(char x0, char y0, char x1, char y1, char fColor, char bColor)
{
  char xmin, xmax, ymin, ymax;
  int i;

  xmin = (x0 <= x1) ? x0 : x1;
    xmax = (x0 > x1) ? x0 : x1;
    ymin = (y0 <= y1) ? y0 : y1;
    ymax = (y0 > y1) ? y0 : y1;

    PCF8833_Line(x0, y0, x1, y0, fColor);
    PCF8833_Line(x0, y1, x1, y1, fColor);
    PCF8833_Line(x0, y0, x0, y1, fColor);
    PCF8833_Line(x1, y0, x1, y1, fColor);
    
    PCF8833_Box(xmin+1, ymin+1, xmax-1, ymax-1);

    PCF8833_Write_Command(RAMWR);
    
    for (i = 0; i < ((((xmax - xmin + 1) * (ymax - ymin + 1))) + 1); i++)
    {
      PCF8833_Write_Data(bColor);
    }
}

void PCF8833_Write_Char(char caracter, char x, char y, const char *pFont, char fColor, char bColor)
{
  char i, j;
  char  nCols;
  char  nRows;
  char PixelRow;
  char Mask;
  unsigned int pChar;
  
  nCols = *pFont;
  nRows = *(pFont + 1);
  pChar = (caracter - 31) * *(pFont+1);

  PCF8833_Box(x, y, x + nCols - 1, y + nRows - 1);
  
  PCF8833_Write_Command(RAMWR);
  
  for (i = 0; i < nRows; i++)
  {
    PixelRow = *(pFont + pChar + i);
    Mask = 0x80;
    for (j = 0; j < nCols; j++)
    {

      if ((PixelRow & Mask) == 0)
        PCF8833_Write_Data(bColor);
      else
        PCF8833_Write_Data(fColor);
      Mask >>= 1;
    }
  }
}

void PCF8833_Write_Text(char *pString, char x, char y, const char *pFont, char fColor, char bColor)
{
  while (*pString)
  {
    PCF8833_Write_Char(*pString++, x, y, pFont, fColor, bColor);
    x = x + *(pFont);
    if (x > 131) break;
  }
}

void PCF8833_Image(const char *Bitmap)
{
  int i;
  
  PCF8833_Write_Command(RAMWR);
  
  for(i=0;i < 17424;i++)
  {
  PCF8833_Write_Data(Bitmap[i]);
  }
}

void PCF8833_Circle_Fill(char x0, char y0, char radius, int angle, char fColor, char bColor)
{
  float radianos;
  int i;
  
  for(i = 0; i < 360; i++)
  {
    radianos = i * 3.1415 / 180;
    if(i < angle) PCF8833_Line(x0 ,y0 , x0 + cos(radianos) * radius, y0 + sin(radianos) * radius, bColor);
    else  PCF8833_Line(x0 ,y0 , x0 + cos(radianos) * radius, y0 + sin(radianos) * radius, fColor);
  }
}

EXEMPLO:
void main()
{
 
 TRISC = 0;
 PCF8833_Init();
 PCF8833_Fill(BRANCO,0,0,131,131);
 PCF8833_Line(10,0,131,131,AMARELO);
 PCF8833_Set_Pixel(10,5,VERDE);
 PCF8833_Write_Char('C',90,20,FONT6x8,VERDE,VERMELHO);
 PCF8833_Write_Text("Font6x8", 10, 50, FONT6x8, VERMELHO, CINZA);
 PCF8833_Write_Text("Font8x8", 10, 60, FONT8x8, AZUL, AMARELO);
 PCF8833_Write_Text("Font8x16", 10, 70, FONT8x16, PINK, VERDE);
 PCF8833_Circle(50,100,20, AZUL);
 PCF8833_Rect(0,0,100,100, VERMELHO);
 PCF8833_Rect_Fill(120,120,131,131,AZUL, VERDE);
 PCF8833_Image(timao);
}



SOFTWARE:
Desenvolvi um software que converte uma imagem 132x132 em uma matriz. Assim você poderá desenhar suas imagens no display lcd, utilizando a função PCF8833_Image();





DOWNLOAD
Biblioteca: Nokia6610.rar;
Software: NokiaImageConverter.exe;
Software - Código-Fonte: NokiaImageConverter.rar
NokiaLCDs: NokiaLCD.zip

6 comentários:

  1. Parabéns!!!

    Amigo, por acaso disponibilizaria o código fonte do Nokia image converter. Ficaria muito agradecido.

    ResponderExcluir
  2. Congratulations! more great blog I just can not do copilar code in mikroC pro for pic it's a mistake ...
     
    sorry for the english

    Thanks! Thank you!

    ResponderExcluir
  3. Olá! Tiago Blz...

    Minha dificuldade.

    Eu coloco a sua biblioteca do RTC DS1307 na do nokia 6610 que é sua também, não compila já tende de varias maneiras mas só da erro vc pode me ajuda?

    Desde já muito obrigado pela atenção

    aquele abraço

    Att,

    Milton lima

    ResponderExcluir
  4. Olá amigo.

    Como eu posso fazer para gerar fontes personalizadas e de tamanho maior ?

    ResponderExcluir
  5. Muchas gracias por compartir excelente materia. Me sirvió mucho, pues pude modificar la librería para un LCD Nokia 1208 pero escrita en CCS. La comparto aquí: http://electronicafb.blogspot.com/2015/06/libreria-para-lcd-nokia-1208b-en-ccs.html .
    Saludos

    ResponderExcluir

Postagens Relacionadas!!