Ir ao conteúdo

Problemas com LCD em C


LEOPUENA

Posts recomendados

Postado

Pessoal estou com dois problemas relacionado ao LCD. Primeiro, programando no CCS (que acho ser melhor) e testando no proteus tudo funciona certo sem um unico erro, mas na placa tem um erro, o PIC não consegue passar a rotina lcd_init(). Para ter certeza disso fiz um pisca-pisca e pus a inicialização do LCD no meio, o que acontece é que o programa para quando chega nessa rotina e ja não avança.

segue o codigo:


#include <LCD.C>


//-----------------------
#define abrir pin_b0
#define guardar pin_b1
#define interno pin_b2
//-----------------------
char x[10],y[10];
int i,j=0,k,num[4];



abri(){

lcd_init();
printf(lcd_putc," Porta Aberta ");
output_high(pin_a0);
delay_ms(5000);
lcd_init();
printf(lcd_putc," Porta Fechada ");
output_low(pin_a0);
lcd_init();
}



confirma(){
int cod[4]={2,0,1,1};
for(i=0;i<4;i++){
if(num[i]==cod[i]) j=1;
else j=0;
}
return;
}

cancel(){
printf(lcd_putc,"\fDigite o Codigo\n-->");
i=0;
delay_ms(500);
return;

}


codigo(){
j=0;
i=0;
k=1;
while(2){
output_low(pin_c0);
output_high(pin_c1);
output_high(pin_c2);
if(input(pin_b4)==0){printf(lcd_putc,"#"); num[i]=1; i++; delay_ms(500);} //1
if(input(pin_b5)==0){printf(lcd_putc,"#"); num[i]=4; i++; delay_ms(500);} //4
if(input(pin_b6)==0){printf(lcd_putc,"#"); num[i]=7; i++; delay_ms(500);} //7
if(input(pin_b7)==0){ confirma(); return; } //ok

output_high(pin_c0);
output_low(pin_c1);
output_high(pin_c2);
if(input(pin_b4)==0){printf(lcd_putc,"#"); num[i]=2; i++; delay_ms(500);} //2
if(input(pin_b5)==0){printf(lcd_putc,"#"); num[i]=5; i++; delay_ms(500);} //5
if(input(pin_b6)==0){printf(lcd_putc,"#"); num[i]=8; i++; delay_ms(500);} //8
if(input(pin_b7)==0){printf(lcd_putc,"#"); num[i]=0; i++; delay_ms(500);} //0

output_high(pin_c0);
output_high(pin_c1);
output_low(pin_c2);
if(input(pin_b4)==0){printf(lcd_putc,"#"); num[i]=3; i++; delay_ms(500);} //3
if(input(pin_b5)==0){printf(lcd_putc,"#"); num[i]=6; i++; delay_ms(500);} //6
if(input(pin_b6)==0){printf(lcd_putc,"#"); num[i]=9; i++; delay_ms(500);} //9
if(input(pin_b7)==0){ if(i>0) cancel(); else goto start;}//CANC

if(i>4) i=0;
}
start: 1;
}


void main()
{


//------------CONFIGURAÇÃO DE I/O---------------------
set_tris_a ( 0 );
set_tris_b ( 0xff );
set_tris_c ( 0 );
set_tris_d ( 0 );
set_tris_e ( 0 );
output_a(0); output_c(0); output_d(0);output_e(0);
//---------------------------------------

//------------CONFIGURAÇÃO DOS REGISTROS---------------------------
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
// lcd_init(); retirei pra por um pisca antes

//----------pisca----------------------------
output_high(pin_a1);
delay_ms(500);
output_low(pin_a1);
delay_ms(500);
output_high(pin_a1);
delay_ms(50);

lcd_init();
printf(lcd_putc," ELECTROPUBLITEC ");
output_low(pin_a1);
delay_ms(500);
//---------------------------------------

while (true){


if(input(interno)==0){
abri();
}


if(input(guardar)==0){
printf(lcd_putc,"Digite o Codigo\n-->");
codigo();
if(i==0){ printf(lcd_putc,"\fOperacao cancelada"); delay_ms(1000);printf(lcd_putc,"\f");}
else
if(j==0){
printf(lcd_putc,"\fCODIGO ERRADO");
delay_ms(2000);
printf(lcd_putc,"\f");
}
else{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fGuardando \nimpressao...");
for(i=0;i<3;i++) gets(x[i]);
lcd_gotoxy(1,1);
printf(lcd_putc,"Impressao Guardada\n ");
for(i=0;i<10;i++) write_eeprom(i,x[i]);
delay_ms(2000);
lcd_init();
}
}

if(input(abrir)==0){
lcd_gotoxy(1,1);
printf(lcd_putc,"Verificando \nimpressao...");
for(i=0;i<10;i++) x[i]=getchar();
for(i=0;i<10;i++) y[i]=read_eeprom(i);
delay_ms(1000);
for(i=0;i<10;i++){
if(x[i]!=y[i]){j=0; break;}
j=1;}

if(j==1){
lcd_gotoxy(1,1);
printf(lcd_putc,"Impressao \nreconhecida");
delay_ms(1000);
abri();
}
else{
lcd_gotoxy(1,1);
printf(lcd_putc,"X| Impressao nao \nX| reconhecida");
delay_ms(4000);
lcd_init();
}
}
}
}
#include "C:\PICANDO 2011\FECHADURA BIOMÉTRICA\877A.h"

Segundo, visto que no CCS não consegui resolver o problema, embarquei para o "problematico" MikroC. Aí o problema foi bem diferente até porque o que acontece na simulação é exactamente o que acontece na prática. O LCD é inicializado e aparece as mensagens desejadas nas primeiras funções, mas em algumas partes do programa ele parece ficar confuso e mostra mensagens de outras funções. Tentei contornar o problema de várias formas e todos tiveram resultados diferentes mas sempre errado.

segue o codigo:


// LCD module connections
sbit LCD_RS at RD1_bit;
sbit LCD_EN at RD0_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD1_bit;
sbit LCD_EN_Direction at TRISD0_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections


// Definição dos pinos para botões
sbit guardar at RB0_bit;
sbit abrir at RB1_bit;
sbit interno at RB2_bit;

#define TAM 5 //Constante que define o tamanho da leitura (Rotina do modulo)
int num[4],i,j=0;
int cod[4]={2,0,1,1};
void confirma(){

for(i=0;i<4;i++){
if(num[i]==cod[i]) j=1;
else j=0;
}
return;
}
void codigo(){

char t='#';
j=0;
i=0;
while(1){
RC0_bit=0;
RC1_bit=1;
RC2_bit=1;
if(RB4_bit==0){Lcd_chr_cp(t); num[i]=1; i++; delay_ms(500);} //1
if(RB5_bit==0){Lcd_chr_cp(t); num[i]=4; i++; delay_ms(500);} //4
if(RB6_bit==0){Lcd_chr_cp(t); num[i]=7; i++; delay_ms(500);} //7
if(RB7_bit==0){
for(i=0;i<4;i++){
if(num[i]==cod[i]) j=1;
else j=0;
} return; } //ok

RC0_bit=1;
RC1_bit=0;
RC2_bit=1;
if(RB4_bit==0){Lcd_chr_cp(t); num[i]=2; i++; delay_ms(500);} //2
if(RB5_bit==0){Lcd_chr_cp(t); num[i]=5; i++; delay_ms(500);} //5
if(RB6_bit==0){Lcd_chr_cp(t); num[i]=8; i++; delay_ms(500);} //8
if(RB7_bit==0){Lcd_chr_cp(t); num[i]=0; i++; delay_ms(500);} //0

RC0_bit=1;
RC1_bit=1;
RC2_bit=0;
if(RB4_bit==0){Lcd_chr_cp(t); num[i]=3; i++; delay_ms(500);} //3
if(RB5_bit==0){Lcd_chr_cp(t); num[i]=6; i++; delay_ms(500);} //6
if(RB6_bit==0){Lcd_chr_cp(t); num[i]=9; i++; delay_ms(500);} //9
if(RB7_bit==0) return; //CANC

if(i>4) i=0;
}
}

void abrir_P(){

Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"PORTA ABERTA");
Ra0_bit=1;
delay_ms(1000);
Ra0_bit=0;
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Esperando...");
while(RB3_bit==0){ delay_ms(1); }
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,2,"Fechando a porta...");
delay_ms(500);


delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_BLINK_CURSOR_ON);
}
void main() {
int x[TAM],y[TAM]; /* x[tam] recebe e guarda os valores na eeprom
y[tam] recebe e compara os valores guardados na eeprom*/
char erro; //controla a comunicação em serie
TRISA=0X00;
TRISB=0XFF;
TRISC=0X00;
OPTION_REG=0X00;

porta=1;
delay_ms(50);
porta=0;
delay_ms(50);
porta=1;
delay_ms(500);

porta=0;
delay_ms(50);
// Initialize LCD
//soft_uart_init(&portC,2,1,14400,0); // 2-Rx, 1-Tx, 14400-velocidade de transmissão, 0-NZR
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR); // Clear display

Lcd_Out(1,3,"U.M.A."); // Write text in first row
Lcd_Out(2,1,"FECHADURA"); // Write text in second row
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_BLINK_CURSOR_ON);

while(1){

if(interno==0) abrir_P(); /*Se o switch interno for pressionado
abre directamente a porta*/

if(guardar==0){
Lcd_Cmd(_LCD_CLEAR);
Lcd_Init();
Lcd_out(1,1,"Digite a senha");
//delay_ms(1000);
Lcd_out(2,1,"-> ");


codigo(); //Rotina para inserir codigo de segurança
for(i=0;i<4;i++)num[i]=0;
if(j!=1){
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"CODIGO NAO ");
Lcd_out(2,1,"RECONHECIDO");
delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
}
else{
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Guardando impressao...");
/*Lcd_Cmd(_LCD_CURSOR_OFF);
for(i=0;i<TAM;i++){
do x[i]=Soft_Uart_Read(&erro);
while(erro);
} */
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Impressao ");
Lcd_out(2,1,"Guardada");
//for(i=0;i<TAM;i++){ eeprom_write(i,x[i]); delay_ms(500);}
delay_ms(100);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_BLINK_CURSOR_ON);
}
}


if(abrir==0){
Lcd_out(1,1,"Verificando ");
Lcd_out(2,1,"impressao...");
Lcd_Cmd(_LCD_CURSOR_OFF);
/*for(i=0;i<TAM;i++){
do y[i]=Soft_Uart_Read(&erro);
while(erro);
}
for(i=0;i<TAM;i++){
if(y[i]==eeprom_read(i)) j=1;
else j=0;
delay_ms(100);
} */
delay_ms(1000);




if(j==1){
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"Impressao");
Lcd_out(2,1,"reconhecida");
delay_ms(1000);
abrir_P();
}
else{
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"X Impressao nao ");
Lcd_out(2,1,"X Reconhecida");
delay_ms(4000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_BLINK_CURSOR_ON);
}
}
}
}

OBS: No MikroC tive que retirar os comandos relacionados a comunicação serial, que ainda está em analise, preciso reduzir ou mudar para uart1 devido ao "demo limit" (eis o problematico MikroC :mad:), mas isso fica pra depois.

Problemas do genero nunca aconteceram em assembly (the best :cool::rolleyes:). mas por razões de força maior o programa tem de ser feito em C :( .

Fico grato por qualquer ajuda.

LEOPUENA.

____________________________

EDIT

:lol: 20 minutos depois consegui resolver o problema do CCS, foi um pequeno erro de montagem, aterrei o RW mas devia ter ligado ao RD3 :wacko:, funcionou na perfeição e ainda deu pra "adoçar" o programa. Mas ainda não consegui tratar do MikroC, alguem tem alguma solução?

o codigo ficou assim:


#include <LCD.C>


//-----------------------
#define abrir pin_b1
#define guardar pin_b0
#define interno pin_b2
#define sensor pin_b3
//-----------------------
char x[10],y[10];
int i,j=0,k,num[4];
unsigned int msg;


abri(){

lcd_init();
printf(lcd_putc," Porta Aberta ");
output_high(pin_a0);
delay_ms(2000);
output_low(pin_a0);
delay_ms(500);
printf(lcd_putc,"\n Esperando... ");
while(input(sensor)==0){ delay_ms(1); }
lcd_init();
printf(lcd_putc," Porta Fechada ");
delay_ms(1000);
lcd_init();
}



confirma(){
int cod[4]={2,0,1,1};
for(i=0;i<4;i++){
if(num[i]==cod[i]) j=1;
else j=0;
}
for(i=0;i<4;i++) num[i]=0;
return;
}

cancel(){
printf(lcd_putc,"\fDigite o Codigo\n-->");
i=0;
delay_ms(500);
return;

}


codigo(){
j=0;
i=0;
k=1;
while(2){
output_low(pin_c0);
output_high(pin_c1);
output_high(pin_c2);
if(input(pin_b4)==0){printf(lcd_putc,"#"); num[i]=1; i++; delay_ms(500);} //1
if(input(pin_b5)==0){printf(lcd_putc,"#"); num[i]=4; i++; delay_ms(500);} //4
if(input(pin_b6)==0){printf(lcd_putc,"#"); num[i]=7; i++; delay_ms(500);} //7
if(input(pin_b7)==0){ confirma(); return; } //ok

output_high(pin_c0);
output_low(pin_c1);
output_high(pin_c2);
if(input(pin_b4)==0){printf(lcd_putc,"#"); num[i]=2; i++; delay_ms(500);} //2
if(input(pin_b5)==0){printf(lcd_putc,"#"); num[i]=5; i++; delay_ms(500);} //5
if(input(pin_b6)==0){printf(lcd_putc,"#"); num[i]=8; i++; delay_ms(500);} //8
if(input(pin_b7)==0){printf(lcd_putc,"#"); num[i]=0; i++; delay_ms(500);} //0

output_high(pin_c0);
output_high(pin_c1);
output_low(pin_c2);
if(input(pin_b4)==0){printf(lcd_putc,"#"); num[i]=3; i++; delay_ms(500);} //3
if(input(pin_b5)==0){printf(lcd_putc,"#"); num[i]=6; i++; delay_ms(500);} //6
if(input(pin_b6)==0){printf(lcd_putc,"#"); num[i]=9; i++; delay_ms(500);} //9
if(input(pin_b7)==0){ if(i>0) cancel(); else goto start;}//CANC

if(i>4) i=0;
}
start: 1;
}

display(){

msg++;
delay_ms(80);
if(msg==10000) printf(lcd_putc,"\f UNIVERSIDADE \n METODISTA ");
if(msg==20000){ printf(lcd_putc,"\f FECHADURA \n BIOMETRICA ");
msg=0;
}
}
void main()
{


//------------CONFIGURAÇÃO DE I/O---------------------
set_tris_a ( 0 );
set_tris_b ( 0xff );
set_tris_c ( 0 );
set_tris_d ( 0 );
set_tris_e ( 0 );
output_a(0); output_c(0); output_d(0);output_e(0);
//---------------------------------------

//------------CONFIGURAÇÃO DOS REGISTROS---------------------------
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();

while (true){

display();

if(input(interno)==0){
abri();
}


if(input(guardar)==0){
printf(lcd_putc,"\fDigite o Codigo\n-->");
codigo();
if(i==0){ printf(lcd_putc,"\fOperacao cancelada"); delay_ms(1000);printf(lcd_putc,"\f");}
else
if(j==0){
printf(lcd_putc,"\fCODIGO ERRADO");
delay_ms(2000);
printf(lcd_putc,"\f");
}
else{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fGuardando \nimpressao...");
//for(i=0;i<3;i++) gets(x[i]);
delay_ms(1000);
lcd_gotoxy(1,1);
printf(lcd_putc,"Impressao Guardada\n ");
//for(i=0;i<10;i++) write_eeprom(i,x[i]);
delay_ms(2000);
lcd_init();
}
}

if(input(abrir)==0){
lcd_gotoxy(1,1);
printf(lcd_putc,"Verificando \nimpressao...");
//for(i=0;i<10;i++) x[i]=getchar();
//for(i=0;i<10;i++) y[i]=read_eeprom(i);
delay_ms(1000);
for(i=0;i<10;i++){
if(x[i]!=y[i]){j=0; break;}
j=1;}

if(j==1){
lcd_gotoxy(1,1);
printf(lcd_putc,"Impressao \nreconhecida");
delay_ms(1000);
abri();
}
else{
lcd_gotoxy(1,1);
printf(lcd_putc,"X| Impressao nao \nX| reconhecida");
delay_ms(4000);
lcd_init();
}
}
}
}
#include "C:\PICANDO 2011\FECHADURA BIOMÉTRICA\877A.h"

Postado

estou a usar LCD paralelo no modo 4 linhas. O LCD até funciona mas as rotinas parecem confusas. Eu tenho quase a certeza que há algum erro no meu programa.

Postado

voce poderia usar o Hitech-C.

CCS e MikroC,sobrepoe muito a configuração dos pinos,no Hitech voce pode configurar direto como se fosse em ASM.

Postado
voce poderia usar o Hitech-C.

CCS e MikroC,sobrepoe muito a configuração dos pinos,no Hitech voce pode configurar direto como se fosse em ASM.

Pois aí está algo que nunca pensei. Tenho o MPLAB e o hitech-c instalado, mas só uso o MPLAB pra ASM. Vou tentar migrar pra esse compilador.

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!