Página 1 de 1
Display LCD Nokia 3310 com AVR

Enviado:
23 Mai 2008 17:58
por vohr56
Olá! tudo bem?
Abro este tópico pois acredito que será útil a várias pessoas.
LCD's gráficos não são tão baratos. O LCD do Nokia 3310 é fácil de encontrar e para pequenas aplicações é uma mão na roda, pois é pequeno, fácil de encontrar e relativamente barato (em torno de R$25,00).
Procurei já muita coisa na internet. Para AVR consegui encontrar alguma coisa. Porém até hoje só utilizei o CodeVision como compilador, e não manjo nada de assembler. Alguns exemplos que encontrei foram desenvolvidos em programas como ICCAVR, GCC-AVR, BASCOM.
O programa encontrado que foi escrito no ICCAVR é completo, e segundo algumas fontes na internet ele funciona. Ele pode ser visto aqui:
http://www.microsyl.com/
Este aqui segundo o usuário foi escrito no codevision:
http://www.avrfreaks.net/index.php?name ... 55&start=0
LCD do Nokia 6100:
http://thomaspfeifer.net/
Para o 8051:
http://www.kmitl.ac.th/~kswichit/8051sb ... 1sbc1.html
Exemplo de aplicação do display:
http://www.radiolocman.com/shem/schemat ... l?di=44132
Alguém do fórum já utilizou em algum projeto este display? Gostaria de ajuda para utiliza-lo em um atmega-8 ou atmega-16. Para programar utilizarei o C, se possível no codevision. Mas se necessário, adotarei outro compilador.
o projeto que desenvolverei será de um computador de bordo para moto, com medição de temperatura, nível de combustível, tensão da bateria, medidor de velocidade, rpm e outros.
Disponibilizarei o projeto aqui no fórum, por isso conto com a ajuda de todos.
Abraços!!

Enviado:
24 Mai 2008 12:41
por brasilma
Olá Colega,
Estou justamente para começar a trabalhar com display gráfico.
"Para começar" pois antes que possa começar a me divertir, tenho de concluir algumas modificações no projeto antigo (processador '51).
Só que no nosso caso a idéia é usar os display gráfico padrão mesmo, estamos pagando este mesmo valor que falou neles.
Minha intenção é desenvolver as rotinas de controle e fontes de caractere, preciso de uma bem pequena 5x3.
As rotinas de controle serão inicialmente apenas para "printar" caracteres e bmps, e traçar linhas.
Creio que poderemos trocar idéias.
Abraços.

Enviado:
24 Mai 2008 12:50
por vohr56
brasilma escreveu:Olá Colega,
Estou justamente para começar a trabalhar com display gráfico.
"Para começar" pois antes que possa começar a me divertir, tenho de concluir algumas modificações no projeto antigo (processador '51).
Só que no nosso caso a idéia é usar os display gráfico padrão mesmo, estamos pagando este mesmo valor que falou neles.
Minha intenção é desenvolver as rotinas de controle e fontes de caractere, preciso de uma bem pequena 5x3.
As rotinas de controle serão inicialmente apenas para "printar" caracteres e bmps, e traçar linhas.
Creio que poderemos trocar idéias.
Abraços.
Olá Brasilma!!
A minha intenção é esta também, a de desenvolver o próprio código para o display. Não tenho a mínima noção de como o micro se comunica com o LCD, mas quero aprender, pois aí fica fácil desenvolver rotinas para outros displays também e para micros diferentes.
O display gráfico que vocês estão utilizando possui qual tamanho? Mas voês compraram em quantidade maior?
Eu gostaria de utilizar o display do 3310 porque no projeto do computador de bordo para a moto ele cabe certinho no lugar do marcador de combustível. Talvez um GLCD de 128*128 não caiba.
Com certeza trocaremos idéias.
Abraços!!!

Enviado:
29 Mai 2008 12:42
por brasilma
Olá Vohr,
Os displays gráficos em termos de recursos são mais "pobres" que os de caracteres comuns, ou seja, você deve fazer uma parte do serviço que os outros fazem sózinhos, com aumento do código e memórias consumidas, porem ganha-se em flexibilidade.
O chip de controle deles geralmente é compativel com o KS0108, então é interessante baixar o data-sheet desse carinha.
O display é o 128 x 64 padrão, este preço é para 100 peças ou mais.
Abraços.

Enviado:
14 Jul 2008 13:05
por gafar
vohr56
já usei os displays:
3310 com AVR (codevision) e 8051 assembler registrador grafico de temperatura com 15 horas de registro usando o LM35.
O 6100 com AMR e AVR.
O Cx65 de celular Siemens com AVR e ARM.

Enviado:
29 Jul 2008 17:15
por brasilma
Já estou a vontado com o GLCD, no momento estou fazendo experiências para definir as fontes mais adequadas ao projeto.
Display LCD Nokia

Enviado:
22 Out 2008 13:50
por compredosul
Olá pessoal...
A um tempão atrás eu implementei um circuito com LCD do Nokia 5120, e lembro que na época funcionou legal, porém eu usei Atmega32 e Atmega8 para os testes.
No meio da minha biblioteca particular localizei o código em C que talvez possa ajudá-los, afinal a estrutura do código será a mesma bastando interpretá-lo e adequar ao microcontrolador que pretende usar.
Lembro também que usei um programa chamado FastLCD para converter um .BMP em string para mandar para o LCD, pelo nome você devem encontrá-lo para download.
/***********
V2.02: >> 03/04/06
Simplismente modificado o modo de apresentação da versão na inicialização
************/
#include <mega8.h>
//#include <gray.h)
//#include <string.h>
//#include <stdio.h>
#include <delay.h>
//#include <math.h>
#define cs PORTB.7
#define dc PORTB.6
#define reset PORTD.5
#define scl PORTD.0
#define sda PORTD.1
/*#define apaga_scl PORTC.3=0
#define seta_scl PORTC.4=1
#define seta_sda PORTC.5=0
#define apaga_sda PORTC.6=1
*/
flash char iniciar[4]={0x21,0x90,0x20,0xE};
//flash char iniciar[5]={0x21,0xC5,0x13,0x20,0x09};//Constante de inicialização
//Constante da imagem
flash char grafico1[84]={0x00,0x00,0x00,0xFC,0x18,0x60,0x80,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x38,0x44,0x44,0x44,0x84,0x84,0x18,0x00,0x00,0xFC,0x84,0x84,0x84,0x84,0x84,0x78,0x00,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x08,0x04,0x44,0x44,0x44,0xB8,0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,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
};
flash char grafico2[84]={0x00,0x00,0x00,0x8F,0x80,0x80,0x83,0x0C,0x03,0x00,0x80,0x8F,0x80,0x80,0x06,0x08,0x08,0x88,0x88,0x88,0x87,0x80,0x00,0x0F,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x02,0x0F,0x02,0x00,0x04,0x08,0x08,0x08,0x08,0x07,0x00,0x07,0x08,0x08,0x08,0x08,0x07,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
};
flash char grafico3[84]={0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x40,0x40,0x40
};
flash char grafico4[84]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00
};
flash char grafico5[84]={0x00,0x00,0x80,0x40,0x30,0x0C,0x02,0x01,0xFF,0x80,0x40,0x30,0x0C,0x02,0x01,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0xC0,0x30,0x0C,0x03,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0x00,0xE0,0x18,0x07,0x0F,0xF0,0xC0,0x30,0x0C,0x03,0xFF,0xC0,0x30,0x0C,0x03,0x0F,0xF0,0xC0,0x30,0x0C,0x03,0x00,0xFF,0x00,0xC0,0x30,0x0C,0x03,0x00,0xFF,0x00,0x00,0x00
};
flash char grafico6[84]={ 0xFF,0x80,0x70,0x80,0xFF, 0x7E, 0x11, 0x11, 0x11, 0x7E,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00
};
//Constante de caracteres
flash char FontLookup[91,5] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
{ 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{ 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{ 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{ 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{ 0xc4, 0xc8, 0x10, 0x26, 0x46 }, // %
{ 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{ 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{ 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{ 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{ 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{ 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{ 0x00, 0x00, 0x50, 0x30, 0x00 }, // ,
{ 0x10, 0x10, 0x10, 0x10, 0x10 }, // -
{ 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{ 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{ 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{ 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{ 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{ 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{ 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{ 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{ 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{ 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{ 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{ 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{ 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{ 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
{ 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{ 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{ 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{ 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{ 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{ 0x7E, 0x11, 0x11, 0x11, 0x7E }, // A
{ 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{ 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{ 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{ 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{ 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{ 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{ 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{ 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{ 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{ 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{ 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{ 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{ 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{ 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{ 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{ 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{ 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{ 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{ 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{ 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{ 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{ 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{ 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{ 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{ 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{ 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{ 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
{ 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{ 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{ 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{ 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{ 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{ 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{ 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{ 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{ 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{ 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{ 0x0C, 0x52, 0x52, 0x52, 0x3E }, // g
{ 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{ 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{ 0x20, 0x40, 0x44, 0x3D, 0x00 }, // j
{ 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{ 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{ 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{ 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{ 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{ 0x7C, 0x14, 0x14, 0x14, 0x08 }, // p
{ 0x08, 0x14, 0x14, 0x18, 0x7C }, // q
{ 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{ 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{ 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{ 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{ 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{ 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{ 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{ 0x0C, 0x50, 0x50, 0x50, 0x3C }, // y
{ 0x44, 0x64, 0x54, 0x4C, 0x44 } // z
};
//Funções em geral
void Reiniciar(void);
void nokia_write(unsigned char dado);
void nokia_write_comando(void);
void nokia_write_data(void);
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x30;
// Place your code here
}
void main(void)
{
// Input/Output Ports initialization
// Port B initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=Out
// State0=T State1=T State2=T State3=T State4=T State5=T State6=0
PORTC=0x00;
DDRC=0x40;
// Port D initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 62,500 kHz
TCCR0=0x04;
TCNT0=0x30;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;//1
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
reset=1;
// delay_ms(1);
reset=0;
nokia_write_comando();
while(1)
{
nokia_write_data();
delay_ms(500);
}
}//MAIN
void Reiniciar(void)
{
#asm("RJMP __RESET"); // Reset !!!
}
void nokia_write(unsigned char dado)
{
// envia um byte pelo barramento
int conta=8;
scl=0; // coloca SCL em 0
while (conta)
{
// envia primeiro o MSB
if (shift_left(&dado,1,0)) seta_sda; else apaga_sda;
// dá um pulso em scl
seta_scl;
conta--;
apaga_scl;
}
// seta_sda;
}
void nokia_write_comando(void)
{
unsigned int8 conta=0;
while(conta<4){
output_low(dc);
output_low(cs);
nokia_write(iniciar[conta]);
output_high(cs);
conta++;
}
}
/////////////////////////////////////////////////////////////////////////////////
void nokia_write_data(void)
{
unsigned int16 conta;
while(conta<83){
output_high(dc);
output_low(cs);
nokia_write(grafico1[conta]);
output_high(cs);
conta++;
}
conta=0;
while(conta<83){
output_high(dc);
output_low(cs);
nokia_write(grafico2[conta]);
output_high(cs);
conta++;
}
conta=0;
while(conta<83){
output_high(dc);
output_low(cs);
nokia_write(grafico3[conta]);
output_high(cs);
conta++;
}
conta=0;
while(conta<83){
output_high(dc);
output_low(cs);
nokia_write(grafico4[conta]);
output_high(cs);
conta++;
}
conta=0;
while(conta<83){
output_high(dc);
output_low(cs);
nokia_write(grafico5[conta]);
output_high(cs);
conta++;
}
conta=0;
while(conta<83){
output_high(dc);
output_low(cs);
nokia_write(grafico6[conta]);
output_high(cs);
conta++;
}
}

Enviado:
22 Out 2008 20:42
por vohr56
Amigo compredosul, muito obrigado pela sua contribuição!! Vou procurar o display pra testar o código!!
Só achei estranho a parte output_high(dc)! No ccs pra pic se utiliza assim! No avr não sabia que tinha isso.
Display LCD Nokia 3310 com AVR Atmel

Enviado:
23 Out 2008 10:52
por compredosul
vohr56 escreveu:Amigo compredosul, muito obrigado pela sua contribuição!! Vou procurar o display pra testar o código!!
Só achei estranho a parte output_high(dc)! No ccs pra pic se utiliza assim! No avr não sabia que tinha isso.
Olá amigo... eu uso o compilador Code Vision, lembro que compilei e rodou tranquilo.
output_high(dc); >> o dc de dentro do parênteses é uma definição para a porta B.6 (#define dc PORTB.6)
output_low(cs); >> o cs de dentro do parênteses é uma definição para a porta B.7 (#define cs PORTB.7)
Bons estudos!!

Enviado:
23 Out 2008 17:36
por vohr56
Estranho, acabei de compilar aqui no codevision e este comando não funcionou. Estou utilizando o Codevision 1.24.8d.

Enviado:
23 Out 2008 17:39
por vohr56
Mas este comando é fácil de se substituir:
output_high(dc);
por
dc=1;

Enviado:
23 Out 2008 20:51
por vohr56
Modifiquei algumas coisas e olha o resultado:
/********************************************************************************************************************
V2.02: >> 03/04/06
Simplismente modificado o modo de apresentação da versão na inicialização
********************************************************************************************************************/
#include <mega8.h>
#include <delay.h>
//#include <gray.h>
//#include <string.h>
//#include <stdio.h>
//#include <math.h>
#define cs PORTB.7
#define dc PORTB.6
#define reset PORTD.5
#define scl PORTD.0
#define sda PORTD.1
#define apaga_scl PORTC.3=0
#define seta_scl PORTC.4=1
#define seta_sda PORTC.5=0
#define apaga_sda PORTC.6=1
flash char iniciar[4]={0x21,0x90,0x20,0xE};
//flash char iniciar[5]={0x21,0xC5,0x13,0x20,0x09};//Constante de inicialização
//Constante da imagem
flash char grafico1[84]={0x00,0x00,0x00,0xFC,0x18,0x60,0x80,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x38,0x44,0x44,0x44,0x84,0x84,0x18,0x00,0x00,0xFC,0x84,0x84,0x84,0x84,0x84,0x78,0x00,0x00,0x80,0x60,0x18,0xFC,0x00,0x00,0x08,0x04,0x44,0x44,0x44,0xB8,0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,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
};
flash char grafico2[84]={0x00,0x00,0x00,0x8F,0x80,0x80,0x83,0x0C,0x03,0x00,0x80,0x8F,0x80,0x80,0x06,0x08,0x08,0x88,0x88,0x88,0x87,0x80,0x00,0x0F,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x02,0x0F,0x02,0x00,0x04,0x08,0x08,0x08,0x08,0x07,0x00,0x07,0x08,0x08,0x08,0x08,0x07,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
};
flash char grafico3[84]={0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x40,0x7F,0x01,0x01,0x01,0x01,0x01,0x7F,0x40,0x40,0x40,0x40,0x40,0x40
};
flash char grafico4[84]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00
};
flash char grafico5[84]={0x00,0x00,0x80,0x40,0x30,0x0C,0x02,0x01,0xFF,0x80,0x40,0x30,0x0C,0x02,0x01,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0xC0,0x30,0x0C,0x03,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0x80,0x60,0x18,0x06,0x01,0xFF,0x00,0xE0,0x18,0x07,0x0F,0xF0,0xC0,0x30,0x0C,0x03,0xFF,0xC0,0x30,0x0C,0x03,0x0F,0xF0,0xC0,0x30,0x0C,0x03,0x00,0xFF,0x00,0xC0,0x30,0x0C,0x03,0x00,0xFF,0x00,0x00,0x00
};
flash char grafico6[84]={ 0xFF,0x80,0x70,0x80,0xFF, 0x7E, 0x11, 0x11, 0x11, 0x7E,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00
};
//Constante de caracteres
flash char FontLookup[91,5] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp
{ 0x00, 0x00, 0x2f, 0x00, 0x00 }, // !
{ 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
{ 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #
{ 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $
{ 0xc4, 0xc8, 0x10, 0x26, 0x46 }, // %
{ 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
{ 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
{ 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (
{ 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )
{ 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
{ 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
{ 0x00, 0x00, 0x50, 0x30, 0x00 }, // ,
{ 0x10, 0x10, 0x10, 0x10, 0x10 }, // -
{ 0x00, 0x60, 0x60, 0x00, 0x00 }, // .
{ 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
{ 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0
{ 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1
{ 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2
{ 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3
{ 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4
{ 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5
{ 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6
{ 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7
{ 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8
{ 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9
{ 0x00, 0x36, 0x36, 0x00, 0x00 }, // :
{ 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
{ 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
{ 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
{ 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
{ 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
{ 0x32, 0x49, 0x59, 0x51, 0x3E }, // @
{ 0x7E, 0x11, 0x11, 0x11, 0x7E }, // A
{ 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
{ 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
{ 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
{ 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
{ 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
{ 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
{ 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
{ 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
{ 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
{ 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
{ 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
{ 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
{ 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
{ 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
{ 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P
{ 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
{ 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
{ 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
{ 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
{ 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
{ 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
{ 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W
{ 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
{ 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
{ 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
{ 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
{ 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55
{ 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
{ 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
{ 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
{ 0x00, 0x01, 0x02, 0x04, 0x00 }, // '
{ 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
{ 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b
{ 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
{ 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
{ 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
{ 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
{ 0x0C, 0x52, 0x52, 0x52, 0x3E }, // g
{ 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
{ 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
{ 0x20, 0x40, 0x44, 0x3D, 0x00 }, // j
{ 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
{ 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
{ 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
{ 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
{ 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
{ 0x7C, 0x14, 0x14, 0x14, 0x08 }, // p
{ 0x08, 0x14, 0x14, 0x18, 0x7C }, // q
{ 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
{ 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
{ 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
{ 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
{ 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
{ 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
{ 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
{ 0x0C, 0x50, 0x50, 0x50, 0x3C }, // y
{ 0x44, 0x64, 0x54, 0x4C, 0x44 } // z
};
/*******************************************************************************************************************/
//Funções em geral
void Reiniciar(void);
void nokia_write(unsigned char dado);
void nokia_write_comando(void);
void nokia_write_data(void);
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x30;
// Place your code here
}
/*******************************************************************************************************************/
/********************************************************************************************************************
**************************************** Função principal ***********************************************************
********************************************************************************************************************/
void main(void)
{
// Input/Output Ports initialization
// Port B initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0
PORTB=0x00;
DDRB=0xFF;
// Port C initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=Out
// State0=T State1=T State2=T State3=T State4=T State5=T State6=0
PORTC=0x00;
DDRC=0x40;
// Port D initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 62,500 kHz
TCCR0=0x04;
TCNT0=0x30;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;//1
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
reset=1;
// delay_ms(1);
reset=0;
nokia_write_comando();
while(1)
{
nokia_write_data();
delay_ms(500);
}
}
/********************************************************************************************************************
**************************************** Fim da função principal ****************************************************
********************************************************************************************************************/
/*******************************************************************************************************************/
void Reiniciar(void)
{
#asm("RJMP __RESET"); // Reset !!!
}
/*******************************************************************************************************************/
/*******************************************************************************************************************/
void nokia_write(unsigned char dado)
{
// envia um byte pelo barramento
int conta=8;
scl=0; // coloca SCL em 0
while (conta)
{
//envia primeiro o MSB
if ( shift_left(&dado,1,0))
seta_sda;
else
apaga_sda;
// dá um pulso em scl
seta_scl;
conta--;
apaga_scl;
}
// seta_sda;
}
/*******************************************************************************************************************/
/*******************************************************************************************************************/
void nokia_write_comando(void)
{
unsigned int conta=0;
while(conta<4)
{
dc=0;
cs=0;
nokia_write(iniciar[conta]);
cs=1;
conta++;
}
}
/*******************************************************************************************************************/
/*******************************************************************************************************************/
void nokia_write_data(void)
{
unsigned int conta;
while(conta<83)
{
dc=1;
cs=0;
nokia_write(grafico1[conta]);
cs=1;
conta++;
}
conta=0;
while(conta<83)
{
dc=1;
cs=0;
nokia_write(grafico2[conta]);
cs=1;
conta++;
}
conta=0;
while(conta<83)
{
dc=1;
cs=0;
nokia_write(grafico3[conta]);
cs=1;
conta++;
}
conta=0;
while(conta<83)
{
dc=1;
cs=0;
nokia_write(grafico4[conta]);
cs=1;
conta++;
}
conta=0;
while(conta<83)
{
dc=1;
cs=0;
nokia_write(grafico5[conta]);
cs=1;
conta++;
}
conta=0;
while(conta<83)
{
dc=1;
cs=0;
nokia_write(grafico6[conta]);
cs=1;
conta++;
}
}
/*******************************************************************************************************************/
O codevision continua dando erro em:
//envia primeiro o MSB
if ( shift_left(&dado,1,0))
seta_sda;
else
apaga_sda;
Ele não intendeu o shift_left e não reconheceu a condição do if.
Também não consegui declarar isto:
unsigned int8 conta=0;
e
unsigned int16 conta=0;
deixei como unsigned int somente.