Salida extraña en una pantalla LCD 16X2 JHD162A

1

Estoy aprendiendo la interconexión de Atmega 16a con 16X2 LCD. He escrito un archivo de encabezado para las rutinas que se usan con frecuencia y cada vez que quiero conectarme con la pantalla LCD utilizando Atmega 16a, uso este archivo de encabezado.

aquí está mi archivo de cabecera LCD:

#include<stdlib.h>
#include<avr/io.h>
#include<util/delay.h>
int cx=1;
int cy=1;
void LCD_Send(unsigned char c,unsigned char DC)
{

    if(DC==0)
    {
        PORTC=0x0F & (c>>4);
        PORTC=PORTC|(1<<5);
        _delay_ms(1);
        PORTC=PORTC & (~(1<<5));
        _delay_ms(1);
        PORTC=0x0F & (c);
        PORTC=PORTC | (1<<5);
        _delay_ms(1);
        PORTC=PORTC & (~(1<<5));
        _delay_ms(1);
    }
    else if(DC==1)
    {
        PORTC=0x0F & (c>>4);
        PORTC=PORTC | (1<<7);
        PORTC=PORTC|(1<<5);
        _delay_ms(1);
        PORTC=PORTC & (~(1<<5));
        _delay_ms(1);
        PORTC=0x0F & (c);
        PORTC=PORTC | (1<<7);
        PORTC=PORTC | (1<<5);
        _delay_ms(1);
        PORTC=PORTC & (~(1<<5));
        _delay_ms(1);
    }
    return ;
}
void LCD_init(void)
{
    DDRC=0b11101111;
    LCD_Send(0x01,0);
    LCD_Send(0x0F,0);
    LCD_Send(0x28,0);
    cx=1;cy=1;
    return ;
}
void LCD_Send_String(char* s)
{
    for(int i=0;s[i]!='
#include"lcd.h"
int main(void)
{
    LCD_init();
    char s[20]="1234567890123456789";
    LCD_Send_String(s);
    return 0;
}
';i++) { LCD_Send(s[i],1); if(cx==16) { cx=1;cy++; LCD_Send(0xC0,0); } else cx++; } return ; } void LCD_GotoXY(unsigned int x,unsigned int y) { if(y==1) { char addr=0x80; addr=addr+(x-1); LCD_Send(addr,0); } else if(y==2) { char addr=0xC0; addr=addr+(x-1); LCD_Send(addr,0); } cx=x; cy=y; return ; } void LCD_Print(int data,unsigned int x,unsigned int y) { char string[10]; LCD_GotoXY(x,y); itoa(data,string,10); LCD_Send_String(string); return ; }

Aquí, RS, R / W y E son PC7, PC6 y PC5 respectivamente, DB4, DB5, DB6, DB7 son PC0, PC1, PC2, PC3 respectivamente. Estoy usando el modo de 4 bits para la entrada.

aquí está mi archivo main.c (el código que se ejecutará en el microprocesador):

#include<stdlib.h>
#include<avr/io.h>
#include<util/delay.h>
int cx=1;
int cy=1;
void LCD_Send(unsigned char c,unsigned char DC)
{

    if(DC==0)
    {
        PORTC=0x0F & (c>>4);
        PORTC=PORTC|(1<<5);
        _delay_ms(1);
        PORTC=PORTC & (~(1<<5));
        _delay_ms(1);
        PORTC=0x0F & (c);
        PORTC=PORTC | (1<<5);
        _delay_ms(1);
        PORTC=PORTC & (~(1<<5));
        _delay_ms(1);
    }
    else if(DC==1)
    {
        PORTC=0x0F & (c>>4);
        PORTC=PORTC | (1<<7);
        PORTC=PORTC|(1<<5);
        _delay_ms(1);
        PORTC=PORTC & (~(1<<5));
        _delay_ms(1);
        PORTC=0x0F & (c);
        PORTC=PORTC | (1<<7);
        PORTC=PORTC | (1<<5);
        _delay_ms(1);
        PORTC=PORTC & (~(1<<5));
        _delay_ms(1);
    }
    return ;
}
void LCD_init(void)
{
    DDRC=0b11101111;
    LCD_Send(0x01,0);
    LCD_Send(0x0F,0);
    LCD_Send(0x28,0);
    cx=1;cy=1;
    return ;
}
void LCD_Send_String(char* s)
{
    for(int i=0;s[i]!='
#include"lcd.h"
int main(void)
{
    LCD_init();
    char s[20]="1234567890123456789";
    LCD_Send_String(s);
    return 0;
}
';i++) { LCD_Send(s[i],1); if(cx==16) { cx=1;cy++; LCD_Send(0xC0,0); } else cx++; } return ; } void LCD_GotoXY(unsigned int x,unsigned int y) { if(y==1) { char addr=0x80; addr=addr+(x-1); LCD_Send(addr,0); } else if(y==2) { char addr=0xC0; addr=addr+(x-1); LCD_Send(addr,0); } cx=x; cy=y; return ; } void LCD_Print(int data,unsigned int x,unsigned int y) { char string[10]; LCD_GotoXY(x,y); itoa(data,string,10); LCD_Send_String(string); return ; }

Cuando flasheo la memoria con el archivo HEX y luego reinicio, la pantalla LCD se muestra bien

Luego,cuandoreinicio,luegosemuestranlasvariablesaleatorias(dehechopuedoverquelasegundalíneanocambiaenabsoluto,significaquelapantallanoseborraperoseescribióuncomandoenLCD_init()paraborrarlapantalla)

Estoy bastante seguro de que no hay ningún problema con la placa y las conexiones porque funciona con otros archivos de encabezado, estoy bastante seguro de que hay un error en mi código. Realmente agradecería si alguien me ayudara a arreglar este código. Si vuelvo a restablecer, muestra la secuencia correcta como en la primera imagen

    
pregunta Aditya

3 respuestas

3

Su problema es que la pantalla mantiene su estado durante el reinicio de MCU. Al arrancar en frío, el modo de datos inicial es de 8 bits, que usted cambia inmediatamente a 4 bits que lee datos con un par de pulsos EN.

Cuando reinicia la MCU, no sabe si se enviaron un número par o impar de impulsos EN. Por lo tanto, de alguna manera debe restablecer la pantalla, incluso si no tiene un pin de reinicio.

Esto se puede hacer enviando 0x33 0x33 (en modo de 8 bits significará un cambio de 4 veces a 8 bits, en modo de 4 bits significará que una o dos veces cambiará a 8 bits). Entonces puedes estar seguro de que siempre comienzas desde el mismo estado.

Luego proceda con 0x32 normal (o 0x02 de 4 bits si tiene una sola función de escritura de 4 bits), 0x28 para entrar en el modo de 2 líneas de 4 bits.

    
respondido por el venny
1

Los LCD tienden a hacer esto si el flujo de datos se desincroniza de alguna manera, por ejemplo, conectándolo mientras la transferencia de datos está en curso o reiniciando la pantalla o el microcontrolador pero no ambos.

Observo en tu código que no hay retraso en el inicio. Los LCD a menudo requieren un corto período de tiempo para "iniciar" antes de que pueda comenzar a enviar datos. Agregue un pequeño retraso al inicio de su código. Consulte la hoja de datos de la pantalla LCD para ver cuánto.

    
respondido por el MrZebra
0

Compruebe la hoja de datos para el LCD. A menudo, tiene que esperar un tiempo establecido después del encendido antes de enviar la secuencia de inicio. Quizás tu problema sea este:

Cuando está programando el dispositivo, ya se ha encendido por un tiempo, por lo que su secuencia de inicio funciona. Cuando arranca en frío, no hay demora, por lo que la pantalla LCD no está lista para la secuencia de inicio todavía.

También publique un enlace a la hoja de datos

    
respondido por el Will

Lea otras preguntas en las etiquetas