Error en LCD al interactuar con ATmega 32

Estoy tratando de conectar un teclado normal y una pantalla LCD. Por ejemplo, si presiono '1' en el teclado, aparecerá 'uno' en la pantalla. si presiono '=', mostrará 'IGUAL' en la pantalla. desarrollé debajo del código. pero después de simular, la pantalla LCD muestra texto aleatorio como la imagen a continuación. No puedo entender lo que pasó aquí.

#include <mega32.h>
#include <alcd.h>
#include <delay.h>

#define keypad_ddr DDRC
#define keypad_port PORTC
#define keypad_input PINC

void main(void)
{
keypad_ddr=0xF0;
lcd_init(16);

while(1)
        {
        lcd_clear();
       keypad_port=0b11100000;
       lcd_gotoxy(0,0);
       if(keypad_input.0==0)
        lcd_putsf("Seven");
       if(keypad_input.1==0)
        lcd_putsf("Four");
       if(keypad_input.2==0)
        lcd_putsf("One");
       if(keypad_input.3==0)
        lcd_putsf("ON/C");
       keypad_port=0b11010000;
       lcd_gotoxy(0,0);
       if(keypad_input.0==0)
        lcd_putsf("Eight");
       if(keypad_input.1==0)
        lcd_putsf("Five");
       if(keypad_input.2==0)
        lcd_putsf("Two");
       if(keypad_input.3==0)
        lcd_putsf("Zero"); 
      keypad_port=0b10110000;
       lcd_gotoxy(0,0);
       if(keypad_input.0==0)
        lcd_putsf("Nine");
       if(keypad_input.1==0)
        lcd_putsf("Six");
       if(keypad_input.2==0)
        lcd_putsf("Three");
       if(keypad_input.3==0)
        lcd_putsf("Equal");
      keypad_port=0b01110000;
       lcd_gotoxy(0,0);
       if(keypad_input.0==0)
        lcd_putsf("Division");
       if(keypad_input.1==0)
        lcd_putsf("Multiplication");
       if(keypad_input.2==0)
        lcd_putsf("Minus");
       if(keypad_input.3==0)
        lcd_putsf("Plus");
        delay_ms(1000);
        }
}

Simulación: (Mira la pantalla LCD)

por favor sangra tu código correctamente

Respuestas (1)

No muestra resistencias pullup en su esquema, por lo que esto no funcionará a menos que habilite los pullups internos del MEGA32. Para hacer esto, necesita escribir unos en los bits de entrada. En otras palabras, siempre que cambie el selector de columna, los bits de orden inferior deben ser 1111, no 0000.

Por ejemplo:

  keypad_port = 0b11101111;