Ir ao conteúdo

LCD 16x2 4 bits


carlos.camj

Posts recomendados

Postado

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.

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

Lógico que podemos ajudar,mas para sebar se é o seu programa,precisamos dele..

Postado

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

}

}

Postado

Eu não tenho um Hardware para testar esse código,mas pode ser algo relacionado a seu layout.

voce tentou simular no Proteus?

Minha simulação no Proteus não funcionou,estou revendo o código.

PS:Se quiser um código mais simples,posso postar.

Postado

Não, eu tenho o proteus aqui mais não gosto muito de mexer, estou simulando direto no

Kit de desenvolvimento da personalpic.

Eu quero sim, pode postar.

Muito obrigado.

Postado

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.

Postado

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.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!