El programa LCD Atmega32 no funciona

0

Hace poco estuve en atmega world después de escuchar que es mucho mejor que pic y es mi segundo tutorial sobre cómo escribir en LCD. Escribí este programa en atmel studio pero no funciona. Revisé el hardware y todo estuvo bien ¿Cuál es el problema?

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

void initLCD(void);
void writeChar(int);
void sendCommand(int);
void checkIfBusy(void);

int main()
{
    DDRC = 0xFF;
    DDRD = 0b11100000;
    initLCD();
    writeChar(70);
    while(1);
}

void checkIfBusy(){
    DDRC = 0;
    PORTD |= (1<<5);
    PORTD |= (0<<6);
    while(bit_is_set(PIND, 5)){
        PORTD |= (1 << 6);
        PORTD &= (0 << 6);
    }

    DDRC = 0xFF;
}

void sendCommand(int command){
    checkIfBusy();
    PORTD = 0;
    PORTC = command;
    PORTD = 0b10000000;
    PORTD = 0;
}

void initLCD(){
    //Clear Display
    sendCommand(1);
    //Function Set
    sendCommand(0b00111000);
    //Display Control
    sendCommand(0b00001100);
}
void writeChar(int character){
    checkIfBusy();
    PORTD = 0b01000000;
    //Write the character
    PORTC = character;
    PORTD = 0b11000000;
    PORTD = 0b01000000;
}

EDIT

Cambié el código pero aún no funciona, ¿cuál es el problema entonces?

    
pregunta ilouy

1 respuesta

1

Se sugiere que debes mencionar las funciones de pin que asignaste. Pero me doy cuenta de lo siguiente. Por favor verifica que.

has usado,
PD5 - > R / W,
PD6 - > RS,
PD7 - > Trigger,

Ok, el primer error que detecté fue que tienes confusión en cómo configurar & Borrar un poco en particular.

Has usado PORTD |= (0<<6) < - ¿Qué significa esto? En realidad no hace nada. Simplemente deja a PORTD como está ... ¡Vaya!

Luego, también ha utilizado PORT &= (0<<6) < --- Lo que esto significa es que simplemente borra los 8 bits en PORTD. Tu intención no fue esta, ¿verdad?

Esta es la forma correcta,

Estableciendo un bit en particular, supongamos, digamos, PD6 (su bit deseado), use lo siguiente:

PORTD |= (1<<6);

Borrar el mismo bit,

PORTD & = ~(1<<6);

Bien, ahora que esto está bien, también tienes un problema lógico detrás de la rutina "checkIfBusy".

En realidad, todo lo que tienes que hacer se da a continuación en una secuencia:

Primero asume

PORTD as input, "DDRD=0x00";  
RS=0, "PORTD&=~(1<<6);
RW=1, "PORTD|=(1<<5);

Luego active un disparador, verifique si el séptimo bit de datos está configurado, si está configurado, espere allí, de lo contrario salga del ciclo. Es como tienes que escribir esto.

while(PINC>=0b10000000)
{

PD7|=(1<<7);
_delay_us(50);
PD&&=~(1<<7);
_delay_us(50);

}

ALGUNOS MÁS: Tienes que enviar caracteres ASCII a LCD.
Así que por favor envíe un valor de char o cadena. Enviar Integer no te ayudará a cumplir tu deseo.

    
respondido por el Balaganesh Arasiah

Lea otras preguntas en las etiquetas