Programa que me saca un entero en LCD con ATmega32

Buenas.
Me encuentro realizando un proyecto en el que quiero sacar un un numero entero por pantalla e incrementarle y decrementarle cuando pulso un botón u otro.

El problema es que no me saca el número que quiero, sino que si lo pulso una vez sale un 21, luego un 47.... y sólo le incremento en 1.
Necesito ayuda.

El programa ese el siguiente:
PHP:
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>


#define RS_On PORTB|=_BV(PB0)
#define    RS_Off       PORTB&&=~_BV(PB0)
#define Enable_ON    PORTB|=_BV(PB2)
#define Enable_Off     PORTB&&=~_BV(PB2)
#define    RW_On         PORTB|=_BV(PB1)
#define RW_Off PORTB&&=~_BV(PB1)

#define Data PORTD

int i=0;

void Port_init(void){
    DDRB=0X07;
    DDRD=0XFF;
    DDRC=0x00;
    PORTB=0X00;
    PORTD=0X00;
    PORTC=0x00;

}

void LCD_init(void){        //INICIALIZA LA PANTALLA LCD
    
    Data=0x0F;
    Enable_ON;
    _delay_ms(1000);
    Enable_Off;
    Data=0x00;
    RS_On;
    _delay_ms(1000);

}

void writeLcd(char text[15],int tam){
    

RS_On;
                // recorre el vector char hasta tamaño
    for(i=0;i<tam;i++){  //asigna en la variable data el caracter que esta en el vector text en la posicion i
        
        Data=text[i];
        Enable_ON;
        _delay_ms(100);
        Enable_Off;
        _delay_ms(100);
}
i=0;
Data=0x00;
RS_Off;
}

void ClearLCD(void){            // funcion para limpiar la pantalla
    Data=0x01;
    Enable_ON;
    _delay_ms(100);
    Enable_Off;
}


int mostrar(){

        int x=0;
        
while(PINC!=0x04){
    
        
        if (PINC==0x01)
        {
            _delay_ms(10);
            x=x+1;
                
        }
        
        if(PINC==0x02){
            
            _delay_ms(10);
            x=x-1;
        }
    
        }
    
    return x;
    
    
}
    
void escribirentero(int numero){
    
    char str[50];
    sprintf(str,"%d",numero);
    writeLcd(str,2); // Escribe en el LCD
    _delay_ms(100);
    //ClearLCD();
    
    
}
int main(void)
{
    Port_init();
    LCD_init();
    int contador=0;
    int numero=0;
    

    while(1)
    {
        while(contador==0){  //inicializa con la palabra Tiempos
            
            
               numero=mostrar();
               
               _delay_ms(1000);
               
               escribirentero(numero);
               
               _delay_ms(1000);
            
               ClearLCD();
            
            //contador=contador+1;
        
    }
}
}
 
Última edición por un moderador:
Puede que te sirva, algo como esto:
con un atmega32 y un LCD, simulación PROTEUS... switch NEXT, BACK.

incrementa, decrementa un INT.
 

Adjuntos

  • avr atmega32.zip
    69.5 KB · Visitas: 6
Necesitas esperar a que el botón deje de estar pulsado. Si no, estará contando varias veces mientras lo tienes pulsado.
 
Atrás
Arriba