LCD - PORTB

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

LCD - PORTB

Mensagempor roquetti » 08 Ago 2011 20:43

Srs, boa noite,

Estou tentando usar a porta PORTB com LCD, PIC18F4550, já usei C18 e MikroC, mas só consigo escrever na PORTD, PORTB nem a pau, obs:

LVP - OFF
MCLR - OFF
PORTB - digital
HS
20MHZ

// CONFIGURA PORTAS
TRISA = 0b000000; // outros pinos saida
TRISB = 0b00000000; // portb como saida
TRISC = 0b00000001; // RA0 entrada, outros pinos saida
TRISD = 0b00000000; // portd como saida
TRISE = 0b100; // RE2 entrada, outros pinos saida

// LIMPA PORTAS
PORTA = 0b000000;// limpa porta
PORTB = 0b00000000;// limpa portb
PORTC = 0b00000000;// limpa portc
PORTD = 0b00000000;// limpa portd
PORTE = 0b000;// limpa porte

// CONFIGURA REGISTRADORES
// interrupçao
RCONbits.IPEN = 0; // desabilita as interrupçoes globalmente
INTCON = 0b01000000; // habilita interrupçao perifeicos e GIE e timer0 inicia desabilitado

// pull-up desabilitado
INTCON2bits.RBPU = 1; // configura pull-up desabilitado portb
PORTEbits.RDPU = 0; // configura pull-up desabilitado portd


// porta digital ou analogica
CMCON = 0b0000111; // COMPARADORES DESABILITADOS
ADCON1 = 0b00001111; // configura digital
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor ÁgioFelipe » 08 Ago 2011 23:44

Qual a biblioteca de LCD vc está usando no C18?
ÁgioFelipe
Word
 
Mensagens: 626
Registrado em: 27 Out 2006 20:04

Mensagempor roquetti » 08 Ago 2011 23:48

ÁgioFelipe escreveu:Qual a biblioteca de LCD vc está usando no C18?



Do livro do Alberto Noboru, adaptada
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor roquetti » 09 Ago 2011 08:44

O CUSCOPIC é PORTB o LCD, ainda não entendi o porque não estou conseguindo
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor Djalma Toledo Rodrigues » 09 Ago 2011 12:53

Faça uma pausa no LCD e testa

<Escrita Porta B>

Trisa, tristb, trisc ...
como são xatos os Pics

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor ze » 10 Ago 2011 07:21

talvez na interrupção esteja fazendo alguma cagada.
use simulador ou o proprio mplab pra ver os sinais do port. rode passo a passo. etc (este resolve)
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Andre_Cruz » 10 Ago 2011 08:37

roquetti,

Na lógica do seu programa em algum momento depois da inicialização do PIC e do LCD você não esta escrevendo no PORTB ? Pode ser uma sugestão boba mas pode acontecer.

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor roquetti » 10 Ago 2011 13:08

inacreditável, no protoboard estava sem contato no PINO RB4, vou procurar o erro na placa deve ter algum erro no PORTB na placa coisa física, é muita coincidência 2 erros de mau contato no mesmo PORT, e depois olha em todos os livros não usam portB para LCD somente PORTD, eita! 3 dias perdidos!
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor Djalma Toledo Rodrigues » 10 Ago 2011 14:32

roquetti escreveu:... e depois olha em todos os livros não usam portB para LCD somente PORTD, eita! 3 dias perdidos!

Certamente não usam porque 3 pinos de PortB estão os PGs

PGM , PGC, PGD

Ver Datasheet

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor ÁgioFelipe » 10 Ago 2011 15:38

Eu também uso essa biblioteca, posta ela pra vermos quais as mudanças vc fez!
ÁgioFelipe
Word
 
Mensagens: 626
Registrado em: 27 Out 2006 20:04

Mensagempor roquetti » 10 Ago 2011 22:41

ÁgioFelipe escreveu:Eu também uso essa biblioteca, posta ela pra vermos quais as mudanças vc fez!



/*********************************************************************************************************
******************************************BIBLIOTECA DISPLAY LCD******************************************
** *
** Esta biblioteca contém as funções de controle do display LCD. *
** *
** Livro: Microcontroladores PIC18 - Aprenda e Programe em Linguagem C. *
** Autor: Paulo Roquetti (modificacoes de pinos - livro Alberto Noboru) *
** Versão: v0.1 *
** Data: 08/08/2011 *
*********************************************************************************************************/

#include<delays.h> //Adiciona a biblioteca de delay.

#ifndef Fosc
#define Fosc 20 //Define a frequência do oscilador. Este valor deve corresponder a frequência do oscilador utilizado pelo PIC18.
#endif
// Os nome definidos são os próprios nomes dos pinos do display LCD.
#define B7 PORTBbits.RB5 //Define o nome B7 para a estrutra.
#define E_B7 TRISBbits.TRISB5=1;
#define S_B7 TRISBbits.TRISB5=0;
#define B6 PORTBbits.RB4 //Define o nome B6 para a estrutra.
#define E_B6 TRISBbits.TRISB4=1;
#define S_B6 TRISBbits.TRISB4=0;
#define B5 PORTBbits.RB3 //Define o nome B5 para a estrutra.
#define E_B5 TRISBbits.TRISB3=1;
#define S_B5 TRISBbits.TRISB3=0;
#define B4 PORTBbits.RB2 //Define o nome B4 para a estrutra.
#define E_B4 TRISBbits.TRISB2=1;
#define S_B4 TRISBbits.TRISB2=0;
#define E PORTEbits.RE0 //Define o nome E para a estrutra.
#define E_E TRISEbits.TRISE0=1;
#define S_E TRISEbits.TRISE0=0;
#define RW PORTBbits.RB7//Define o nome RW para a estrutra.
#define E_RW TRISBbits.TRISB7=1;
#define S_RW TRISBbits.TRISB7=0;
#define RS PORTEbits.RE1 //Define o nome RS para a estrutra.
#define E_RS TRISEbits.TRISE1=1;
#define S_RS TRISEbits.TRISE1=0;

void gera_atraso_us(unsigned int atraso)//adaptado para Fosc de 20MHz
{
do
{
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.

atraso--;
}while (atraso>0);
}

unsigned char lcd_envia_controle (unsigned char instrucao_dado, unsigned int escrita_leitura, unsigned char dado, unsigned int atraso_us)
{
/*
instrucao_dado = 0 //Instrução.
instrucao_dado = 1 //Dado.
escrita_leitura = 1 //Leitura.
escrita_leitura = 0 //Escrita.
*/
unsigned char dado_entrada=0;

//Configura os pinos de dados/controle, como saída.
S_B7;
S_B6;
S_B5;
S_B4;
S_E;
S_RW;
S_RS;

RS = instrucao_dado; //Informa se é um comando ou dado.
RW = escrita_leitura; //Informa se é escrita ou leitura.

if(escrita_leitura == 0)
{
B7 = dado>>7;//B7 recebe o bit 7 da variável dado.
B6 = dado>>6;//B6 recebe o bit 6 da variável dado.
B5 = dado>>5;//B5 recebe o bit 5 da variável dado.
B4 = dado>>4;//B4 recebe o bit 4 da variável dado.

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.
E = 0; //Desabilita o Display LCD.

B7 = dado>>3;//B7 recebe o bit 3 da variável dado.
B6 = dado>>2;//B6 recebe o bit 2 da variável dado.
B5 = dado>>1;//B5 recebe o bit 1 da variável dado.
B4 = dado;//B4 recebe o bit 0 da variável dado.

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.
E = 0; //Desabilita o Display LCD.

gera_atraso_us(atraso_us); //Gera um delay de xus. MAX 255 ciclos de máquina

return 0;
}
else
{
//Configura os pinos de dados, como entrada.
E_B7;
E_B6;
E_B5;
E_B4;

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.

dado_entrada = B7;
dado_entrada = dado_entrada<<1 | B6;
dado_entrada = dado_entrada<<1 | B5;
dado_entrada = dado_entrada<<1 | B4;

E = 0; //Desabilita o Display LCD.
E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.

dado_entrada = dado_entrada<<1 | B7;
dado_entrada = dado_entrada<<1 | B6;
dado_entrada = dado_entrada<<1 | B5;
dado_entrada = dado_entrada<<1 | B4;

E = 0; //Desabilita o Display LCD.

gera_atraso_us(atraso_us); //Gera um delay de xus. MAX 255 ciclos de máquina

return dado_entrada;
}
}

//Limpa a tela e coloca o cursor na linha um e coluna um do display.
void lcd_limpa_tela ( )
{
lcd_envia_controle (0,0,0x01,2000);
}

//Coloca o cursor na linha um e coluna um do display.
void lcd_cursor_home ( )
{
lcd_envia_controle (0,0,0x02,2000);
}

//Desloca o cursor para a direita ou esquerda.
void lcd_desloca_cursor(unsigned char direita_esquerda)
{
/*
0 - Desloca o cursor para a direita.
1 - Desloca o cursor para a esquerda.
*/
unsigned char cursor[2] = {0x14, 0x10};
lcd_envia_controle (0,0,cursor[direita_esquerda],40);
}

//Desloca a mensagem para a direita ou esquerda.
void lcd_desloca_mensagem(unsigned char direita_esquerda)
{
/*
0 - Desloca a mensagem para a direita.
1 - Desloca a mensagem para a esquerda.
*/
unsigned char cursor[2] = {0x1c, 0x18};
lcd_envia_controle (0,0,cursor[direita_esquerda],40);
}

//Liga/Desliga o cursor/display.
void lcd_LD_cursor (unsigned char config)
{
/*
0 - Desliga o cursor.
1 - Desliga o display.
2 - Liga o cursor com alternância.
3 - Liga o display e o cursor.
4 - Liga o display e o cursor piscante.
*/
unsigned char cursor [5] = {0x0c, 0x08, 0x0f, 0x0e, 0x0d};
lcd_envia_controle (0,0,cursor[config],40);
}

//Coloca o cursor em uma determinada posição do LCD.
void lcd_posicao(unsigned char linha, unsigned char coluna)
{
switch (linha)
{
case 1:
lcd_envia_controle (0,0,0x80+coluna-1,40);
break;
case 2:
lcd_envia_controle (0,0,0xc0+coluna-1,40);
break;
case 3:
lcd_envia_controle (0,0,0x94+coluna-1,40);
break;
case 4:
lcd_envia_controle (0,0,0xd4+coluna-1,40);
break;
}
}

//Escreve um caractere ou símbolo no display.
void lcd_escreve_dado(unsigned char dado)
{
lcd_envia_controle (1,0,dado,45);
}

//Retorna o caractere presente na posição do cursor.
unsigned char lcd_le_dado( )
{
return lcd_envia_controle (1,1,0,45);
}

//Retorna o valor do status + contador de endereço.
unsigned char lcd_status ( )
{
return lcd_envia_controle (0,1,0,40);
}

//Envia String para o Display LCD.
void imprime_string_lcd(const rom char *s_caracteres)
{
while (*s_caracteres!=0)
{
lcd_escreve_dado(*s_caracteres);
s_caracteres++;
}
}

//Envia uma matriz de dados para o Display LCD.
void imprime_buffer_lcd( char *s_caracteres, unsigned char tamanho_buffer)
{
while (tamanho_buffer--)
{
lcd_escreve_dado(*s_caracteres);
s_caracteres++;
}
}

//Inicializa o display LCD alfanumérico.
void lcd_inicia( unsigned char conf1, unsigned char conf2, unsigned char conf3)
{
/*
Configuração do display LCD:

(0x28)
- Comunicação 4 vias
- Display com 2 linhas
- Matriz 8x5

(0x0f)
- Liga display
- Cursor piscante

(0x06)
- Desloca o cursor para a direita quando um caractere for inserido.
*/
unsigned char config_LCD[6] = {0x03, 0x02, 0x00, 0x00, 0x00};
unsigned char repeticao;

config_LCD[2] = conf1;
config_LCD[3] = conf2;
config_LCD[4] = conf3;

//Configura os pinos de dados/controle, como saída.
S_B7;
S_B6;
S_B5;
S_B4;
S_E;
S_RW;
S_RS;

RS = 0; //Instrução.
RW = 0; //Escrita.
E = 0; //Desabilita LCD.

gera_atraso_us(20000); //Gera um atraso de 20ms.

for( repeticao = 0 ; repeticao < 3 ; repeticao++ )
{
B7 = config_LCD[0]>>3; //B7 recebe o bit 3 do elemento presente na posição 0 da matriz config_LCD.
B6 = config_LCD[0]>>2; //B6 recebe o bit 2 do elemento presente na posição 0 da matriz config_LCD.
B5 = config_LCD[0]>>1; //B5 recebe o bit 1 do elemento presente na posição 0 da matriz config_LCD.
B4 = config_LCD[0]; //B4 recebe o bit 0 do elemento presente na posição 0 da matriz config_LCD.

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.
E = 0; //Desabilita o Display LCD.

gera_atraso_us(5000); //Gera um delay de 5ms.
}

B7 = config_LCD[1]>>3; //B7 recebe o bit 3 do elemento presente na posição 1 da matriz config_LCD.
B6 = config_LCD[1]>>2; //B6 recebe o bit 2 do elemento presente na posição 1 da matriz config_LCD.
B5 = config_LCD[1]>>1; //B5 recebe o bit 1 do elemento presente na posição 1 da matriz config_LCD.
B4 = config_LCD[1]; //B4 recebe o bit 0 do elemento presente na posição 1 da matriz config_LCD.

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.
E = 0; //Desabilita o Display LCD.

gera_atraso_us(40); //Gera um delay de 40us.

lcd_envia_controle (0,0,config_LCD[2],40);
lcd_envia_controle (0,0,config_LCD[3],40);
lcd_envia_controle (0,0,config_LCD[4],40);

lcd_limpa_tela ( );

}
Editado pela última vez por roquetti em 10 Ago 2011 23:10, em um total de 1 vez.
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor roquetti » 10 Ago 2011 22:42

ÁgioFelipe escreveu:Eu também uso essa biblioteca, posta ela pra vermos quais as mudanças vc fez!



/*********************************************************************************************************
******************************************BIBLIOTECA DISPLAY LCD******************************************
** *
** Esta biblioteca contém as funções de controle do display LCD. *
** *
** Livro: Microcontroladores PIC18 - Aprenda e Programe em Linguagem C. *
** Autor: Paulo Roquetti (adaptacao do livro do Alberto Noboru) *
** Versão: v0.1 *
** Data: 08/08/2011 *
*********************************************************************************************************/

#include<delays.h> //Adiciona a biblioteca de delay.

#ifndef Fosc
#define Fosc 20 //Define a frequência do oscilador. Este valor deve corresponder a frequência do oscilador utilizado pelo PIC18.
#endif
// Os nome definidos são os próprios nomes dos pinos do display LCD.
#define B7 PORTBbits.RB5 //Define o nome B7 para a estrutra.
#define E_B7 TRISBbits.TRISB5=1;
#define S_B7 TRISBbits.TRISB5=0;
#define B6 PORTBbits.RB4 //Define o nome B6 para a estrutra.
#define E_B6 TRISBbits.TRISB4=1;
#define S_B6 TRISBbits.TRISB4=0;
#define B5 PORTBbits.RB3 //Define o nome B5 para a estrutra.
#define E_B5 TRISBbits.TRISB3=1;
#define S_B5 TRISBbits.TRISB3=0;
#define B4 PORTBbits.RB2 //Define o nome B4 para a estrutra.
#define E_B4 TRISBbits.TRISB2=1;
#define S_B4 TRISBbits.TRISB2=0;
#define E PORTEbits.RE0 //Define o nome E para a estrutra.
#define E_E TRISEbits.TRISE0=1;
#define S_E TRISEbits.TRISE0=0;
#define RW PORTBbits.RB7//Define o nome RW para a estrutra.
#define E_RW TRISBbits.TRISB7=1;
#define S_RW TRISBbits.TRISB7=0;
#define RS PORTEbits.RE1 //Define o nome RS para a estrutra.
#define E_RS TRISEbits.TRISE1=1;
#define S_RS TRISEbits.TRISE1=0;

void gera_atraso_us(unsigned int atraso)//adaptado para Fosc de 20MHz
{
do
{
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.
Delay1TCY (); //Gera um delay de 1 ciclo de máquina.

atraso--;
}while (atraso>0);
}

unsigned char lcd_envia_controle (unsigned char instrucao_dado, unsigned int escrita_leitura, unsigned char dado, unsigned int atraso_us)
{
/*
instrucao_dado = 0 //Instrução.
instrucao_dado = 1 //Dado.
escrita_leitura = 1 //Leitura.
escrita_leitura = 0 //Escrita.
*/
unsigned char dado_entrada=0;

//Configura os pinos de dados/controle, como saída.
S_B7;
S_B6;
S_B5;
S_B4;
S_E;
S_RW;
S_RS;

RS = instrucao_dado; //Informa se é um comando ou dado.
RW = escrita_leitura; //Informa se é escrita ou leitura.

if(escrita_leitura == 0)
{
B7 = dado>>7;//B7 recebe o bit 7 da variável dado.
B6 = dado>>6;//B6 recebe o bit 6 da variável dado.
B5 = dado>>5;//B5 recebe o bit 5 da variável dado.
B4 = dado>>4;//B4 recebe o bit 4 da variável dado.

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.
E = 0; //Desabilita o Display LCD.

B7 = dado>>3;//B7 recebe o bit 3 da variável dado.
B6 = dado>>2;//B6 recebe o bit 2 da variável dado.
B5 = dado>>1;//B5 recebe o bit 1 da variável dado.
B4 = dado;//B4 recebe o bit 0 da variável dado.

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.
E = 0; //Desabilita o Display LCD.

gera_atraso_us(atraso_us); //Gera um delay de xus. MAX 255 ciclos de máquina

return 0;
}
else
{
//Configura os pinos de dados, como entrada.
E_B7;
E_B6;
E_B5;
E_B4;

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.

dado_entrada = B7;
dado_entrada = dado_entrada<<1 | B6;
dado_entrada = dado_entrada<<1 | B5;
dado_entrada = dado_entrada<<1 | B4;

E = 0; //Desabilita o Display LCD.
E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.

dado_entrada = dado_entrada<<1 | B7;
dado_entrada = dado_entrada<<1 | B6;
dado_entrada = dado_entrada<<1 | B5;
dado_entrada = dado_entrada<<1 | B4;

E = 0; //Desabilita o Display LCD.

gera_atraso_us(atraso_us); //Gera um delay de xus. MAX 255 ciclos de máquina

return dado_entrada;
}
}

//Limpa a tela e coloca o cursor na linha um e coluna um do display.
void lcd_limpa_tela ( )
{
lcd_envia_controle (0,0,0x01,2000);
}

//Coloca o cursor na linha um e coluna um do display.
void lcd_cursor_home ( )
{
lcd_envia_controle (0,0,0x02,2000);
}

//Desloca o cursor para a direita ou esquerda.
void lcd_desloca_cursor(unsigned char direita_esquerda)
{
/*
0 - Desloca o cursor para a direita.
1 - Desloca o cursor para a esquerda.
*/
unsigned char cursor[2] = {0x14, 0x10};
lcd_envia_controle (0,0,cursor[direita_esquerda],40);
}

//Desloca a mensagem para a direita ou esquerda.
void lcd_desloca_mensagem(unsigned char direita_esquerda)
{
/*
0 - Desloca a mensagem para a direita.
1 - Desloca a mensagem para a esquerda.
*/
unsigned char cursor[2] = {0x1c, 0x18};
lcd_envia_controle (0,0,cursor[direita_esquerda],40);
}

//Liga/Desliga o cursor/display.
void lcd_LD_cursor (unsigned char config)
{
/*
0 - Desliga o cursor.
1 - Desliga o display.
2 - Liga o cursor com alternância.
3 - Liga o display e o cursor.
4 - Liga o display e o cursor piscante.
*/
unsigned char cursor [5] = {0x0c, 0x08, 0x0f, 0x0e, 0x0d};
lcd_envia_controle (0,0,cursor[config],40);
}

//Coloca o cursor em uma determinada posição do LCD.
void lcd_posicao(unsigned char linha, unsigned char coluna)
{
switch (linha)
{
case 1:
lcd_envia_controle (0,0,0x80+coluna-1,40);
break;
case 2:
lcd_envia_controle (0,0,0xc0+coluna-1,40);
break;
case 3:
lcd_envia_controle (0,0,0x94+coluna-1,40);
break;
case 4:
lcd_envia_controle (0,0,0xd4+coluna-1,40);
break;
}
}

//Escreve um caractere ou símbolo no display.
void lcd_escreve_dado(unsigned char dado)
{
lcd_envia_controle (1,0,dado,45);
}

//Retorna o caractere presente na posição do cursor.
unsigned char lcd_le_dado( )
{
return lcd_envia_controle (1,1,0,45);
}

//Retorna o valor do status + contador de endereço.
unsigned char lcd_status ( )
{
return lcd_envia_controle (0,1,0,40);
}

//Envia String para o Display LCD.
void imprime_string_lcd(const rom char *s_caracteres)
{
while (*s_caracteres!=0)
{
lcd_escreve_dado(*s_caracteres);
s_caracteres++;
}
}

//Envia uma matriz de dados para o Display LCD.
void imprime_buffer_lcd( char *s_caracteres, unsigned char tamanho_buffer)
{
while (tamanho_buffer--)
{
lcd_escreve_dado(*s_caracteres);
s_caracteres++;
}
}

//Inicializa o display LCD alfanumérico.
void lcd_inicia( unsigned char conf1, unsigned char conf2, unsigned char conf3)
{
/*
Configuração do display LCD:

(0x28)
- Comunicação 4 vias
- Display com 2 linhas
- Matriz 8x5

(0x0f)
- Liga display
- Cursor piscante

(0x06)
- Desloca o cursor para a direita quando um caractere for inserido.
*/
unsigned char config_LCD[6] = {0x03, 0x02, 0x00, 0x00, 0x00};
unsigned char repeticao;

config_LCD[2] = conf1;
config_LCD[3] = conf2;
config_LCD[4] = conf3;

//Configura os pinos de dados/controle, como saída.
S_B7;
S_B6;
S_B5;
S_B4;
S_E;
S_RW;
S_RS;

RS = 0; //Instrução.
RW = 0; //Escrita.
E = 0; //Desabilita LCD.

gera_atraso_us(20000); //Gera um atraso de 20ms.

for( repeticao = 0 ; repeticao < 3 ; repeticao++ )
{
B7 = config_LCD[0]>>3; //B7 recebe o bit 3 do elemento presente na posição 0 da matriz config_LCD.
B6 = config_LCD[0]>>2; //B6 recebe o bit 2 do elemento presente na posição 0 da matriz config_LCD.
B5 = config_LCD[0]>>1; //B5 recebe o bit 1 do elemento presente na posição 0 da matriz config_LCD.
B4 = config_LCD[0]; //B4 recebe o bit 0 do elemento presente na posição 0 da matriz config_LCD.

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.
E = 0; //Desabilita o Display LCD.

gera_atraso_us(5000); //Gera um delay de 5ms.
}

B7 = config_LCD[1]>>3; //B7 recebe o bit 3 do elemento presente na posição 1 da matriz config_LCD.
B6 = config_LCD[1]>>2; //B6 recebe o bit 2 do elemento presente na posição 1 da matriz config_LCD.
B5 = config_LCD[1]>>1; //B5 recebe o bit 1 do elemento presente na posição 1 da matriz config_LCD.
B4 = config_LCD[1]; //B4 recebe o bit 0 do elemento presente na posição 1 da matriz config_LCD.

E = 1;//Habilita o Display LCD.
gera_atraso_us(2); //Gera um delay de 2us.
E = 0; //Desabilita o Display LCD.

gera_atraso_us(40); //Gera um delay de 40us.

lcd_envia_controle (0,0,config_LCD[2],40);
lcd_envia_controle (0,0,config_LCD[3],40);
lcd_envia_controle (0,0,config_LCD[4],40);

lcd_limpa_tela ( );

}
roquetti
Byte
 
Mensagens: 183
Registrado em: 27 Dez 2008 23:07
Localização: Jaguariúna - SP

Mensagempor ze » 11 Ago 2011 14:00

com licença...
sem querer desmerecer vosso trabalho, mas as rotinas parecem estar complexas demais pra algo tão simples como escrever num lcd. isto pode ter algum valor didático, mas para o cruel mundo real veja as mrds que postei há alguns anos:
http://www.asm51.eng.br/phpbb/viewtopic.php?t=4062
são 2 cliques

pode não ser totalmente inútil

sucessos!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor ÁgioFelipe » 12 Ago 2011 10:45

Roquetti sua biblioteca rodou normalmente, aqui vai o prog q fiz usando ela:
Código: Selecionar todos
#include <p18F4550.h>
#include <delays.h>
#include "temp_lcd_2x16.h"

#pragma config FOSC    = HS
#pragma config WDT       = OFF
#pragma config LVP       = OFF
#pragma config PWRT       = ON
#pragma config BOR       = OFF
#pragma config PBADEN    = OFF
#pragma config MCLRE    = OFF

void main()
{

   PORTB = 0;
   PORTE = 0;
   TRISB = 0;
   TRISE = 0;
   ADCON1 = 0b00001111;                //DESLIGA CONVERSORES A/D


lcd_inicia(0x28, 0x0f, 0x06);

lcd_posicao(1,7);
imprime_string_lcd("LCD");

while(1);

}



Se quiser coloco o circuito também.
ÁgioFelipe
Word
 
Mensagens: 626
Registrado em: 27 Out 2006 20:04

Mensagempor Djalma Toledo Rodrigues » 12 Ago 2011 12:38

lellis escreveu:com licença...
sem querer desmerecer vosso trabalho, mas as rotinas parecem estar complexas demais pra algo tão simples como escrever num lcd.
....
pode não ser totalmente inútil

sucessos!

Concordo Lellis

Fiz em Basic, faço em Assembler, sem 'bibliasotecas', sem grande dificuldade

Duas Subrotinas para atender Tempos do LCD

Tcurto

Tlongo

Mas, parodiando você:
"Pode não ser totalmente util"

Abraço Lellis

DJ
Editado pela última vez por Djalma Toledo Rodrigues em 12 Ago 2011 12:54, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Bing [Bot] e 1 visitante

x