Banner publicitario de PCBWay

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