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
Parabéns!!!
ResponderExcluirAmigo, por acaso disponibilizaria o código fonte do Nokia image converter. Ficaria muito agradecido.
Já disponibilizei!
ExcluirCongratulations! more great blog I just can not do copilar code in mikroC pro for pic it's a mistake ...
ResponderExcluirsorry for the english
Thanks! Thank you!
Olá! Tiago Blz...
ResponderExcluirMinha 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
Olá amigo.
ResponderExcluirComo eu posso fazer para gerar fontes personalizadas e de tamanho maior ?
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 .
ResponderExcluirSaludos