Ir ao conteúdo
  • Cadastre-se

LCD 16x2 4 bits


carlos.camj

Posts recomendados

OLA pessoal, estou escrevendo em um LCD 16x2 em 4bits compilador c18

pic184520,

estou escrevendo nas duas linhas, mas na segunda linha tem hora que escreve e tem hora que não,

Por exemplo, eu gravo o programa, quando eu testo pela primeira vez não aparece o que eu escrevi na segunda linha, dai eu dou um reset no programa,

dai aparece a escrita na segunda linha, se eu resetar de novo não aparece mais

Ou quando e tiro a alimentação do circuito e volto, a escrita da segunda linha volta aparecer, mas se eu dou um reset não aparece mais.

Gostaria de saber se problema é do lcd ou o programa em c que fiz?

Desde ja agradeço.

Link para o comentário
Compartilhar em outros sites

o programa de incialização do lcd e este.

#include <delays.h>

//cristal oscilador 20Mhz

//ciclo de maquinas 1/(fosc/4) = 0,2us

void lcd_comando(unsigned char cmd);

void lcd_envia_byte(unsigned char control, unsigned char dado);

void lcd_escreve(const rom char *matriz_lcd);

void lcd_inicio();

void lcd_posicao(unsigned char linha, unsigned char coluna);

#define D_EN TRISBbits. TRISB0 //define D_EN para o bit 0 do registrador TRISB(EN do LCD).

#define D_RS TRISBbits. TRISB1 //define D_RS para o bit 1 do registrador TRISB(RS do LCD).

#define D_B4 TRISBbits. TRISB4 //define D_B4 para o bit 4 do registrador TRISB(dado 4 do LCD).

#define D_B5 TRISBbits. TRISB5 //define D_B5 para bit 5 do reg. TRISB (dado 5 do LCD).

#define D_B6 TRISBbits. TRISB6 //define D_B6 para o bit 6 do reg. TRISB (dado 6 do LCD).

#define D_B7 TRISBbits. TRISB7 //define D_B7 para o bit 7 do reg. TRISB (dado 7 do LCD).

#define EN PORTBbits. RB0 //define EN para bit 0 da PORTB(EN do LCD).

#define RS PORTBbits. RB1 //define RS para bit 1 da PORTB(RS do LCD).

#define B4 PORTBbits. RB4 //define B4 para bit 4 da PORTB.

#define B5 PORTBbits. RB5 //define B5 para bit 5 da PORTB.

#define B6 PORTBbits. RB6 //define B6 para bit 6 da PORTB.

#define B7 PORTBbits. RB7 //define B7 para bit 7 da PORTB.

void lcd_comando(unsigned char cmd)

{

B7 = cmd>>7; //desloca 7 posiçoes a variavel cmd e armazena em D7.

B6 = cmd>>6; //desloca 6 posiçoes a variavel cmd e armazena em D6.

B5 = cmd>>5; //desloca 5 posiçoes a variavel cmd e armazena em D5.

B4 = cmd>>4; //desloca 4 posiçoes a variavel cmd e armazena em D4.

EN = 1; //coloca em 1 o bit RE1 (EN do LCD)

EN = 0; //coloca em 0 o bit RE1

B7 = cmd>>3; //desloca 3 posiçoes a variavel cmd e armazena em D3.

B6 = cmd>>2; //desloca 2 posiçoes a variavel cmd e armazena em D2.

B5 = cmd>>1; //desloca 1 posiçao a variavel cmd e armazena em D1.

B4 = cmd;

EN = 1; //coloca em 1 o RE1 (EN do LCD).

EN = 0; //coloca em 0 o RE1.

}

void lcd_envia_byte(unsigned char control, unsigned char dado)

{

RS = 0; //coloca em 0 o bit RE0.

RS = control; //coloca em 0 ou 1 RE0 dependendo de control.

Delay10KTCYx(50); //delay de 100ms

EN = 0; //coloca em 0 o bit RE1 (EN)

lcd_comando(dado); //desvia para função lcd_comando com argument dado.

}

void lcd_escreve(const rom char *matriz_lcd)

{

while(*matriz_lcd!=0) //enquanto a posição apontada pela variavel

//*matriz_lcd for diferente de 0

{

lcd_envia_byte(1,*matriz_lcd); //desvia para função lcd_envia_byte

//com o argumento 1 = escrita e o apontamento

// da variavel *matriz_lcd.

matriz_lcd++; //incrementa a posição do apontado variavel matriz_lcd.

}

}

void lcd_inicio()

{

char conta; //declaração da variavel conta com 8bits.

D_RS = 0; //direciona o pino 1 da porta B como saida.

D_EN = 0; //direciona o pino 0 da porta B como saida.

D_B4 = 0; //direciona o pino 4 da porta B como saida.

D_B5 = 0; //direciona o pino 5 da porta B como saida.

D_B6 = 0; //direciona o pino 6 da porta B como saida.

D_B7 = 0; //direciona o pino 7 da porta B como saida.

RS=0; //coloca em 0 pino 1 da porta B(RS do lcd)

EN=0; //coloca em 0 pino 0 da porta B(EN do lcd)

B4=0; //coloca em 0 pino 4 da porta B

B5=0; //coloca em 0 pino 5 da porta B

B6=0; //coloca em 0 pino 6 da porta B

B7=0; //coloca em 0 pino 7 da porta B

Delay10KTCYx(8); //gera delay 15ms

/*desvia para função lcd_comando com argumento 0x03 por tres vezes

...em intervalos de 5ms */

for(conta = 1; conta>=3; conta ++)

{

lcd_comando(0x03); //desvia para lcd_comando com argumento 0x03.

//0x03 é uma função obrigatório da incializada do LCD

Delay10KTCYx(3); //gera um delay de 5ms

}

lcd_envia_byte(0,0x28); //desvia para lcd_envia_byte com arg. 0= dado e 0x28.

lcd_envia_byte(0,0x0C); //desvia para lcd_envia_byte com arg. 0 = dado e 0x0C.

Delay1KTCYx(5); //gera delay de 1ms

lcd_envia_byte(0,0x01); //desvia para função lcd_envia_byte com arg. 0 = dado e 0x01 = limpa LCD.

lcd_envia_byte(0,0x06); //desvia para funçao lcd_envia_byte com arg. 0 = dado e 0x06.

Delay10KTCYx(3); //gera Delay de 5ms

}

void lcd_posicao(unsigned char linha, unsigned char coluna)

{

switch (linha)

{

case 1:

lcd_envia_byte(0,0x80+coluna-1);

break;

case 2:

lcd_envia_byte(0,0xc0+coluna-1);

break;

}

}

e o programa principal é este.

#include<p18f4520.h>

#include<stdio.h>

#include <delays.h>

#include "lcd_4b.h"

//frequencia oscilador 20MHZ.

//ciclo de maquina 1/(fosc/4) = 0,2us.

#pragma config OSC = HS //configura oscilador a cristal.

#pragma config WDT = OFF //desabilita Wactdog Timer (WDT).

#pragma config PWRT = ON //habilita Power-up Timer (PWRT).

#pragma config BOREN = ON //habilita brown-out reset.

#pragma config BORV = 1 //tensão de bor é 4,33v.

#pragma config PBADEN = OFF //RB0,1,2,3 e 4 onfigurado como I/O digital.

#pragma config LVP = OFF //Desabilita low voltage pragam.

void main()

{

ADCON1 = 0x0F; //desbilita todos canais AD.

TRISBbits. TRISB2 = 0; //direciona RB2 como saida.

PORTBbits. RB2 = 0; //coloca em 0 pino 2 da porta B(R/W do LCD).

{

lcd_inicio(); //desvia para funçao lcd_inicio.

Delay10KTCYx(3);

lcd_posicao(1,1); //posiciona curso linha 1 coluna 1.

lcd_escreve(" CARLOS MELLO "); //desvia para função lcd_escreve com a palavra

//... CARLOS MELLO que sera escrita no LCD.

Delay10KTCYx(3);

lcd_posicao(2,1); //posiciona curso linha 2 coluna 1.

lcd_escreve(" LIMEIRA ");

while(1); //Loop principal

}

}

Link para o comentário
Compartilhar em outros sites

Então,depois revejo seu código.

O código abaixo está configurado conforme o código que postou.

Ao compilar talvez aparece 2 'warnings' nas rotinas de 'impressão'(Warning [2066] type qualifier mismatch in assignment).

Isto não tem problema pois para solucionar terá que alterar algumas opções na modelagem do compilador (usei as libries do C18,por isso o aviso).

Deixei com opção do 'cursor piscante',caso não queira,altere a gosto.

#include <p18F4520.h> 
#include <delays.h>

#pragma config OSC = HS //configura oscilador a cristal.
#pragma config WDT = OFF //desabilita Wactdog Timer (WDT).
#pragma config PWRT = ON //habilita Power-up Timer (PWRT).
#pragma config BOREN = ON //habilita brown-out reset.
#pragma config BORV = 1 //tensão de bor é 4,33v.
#pragma config PBADEN = OFF //RB0,1,2,3 e 4 onfigurado como I/O digital.
#pragma config LVP = OFF //Desabilita low voltage pragam.
//////////////// DEFINA AQUI QUAL OS PINOS A USAR ///////////////////////////////////////////////
#define D7 LATBbits.LATB7
#define D6 LATBbits.LATB6
#define D5 LATBbits.LATB5
#define D4 LATBbits.LATB4
#define E LATBbits.LATB0
#define RS LATBbits.LATB1
////// PROTÓTIPOS DAS FUNÇÕES ,EXIGENCIA ANSI C ///////////////
void Setup(void);
void entryMode(void);
void displayOn(void);
void sendChar(char c);
void Habilita(void);
void Envia_String(const far rom char *str);
void Segunda_Linha(void);
////////////////////////////////////////////////////////////
// 0010 - 4 bit
void Setup(void)
{
RS = 0;
D7 = 0;
D6 = 0;
D5 = 1;
D4 = 0;
Habilita();
Delay10TCYx(80);
Habilita();
D7 = 1;
Habilita();
Delay10TCYx(80);
}
//.....................................................
void Habilita(void)
{
E = 1;
Delay10TCYx(1);
E = 0;
}
//....................................................
void entryMode(void) //0000 0110, sem shift
{
RS = 0;
D7 = 0;
D6 = 0;
D5 = 0;
D4 = 0;
Habilita();
D6 = 1;
D5 = 1;
Habilita();
Delay10TCYx(80);
}
//.................................................
void displayOn(void) //0000 1111. cursor ligado, blinking on.
{
RS = 0;
D7 = 0;
D6 = 0;
D5 = 0;
D4 = 0;
Habilita();
D7 = 1;
D6 = 1;
D5 = 1;
D4 = 1;
Habilita();
Delay10TCYx(80);
}
//................................................
void Envia_String(const far rom char *str)
{
int index = 0;
while (str[index] != '\0')
{
sendChar(str[index]);
index++;
}
}
//.................................................
void sendChar(char c)
{
RS = 1;
D7 = (c >> 7) & 1;
D6 = (c >> 6) & 1;
D5 = (c >> 5) & 1;
D4 = (c >> 4) & 1;
Habilita();
D7 = (c >> 3) & 1;
D6 = (c >> 2) & 1;
D5 = (c >> 1) & 1;
D4 = (c & 1);
Habilita();
Delay10TCYx(80);
}
//.................................................
void Segunda_Linha(void) //1100 0000 -
{
RS = 0;
D7 = 1;
D6 = 1;
D5 = 0;
D4 = 0;
Habilita();
D7 = 0;
D6 = 0;
Habilita();
Delay10TCYx(80);
}
///////////////////////////////////////////////////
void main(void)
{
TRISB = 0;
Delay10TCYx(80);
Setup();
entryMode();
displayOn();
Envia_String(" CARLOS MELLO ");
Segunda_Linha();
Envia_String(" LIMEIRA ");
while(1);
}

Programei em modo 'Flat',só este arquivo,sem includes externos,geralmente para códigos 'conhecidos',tipo,LCD,Serial etc, é melhor usar um código 'genérico' pois não é novidade usar LCD etc.

Link para o comentário
Compartilhar em outros sites

Agradeço novamente.

Eu mudei algumas onfigurações do curso aparente e esta ok, mais acho que este não era o problema

De vez enquanto eu reseto o programa e o contraste aparece alto e não mostra a segunda linha, quando o constrate esta normal aparece a segunda linha. vai entender né.

Bom mais esta funcionando como desejado.

Valeu a força.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!