LCD no funciona!

0

Estoy usando un PCI1602F-B de Powertip como un LCD y un ATmega8 para comunicarme con él.

Conexión :

-PORT D de ATmega8 con bus de datos de LCD

-PORT B0 de ATmega8 con Rs pin

-PORT B1 de ATmega8 con pin R / W

-PORT B2 de ATmega8 con pin Eneble (E)

-El potenciómetro está conectado al pin de ajuste de contraste (Vo) y puedo darle de 0 voltios a 5 voltios.

-El LED de retroiluminación funciona bien.

-También le doy 5 voltios a Vss-Vpp

Mi código es el siguiente:

#define F_CPU 1000000UL  // 1 MHz

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>


void En(int bit)
{
    if (bit==0)
        PORTB |= 0b00000100;
    else
        PORTB &= ~0b0000100;
}

void RS(int bit)
{
    if (bit==0)
        PORTB |= 0b00000001;
    else
        PORTB &= ~0b0000001;
}

void RW(int bit)
{
    if (bit==0)
        PORTB |= 0b00000010;
    else
        PORTB &= ~0b0000010;
}

void is_busy (void)
{
    DDRD = 0b00000000;
    RW(1);
    RS(0);
    En(1);
    while (PORTD == 0b10000000)
    {
        En(0);
        _delay_ms(1);
        En(1);
    }
    DDRD = 0b11111111;
}

void send_command(unsigned char command)
{
    is_busy();
    PORTD = command;
    RW(0);
    RS(0);
    En(1);
    _delay_ms(2);
    En(0);
    PORTD = 0b00000000;
}

void send_char(unsigned char character)
{
    is_busy();
    PORTD = character;
    RW(0);
    RS(1);
    En(1);
    _delay_ms(2);
    En(0);
    PORTD = 0b00000000;
}

void init(void)
{
    En(0);
    _delay_ms(100);
    send_command(0b00110000);
    _delay_ms(30);
    send_command(0b00110000);
    _delay_ms(10);
    send_command(0b00110000);
    _delay_ms(10);
    send_command(0b00111000); //Function Set - DL=N=1, F=0
    is_busy();
    send_command(0b00000001); //Clear Display
    is_busy();
    send_command(0b00010100); //Cursor of Display Shift - S/C=0, R/L=1
    is_busy();
    send_command(0b00001100); //Display ON/OFF - D=1, C=B=0
    is_busy();
    send_command(0b00000110); //Entry Mode Set - I/D=1, S=0
}

int main(void)
{
    init();
    send_char(0x81);
    while(1)
    {
    }

    return(0);
}

Como puede ver, solo intento imprimir una letra. La letra estoy intentando imprimirla "Q". Estoy enviando el código Hex ASCII de inmediato al microcontrolador.

La pantalla LCD no muestra nada, ¿he hecho algo mal? ¿Es correcta la inicialización?

    

3 respuestas

1

Algunas observaciones generales: primero verifique que el sesgo del panel sea correcto. Cuando encienda el potenciómetro, debería obtener una pantalla LCD absolutamente clara en un extremo y bloques oscuros en el otro extremo. Si no obtienes bloques oscuros, tu sesgo no bajará lo suficiente . Los LCD grandes (2x40 caracteres y más grandes) pueden requerir hasta -10 voltios de voltaje de polarización (contraste) del panel.

Editar: La hoja de datos de su LCD indica un voltaje de polarización máximo de 13 voltios y se hace referencia a VDD. por lo tanto, si su VDD es de 5 voltios, entonces el voltaje mínimo en el pin de voltaje de contraste es 5-13 = -8 voltios. Un buen voltaje puede estar en algún lugar alrededor de -5 voltios. Puede probar con otra fuente de alimentación o con algunas baterías con el lado + conectado a GND la cantidad de voltaje negativo que necesita.

Cuando obtienes los bloques oscuros girando el potenciómetro, puedes comenzar a trabajar con tu software; Ponga también el inicio en el bucle y mida con un osciloscopio que todas las señales van en alto y bajo.

    
respondido por el PkP
0

Verificaría todas las conexiones, asegurándome de que todo esté recibiendo la corriente, voltaje y resistencia de ohmios adecuados. También revisa tus códigos. podría ser un código de valor incorrecto código incorrecto. Dice que usó un potenciómetro, es posible que haya puesto muchos voltios en el microprocesador. Verifíquelo para ver si apaga los voltios / mA correctos. Además, si la tabla huele a quemado, entonces definitivamente se fríe algo. Asegúrese de que todos los componentes no estén demasiado calientes. Espero que esto ayude

    
respondido por el Triphex
0

Las tres subrutinas de la línea de control están escritas incorrectamente. Deben modificarse de la siguiente manera:

void En(int bit)
{
    if (bit != 00)
        PORTB |= 0b00000100;
    else
        PORTB &= ~0b0000100;
}

void RS(int bit)
{
    if (bit != 0)
        PORTB |= 0b00000001;
    else
        PORTB &= ~0b0000001;
}

void RW(int bit)
{
    if (bit != 0)
        PORTB |= 0b00000010;
    else
        PORTB &= ~0b0000010;
}
    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas