//-------Rotinas para pcd8544 por Daniel Gonçalves a.k.a. Tr3s------
// Podem usar estas rotinas à vontade para projectos particulares.
// Para fins comerciais entrar em contacto com we_real_cool@hotmail.com
// Partilhem com apenas com o meu concentimento.
// Se virem este código noutro sitio sem ser [url=http://www.lusorobotica.com]www.lusorobotica.com[/url] avisem de imediato para we_real_cool@hotmail.com!
byte nokiabyte[][5] = { // Caracteres para usar uma vez que o controlador não os tem defenidos
{0x00, 0x00, 0x00, 0x00, 0x00} // 20
.....
,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f ?
};
void initlcd(void){ // Iniciar o LCD, tem de se usar isto antes de fazer qualquer coisa no LCD! Se não se defenir a tensão do LCD este pode queimar.
digitalWrite(RES, HIGH); // Meter o pin reset a 1
digitalWrite(SCE, HIGH); // Desactivar o chip
digitalWrite(RES, LOW); // Fazer reset ao LCD
delay(100); // Conforme diz no datasheet do pcd8544, convem esperar 100ms ate o poder acordar
digitalWrite(RES, HIGH); // Acordar o LCD do estado RESET
writecom(0x21); // Activar o chip e H=1 (datasheet)
writecom(0xC2); // Defenir a voltagem/tensão do LCD para 7V
writecom(0x13); // Ajusta a zona de operação/"Bias point" com base na voltagem defenida
writecom(0x20); // Define o modo de operação, neste caso endereçamento Horizontal (H=0)
writecom(0x09); // Acticar todos os segmentos
clearram(); // Limpar a memória ram
writecom(0x08); // Limpar/flashar o ecra
writecom(0x0C); // Normalizar o ecra
cursorxy(0, 0); // Colocar o cursor na primeira coluna da primeira linha do ecra
}
void writecom(char command_in){ // Esta rotina, agora um método, serve para enviar comandos para o controlador do LCD, desligar, inverter pixeis, tipo de endereçamento, etc.
digitalWrite(DC, LOW); // Seleccionar o registo de Comandos
digitalWrite(SCE, LOW); // Seleccionar o chip
clockdata(command_in); // Enviar os bits de comando a cada clock,ou "clock in" aos bits de comando
digitalWrite(SCE, HIGH); // Libertar o chip
}
void writedata(char data_in){ // Com esta rotina, agora método, envia-se um byte para o LCD, este byte corresponde a uma coluna com um pixel de largura e 8 pixeis de altura (1x8), 0xFF coluna toda a negro
digitalWrite(DC, HIGH); // Seleccionar o registo de Dados
digitalWrite(SCE, LOW); // Seleccionar o chip
clockdata(data_in); // "Clock in" :) os bits de dados
digitalWrite(SCE, HIGH); // Libertar o chip
}
void clockdata(char bits_in){ // Esta rotina envia os dados para o PCD8544
char bitcnt;
for (bitcnt = 8; bitcnt > 0; bitcnt--){
digitalWrite(SCK, LOW); // Parar o clock
if ((bits_in & 0x80) == 0x80) digitalWrite(SDI, HIGH); // O pcd8544 "clock in" o MSB primeiro
else digitalWrite(SDI, LOW);
digitalWrite(SCK, HIGH); // Os dados sao enviados nas transições ascendentes de clock
bits_in <<= 1; // Menos um bit, shift tudo 1bit
}
}
/*
void clearram(void){ // PCD8544 - Limpa a RAM do controlador PCD8544 e assim limpa-se o LCD.
int ddram;
cursorxy(0, 0); // Colocar o cursor no inicio do ecrã
for (ddram = 504; ddram > 0; ddram--){ // 6(linhas) x 84 (colunas) = 504 endereços
writedata(0x00);
}
}
*/
void clearram(void){ // OM6206 - Limpa a RAM do controlador OM6206 e assim limpa-se o LCD.
int ddram;
cursorxy(0, 0); // Colocar o cursor no inicio do ecrã
for (ddram = 864; ddram > 0; ddram--){ // 9(linhas) x 96 (colunas) = 864 endereços
writedata(0x00);
}
}
/*void cursorxy(char x,char y){ // PCD8544 - Colocar o cursor em determinada linha e coluna. Ex.: cursorxy(24,3) -> os proximos dados irao começar a aparecer na linha 3 e coluna 24
writecom(0x40 | (y & 0x07)); // definir cursor no eixo OY
writecom(0x80 | (x & 0x7F)); // definir cursor no eixo OX
}*/
void cursorxy(char x,char y){ // OM6206 - Colocar o cursor em determinada linha e coluna. Ex.: cursorxy(24,3) -> os proximos dados irao começar a aparecer na linha 3 e coluna 24
writecom(0x40 | (y & 0x0F)); // definir cursor no eixo OY
writecom(0x80 | (x & 0x7F)); // definir cursor no eixo OX
}
void putchar(char character){ // Traduz os caracteres para um formato reconhecido pelo PCD8544 e envia-os para o LCD. Cada caracter é um conjunto de 5 bytes.
for (char i = 0; i < 5; i++){
writedata(nokiabyte[character - 0x20][i]); // Vai buscar o byte ao array de caracteres e envia-o para o LCD
}
writedata(0x00); // Espaçamento de um pixel entre cada caracter
}
void putstr(const char *s){ // Colocar uma frase/conjunto de caracteres (String) no LCD.
while(*s){putchar(*s++);} // Apontar para um caracter no formato ASCII e escrever um caracter de cada vez
}
Por Daniel Gonçalves a.k.a. (t.c.p.) Tr3s, para www.lusorobotica.com (http://www.lusorobotica.com)
#include <Wire.h>
#define SCE 7
#define RES 6
#define DC 5
#define SDI 4
#define SCK 3
#define backLIGHT 13
void initlcd(void); // Inicia o LCD.
void writecom(char); // Escreve o comando/comandos.
void writedata(char); // Escreve os dados para a DDRAM para iluminar os pixeis.
void clockdata(char); // Envia os dados para o controlador PCD8544.
void clearram(void); // Apaga o conteudo da DDRAM.
void cursorxy(char,char); // Posiciona o cursor em x,y.
void putchar(char); // Escreve um caracter.
void putstr(const char *); // Escreve um conjunto de caracteres.
byte luso[768] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
...
0x00,0x1E,0x23,0x21,0x21,0x21,0x12,0x00,0x00,0x18,0x25,0x25,0x25,0x3E,0x20,0x00
};
void setup(void){
// LCD - Defenir os cinco pins como pins de output
pinMode(SCE, OUTPUT);
pinMode(RES, OUTPUT);
pinMode(DC, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SCK, OUTPUT);
initlcd(); // Iniciar o LCD
delay(100); // O datasheet pede 100ms após arrancar
//--------------------------------------------
}
void loop(){
putstr("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!");
delay(3000);
cursorxy(0,0);
for (int i = 0; i<768;i++) writedata(luso[i]);
cursorxy(0,0);
putstr("Tr3s @");
delay(5000);
clearram();
}
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg515.imageshack.us%2Fimg515%2F8607%2Fsnc00070yb4.jpg&hash=bc29c68ccc92aea93ab5a0472290f4f65f5de2da)Não consegui evitar... digam lá se o nosso logo não fica genial neste LCD? :D
iCar, o LCD ate o podes ligar a 5v, não há problema, certifica-te que no pin vOut do lcd tens um condensador de mais ou menos 10uF com a polarização correcta ligado à massa. Eu peço desculpa, disse que não era preciso este condensador mas estava errado. Quando fiz o teste de o tirar o LCD já estava ligado e nesse caso ele fica um pouco mais escuro, se tentares ligar o LCD sem o condensador ele não liga mesmo. Algum dos administradores que corrija aquela linha se fizer favor.
byte luso [504] = {
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,0x00,0x80,
0x80,0xC0,0xC0,0xE0,0xE0,0xE0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xE0,0xE0,0xE0,
0xC0,0xC0,0x80,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,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,0x00,0x00,0x80,0xE0,0xF8,
0xFC,0xFE,0xFF,0xFF,0x9F,0x0F,0x0F,0x0F,0x0F,0x0F,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,
0x9F,0x0F,0x0F,0x0F,0x0F,0x0F,0x9F,0xFF,0xFF,0xFE,0xFC,0xF8,0xE0,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,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,0xFD,0xFD,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0x03,0xFB,
0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,
0xFD,0xFD,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,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x7A,0x7B,0x7B,0x7B,0x7B,0x7B,
0x7B,0x7B,0x7B,0x7A,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,
0xBD,0xBD,0x3C,0xBD,0xBD,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x7A,0x7B,0x7B,0x7B,0x7B,0x7B,0x7B,0x7B,0x7A,
0x78,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,0x5F,0xDF,0xDF,0xDF,
0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0x5F,0x00,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x00,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x8F,0x4F,0x0F,0x0F,0x00,0x5F,0xDF,0xDF,0xDF,0xDF,
0xDF,0xDF,0xDF,0xDF,0xDF,0x5F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x42,0x7E,0x42,0x40,0x40,0x00,0x00,0x04,0x7C,0x40,0x3C,
0x40,0x00,0x00,0x48,0x54,0x54,0x54,0x24,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,
0x00,0x42,0x7E,0x52,0x2A,0x64,0x40,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x42,0x7E,
0x48,0x44,0x44,0x38,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x04,0x3E,0x44,
0x44,0x20,0x00,0x00,0x40,0x48,0x7A,0x40,0x00,0x00,0x00,0x38,0x4C,0x44,0x44,0x28,
0x00,0x00,0x20,0x54,0x54,0x78,0x40,0x00
};
// instrução para imprimires este logo
// for(int i = 0; i<504; i++) writedata(luso[i]);
// se mostrares algo no lcd antes disto faz cursorxy(0,0); antes de usares o for();
void clearram(void){ // PCD8544 - Limpa a RAM do controlador PCD8544 e assim limpa-se o LCD.
int ddram;
cursorxy(0, 0); // Colocar o cursor no inicio do ecrã
for (ddram = 504; ddram > 0; ddram--){ // 6(linhas) x 84 (colunas) = 504 endereços
writedata(0x00);
}
}
/*
void clearram(void){ // OM6206 - Limpa a RAM do controlador OM6206 e assim limpa-se o LCD.
int ddram;
cursorxy(0, 0); // Colocar o cursor no inicio do ecrã
for (ddram = 864; ddram > 0; ddram--){ // 9(linhas) x 96 (colunas) = 864 endereços
writedata(0x00);
}
}
*/
void cursorxy(char x,char y){ // PCD8544 - Colocar o cursor em determinada linha e coluna. Ex.: cursorxy(24,3) -> os proximos dados irao começar a aparecer na linha 3 e coluna 24
writecom(0x40 | (y & 0x07)); // definir cursor no eixo OY
writecom(0x80 | (x & 0x7F)); // definir cursor no eixo OX
}
/*
void cursorxy(char x,char y){ // OM6206 - Colocar o cursor em determinada linha e coluna. Ex.: cursorxy(24,3) -> os proximos dados irao começar a aparecer na linha 3 e coluna 24
writecom(0x40 | (y & 0x0F)); // definir cursor no eixo OY
writecom(0x80 | (x & 0x7F)); // definir cursor no eixo OX
}
*/
byte nokiabyte[][5] = {
{0x00, 0x00, 0x00, 0x00, 0x00} // 20
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ?
,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f ?
};
e ainda falta a confirmação de duas pessoas, vou enviar pm a essas duas pessoas.
e ainda falta a confirmação de duas pessoas, vou enviar pm a essas duas pessoas.
O metRo_ quer dizer que se esses não confirmarem, podes ficar com um se quiseres ;)
Prezados amigos...Olá André,
Sou do Brasil e tenho um router CNC, e no entanto eu gostaria de implementar um termometro para checar a temperatura do circuto eletronico (FETS). Vi este forum e fiquei muito interessado em fazer um termometro como este ( grafico ) utilizando um LCD de telemovel. Já tenho inclusive um LCD disponivel. Gostaria que vcs me enviassem o diagrama eletronico para ver se é possivel encontrar os componentes aqui no Brasil.
Desde já agradeço a todos..
André Lima
Para uma solução a cores aqui fica uma dica:
...........
...........
...........
...........
...........
...........
#include <Wire.h>
#define SCE 7
#define RES 6
#define DC 5
#define SDI 4
#define SCK 3
#define backLIGHT 13
//isto pus tal cm está na pag 3
byte nokiabyte[][5] = { // Caracteres para usar uma vez que o controlador não os tem defenidos
{0x00, 0x00, 0x00, 0x00, 0x00} // 20
.....
,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f ?
};
void setup(void){
// LCD - Defenir os cinco pins como pins de output
pinMode(SCE, OUTPUT);
pinMode(RES, OUTPUT);
pinMode(DC, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SCK, OUTPUT);
initlcd(); // Iniciar o LCD
delay(100); // O datasheet pede 100ms após arrancar
//--------------------------------------------
}
void initlcd(void){ // Iniciar o LCD, tem de se usar isto antes de fazer qualquer coisa no LCD! Se não se defenir a tensão do LCD este pode queimar.
digitalWrite(RES, HIGH); // Meter o pin reset a 1
digitalWrite(SCE, HIGH); // Desactivar o chip
digitalWrite(RES, LOW); // Fazer reset ao LCD
delay(100); // Conforme diz no datasheet do pcd8544, convem esperar 100ms ate o poder acordar
digitalWrite(RES, HIGH); // Acordar o LCD do estado RESET
writecom(0x21); // Activar o chip e H=1 (datasheet)
writecom(0xC2); // Defenir a voltagem/tensão do LCD para 7V
writecom(0x13); // Ajusta a zona de operação/"Bias point" com base na voltagem defenida
writecom(0x20); // Define o modo de operação, neste caso endereçamento Horizontal (H=0)
writecom(0x09); // Acticar todos os segmentos
clearram(); // Limpar a memória ram
writecom(0x08); // Limpar/flashar o ecra
writecom(0x0C); // Normalizar o ecra
cursorxy(0, 0); // Colocar o cursor na primeira coluna da primeira linha do ecra
}
void writecom(char command_in){ // Esta rotina, agora um método, serve para enviar comandos para o controlador do LCD, desligar, inverter pixeis, tipo de endereçamento, etc.
digitalWrite(DC, LOW); // Seleccionar o registo de Comandos
digitalWrite(SCE, LOW); // Seleccionar o chip
clockdata(command_in); // Enviar os bits de comando a cada clock,ou "clock in" aos bits de comando
digitalWrite(SCE, HIGH); // Libertar o chip
}
void writedata(char data_in){ // Com esta rotina, agora método, envia-se um byte para o LCD, este byte corresponde a uma coluna com um pixel de largura e 8 pixeis de altura (1x8), 0xFF coluna toda a negro
digitalWrite(DC, HIGH); // Seleccionar o registo de Dados
digitalWrite(SCE, LOW); // Seleccionar o chip
clockdata(data_in); // "Clock in" :) os bits de dados
digitalWrite(SCE, HIGH); // Libertar o chip
}
void clockdata(char bits_in){ // Esta rotina envia os dados para o PCD8544
char bitcnt;
for (bitcnt = 8; bitcnt > 0; bitcnt--){
digitalWrite(SCK, LOW); // Parar o clock
if ((bits_in & 0x80) == 0x80) digitalWrite(SDI, HIGH); // O pcd8544 "clock in" o MSB primeiro
else digitalWrite(SDI, LOW);
digitalWrite(SCK, HIGH); // Os dados sao enviados nas transições ascendentes de clock
bits_in <<= 1; // Menos um bit, shift tudo 1bit
}
}
void clearram(void){ // OM6206 - Limpa a RAM do controlador OM6206 e assim limpa-se o LCD.
int ddram;
cursorxy(0, 0); // Colocar o cursor no inicio do ecrã
for (ddram = 864; ddram > 0; ddram--){ // 9(linhas) x 96 (colunas) = 864 endereços
writedata(0x00);
}
}
void cursorxy(char x,char y){ // OM6206 - Colocar o cursor em determinada linha e coluna. Ex.: cursorxy(24,3) -> os proximos dados irao começar a aparecer na linha 3 e coluna 24
writecom(0x40 | (y & 0x0F)); // definir cursor no eixo OY
writecom(0x80 | (x & 0x7F)); // definir cursor no eixo OX
}
void putchar(char character){ // Traduz os caracteres para um formato reconhecido pelo PCD8544 e envia-os para o LCD. Cada caracter é um conjunto de 5 bytes.
for (char i = 0; i < 5; i++){
writedata(nokiabyte[character - 0x20][i]); // Vai buscar o byte ao array de caracteres e envia-o para o LCD
}
writedata(0x00); // Espaçamento de um pixel entre cada caracter
}
void putstr(const char *s){ // Colocar uma frase/conjunto de caracteres (String) no LCD.
while(*s){putchar(*s++);} // Apontar para um caracter no formato ASCII e escrever um caracter de cada vez
}
void loop(){
putstr("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!");
delay(3000);
}
// More circles
for( int xc = 10; xc < 85; xc+=15 ) {
lcd.drawCircle(xc, 24, 20, PIXEL_ON );
}
delay( 2000 );
// Define SPI port
#define LCD_RST PORTB1
#define SPI_SS PORTB2 // must be high whilst SPCR is set.
// Default CS for nuelectronics shield
#define SPI_CS PORTB2
#define SPI_CS_PORT PORTB
#define SPI_CS_DDR DDRB
// Alternative DIgital Pin 6 if you want to modify shield to use Ethernet at same time
//#define SPI_CS PORTD6
//#define SPI_CS_PORT PORTD
//#define SPI_CS_DDR DDRD
#define SPI_MOSI PORTB3
#define SPI_SCK PORTB5
#define LCD_DC PORTB0
#define LCD_BL PORTD7 // Backlight control
//Nokia 3310 PinOut
#define RES 10
#define SCE 9
#define DC 8
#define SDI 7
#define SCK 6
#include <Wire.h>
#define SCE 7
#define RES 6
#define DC 5
#define SDI 4
#define SCK 3
#define backLIGHT 13
void initlcd(void); // Inicia o LCD.
void writecom(char); // Escreve o comando/comandos.
void writedata(char); // Escreve os dados para a DDRAM para iluminar os pixeis.
void clockdata(char); // Envia os dados para o controlador PCD8544.
void clearram(void); // Apaga o conteudo da DDRAM.
void cursorxy(char,char); // Posiciona o cursor em x,y.
void putchar(char); // Escreve um caracter.
void putstr(const char *); // Escreve um conjunto de caracteres.
void setup(void){
// LCD - Defenir os cinco pins como pins de output
pinMode(SCE, OUTPUT);
pinMode(RES, OUTPUT);
pinMode(DC, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SCK, OUTPUT);
initlcd(); // Iniciar o LCD
delay(100); // O datasheet pede 100ms após arrancar
//--------------------------------------------
}
void loop(){
putstr("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!");
delay(3000);
cursorxy(0,0);
cursorxy(0,0);
putstr("kilobyte");
delay(5000);
clearram();
}
ja consegui meter o meu a dar!
tens mais livrarias pela net fora ;)
Diz-se bibliotecas em portugues, é tipico passar a palavra library erradamente para libraria e não biblioteca.
#define SCE 7
#define RES 6
#define DC 5
#define SDI 4
#define SCK 3
#define backLIGHT 13 <---------------------
void initlcd(void); // Inicia o LCD.
void writecom(char); // Escreve o comando/comandos.
void writedata(char); // Escreve os dados para a DDRAM para iluminar os pixeis.
void clockdata(char); // Envia os dados para o controlador PCD8544.
void clearram(void); // Apaga o conteudo da DDRAM.
void cursorxy(char,char); // Posiciona o cursor em x,y.
void putchar(char); // Escreve um caracter.
void putstr(const char *); // Escreve um conjunto de caracteres.
Eu já estive a ver tambem e o erro é muito estranho e nâo consigo dar com nada mal no código mas não compila e dá erro em todas as funções.
Se o ecrã for igual sim.Mas por acaso era isso que estava a perguntar...
estes são os compactíveis:
Nokia 5110, 5120, 5130, 5160, 5210, 6110, 6150, 3210, 3310, 3315, 3330, 3350, 3410, 6210 (pode haver algum em falta)
há uma pequena diferença nos tipos de conectores usados, mas os pins são todos iguais. pode haver diferença no tamanho (em pixeis) destes lcds, mas isso está explicado no primeiro post.
Tenho uma questão, como é que o tr3s converteu o logo da LusoRobótica para byte? Acho que foi isso que ele fez...
Eu tinha perguntado apenas por curiosidade, mas agora que já tenho o meu lcdzinho ST7565 ando à procura de um programa que me converta imagens para esse tipo de código, e isto é para usar no arduino.
Cumpz
Boas, mas funciona? ( aparece algo no LCD?) é que eu no meu aconteceu o oposto ;D dava luz mas não apareceu nada hihiihihi.
Abraço.
Até pensei que tem leds externos ao LCD...
back-lightno meu só escurece o mete mais claro o contraste e não a luz
CitarAté pensei que tem leds externos ao LCD...
E tem. os led's estão na PCB talvez tenhas de ligar a alimentação neles.Citarback-lightno meu só escurece o mete mais claro o contraste e não a luz
Abraço.
O plastico que segura o ecra e as teclas do telemovel faz de light-pipe e mete por assim dizer luz por baixo do ecrã, tenho ideia que é isso, isso ou essa placa de plástico tinha lá dois leds, porque esse ecra em si não tem nada.
#define PIN_SCE 3
#define PIN_RESET 5
#define PIN_DC 2
#define PIN_SDIN 4
#define PIN_SCLK 6
#define LCD_C LOW
#define LCD_D HIGH
#define LCD_X 84
#define LCD_Y 48
static const byte ASCII[][5] =
{
{0x00, 0x00, 0x00, 0x00, 0x00} // 20
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e â†
,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f →
};
void LcdCharacter(char character)
{
LcdWrite(LCD_D, 0x00);
for (int index = 0; index < 5; index++)
{
LcdWrite(LCD_D, ASCII[character - 0x20][index]);
}
LcdWrite(LCD_D, 0x00);
}
void LcdClear(void)
{
for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
{
LcdWrite(LCD_D, 0x00);
}
}
void LcdInitialise(void)
{
pinMode(PIN_SCE, OUTPUT);
pinMode(PIN_RESET, OUTPUT);
pinMode(PIN_DC, OUTPUT);
pinMode(PIN_SDIN, OUTPUT);
pinMode(PIN_SCLK, OUTPUT);
digitalWrite(PIN_RESET, LOW);
digitalWrite(PIN_RESET, HIGH);
LcdWrite(LCD_C, 0x20);
LcdWrite(LCD_C, 0x0C); // LCD in normal mode. 0x0d for inverse
}
void LcdString(char *characters)
{
while (*characters)
{
LcdCharacter(*characters++);
}
}
void LcdWrite(byte dc, byte data)
{
digitalWrite(PIN_DC, dc);
digitalWrite(PIN_SCE, LOW);
shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
digitalWrite(PIN_SCE, HIGH);
}
void setup(void)
{
LcdInitialise();
LcdClear();
delay(500);
}
void loop(void)
{
LcdClear();
LcdString(" Arduino ");
delay(2000);
LcdString(" Umberto ");
delay(2000);
LcdString(" ");
LcdString(" PCD8544 ");
LcdString("Display Test");
LcdString(" 0123456789 ");
delay(2000);
}
LcdWrite(LCD_C, 0x0C); // LCD in normal mode. 0x0d for inverse
tr3s, em relacao ao teu comentario, aconselhava-te a evitar tal coisa, porque a existencia de alimentacao parasitica( ccomo se chama) e um pau de dois bicos, ja que e conhecida como "arrebenta chips", especialmente digitais, claro. Tem varias aplicacoes em casos variados mas CMOS logic chips e uC's nao te recomendo muito...mesmo que funcione o mais certo e acabar por o deitar abaixo !
Este LCD é tão bom e consome tão pouca energia que se não tiveres mais nada no circuito (2 ou 3 LEDs, etc..) nem precisas de alimentá-lo!
Boas,
andava aqui a pesquisar pelo fórum e encontrei este tópico que é aquilo que pretendia mas para PIC, li que havia a possibilidade de enviarem os ficheiros. Já tentei contactar vários administradores mas ninguém me respondeu, agradecia se me podessem enviar algo pois já ando há várias semanas a tentar meter alguma coisa no LCD e nada.
O PIC que estou a usar é o 16F877a e LCDs tenho um do cada controlador.
Já agora, se tiverem algum esquema no Proteus... já encontrei montes de esquemas diferentes e fico confuso e sem saber qual usar para não queimar o LCD.
Obrigado
Isso é igual aos da IteadStudio.O IC controlador encontra-se colado no vidro do LCD, a alimentação como toda a comunicação tem de ser via 3.3V
O ic está soldado no lcd, é um package que é colado directamente o silicio no vidro ou então no conector flexivel.
mais informação? código, esquema de ligação?amanha vou fazer mais uma tentativa se nao der posto aqui. Usando o codigo daqui adaptado em c para o 328, acham qie preciso de usar a spi?
atenção que existem dois controladores diferentes para os lcds do 3310, logo o código de um não funciona no outro.
Que confusão...Estou a usar apenas um avr Atmega328, não é no arduino, eu falei em spi porque já vi alguns tutorias para o atmega8 em que usam spi, estive a alterar o codigo e nao consegui por a dar no atmega328, deixo em anexo o codigo para se me puderem ajudar, desde já obrigado
librarias não existe, muito menos livrarias, chamam-se bibliotecas
Quando se começa a postar neste fórum, convém fazer uma apresentação em vez de pedir ajuda assim de repente
http://lusorobotica.com/index.php?board=78.0 (http://lusorobotica.com/index.php?board=78.0)
Qual a plataforma que estás a usar, arduino?!
Sabes ao menos o que é SPI é que não tem nada a ver com a comunicação dos LCDs da Nokia nem com a interface ao microcontrolador.
Há muito exemplo na net, é bom para se entender o funcionamento mas não passa daí.
PORTB=(RES>>1); // Meter o pin reset a 1
Isto não faz aquilo que pensas..Muito obrigado, já consegui finalmente, eu nao estou muito costumado a usar esta notificação a declarar os PORTB, aprendi a usar 0b0101010, o teu tutorial esta bastante porreiro obrigado.CitarPORTB=(RES>>1); // Meter o pin reset a 1
PORTB |= (1<<RES); //Res high
PORTB &= ~(1<<RES); //Res low
Aconselho que vás ler o meu tutorial sobre bitwise math (em AVR) aqui no fórum, por isso é que o teu código não funciona...
Nem sei como é que foste logo fazer isso assim, porque nem um led piscas com isso.
#define SCE 7
#define RES 6
#define DC 5
#define SDI 4
#define SCK 3
#define backLIGHT 13
void initlcd(void); // Inicia o LCD.
void writecom(char); // Escreve o comando/comandos.
void writedata(char); // Escreve os dados para a DDRAM para iluminar os pixeis.
void clockdata(char); // Envia os dados para o controlador PCD8544.
void clearram(void); // Apaga o conteudo da DDRAM.
void cursorxy(char,char); // Posiciona o cursor em x,y.
void putchr(char); // Escreve um caracter.
void putstr(const char *); // Escreve um conjunto de caracteres.
Boas,
Estou a compilar o zip de nome "NOKIA" que teem em anexo, na v 1.05-r2 mas aparecem os seguintes erros:
In file included from C:\Program Files\Arduino\hardware\arduino\cores\arduino/Arduino.h:213,
from Nokia.pde:8:
C:\Program Files\Arduino\hardware\arduino\variants\standard/pins_arduino.h:43: error: expected unqualified-id before numeric constant
Nokia:15: error: expected identifier before '(' token
Nokia:14: error: expected identifier before '(' token
nokialcd:176: error: expected identifier before '(' token
Boas, obrigado.
Ontem a noite já tinha conseguido por a trabalhar.
Entretanto sabes se esta lib. Tem caracteres maiores?
Já tentei fazer mas não consigo. Fiz a imagem em ícone, passei no lcd assistant. E copiei o código.
Meti o código num atrativos com os 9 número, mas não funciona
byte nokiamegabyte[][20] = {
0xf00 , 0x7fe0 , 0xfff0 , 0xfff8 , 0xfffc , 0xfffe , 0xfffe , 0xffff , 0xf0ff , 0xe07f , 0x207f , 0x807f , 0xf0ff , 0xffff , 0xfffe , 0xfffe , 0xfffc , 0xfff8 , 0xfff0 , 0x7fe0}
for (char i = 0; i < 20; i++){
writedata(nokiamegabyte[0][i]);
}
cursorxy(0,0); // posição do cursor
for (char c = 0; c < 4; c++){ // nova variável para a coluna
cursorxy(0,c);
for (char i = 0; i < 20; i++){
writedata(mega[c][i]); // Vai buscar o byte ao array de caracteres e envia-o para o LCD
}
}
writedata(0x00); // Espa?amento de um pixel entre cada caracter