es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo invertir esto y hacer que el código comience en LED7, también conocido como el LED más a la izquierda, en lugar de LED1, y luego se desplace de izquierda a derecha?

Soy totalmente nuevo en la programación en lenguaje C y en el uso de Keil uVision en general, y recibí un ejercicio en el que tengo que invertir el siguiente código para que empiece en LED7, el LED más lejano a la izquierda, luego se desplace bit a bit hacia la derecha y vuelva, y así sucesivamente.

El código actual comienza en el lado derecho y se desplaza hacia la izquierda en un bucle. Cuando intenté invertir parte del código (por ejemplo, for(i=1;i>1;i++) en i=7;i>7;i--) y lo ejecuté, el primer LED del lado derecho se iluminó durante 0.5s y luego se detuvo.

Reinicia en intervalos aleatorios. ¿Qué debo hacer?

void Init_Device(void);

void main(void)
{
    U8 port=0x01,i;
    bit direction=0;
    Init_Device();
    initSYS();
    LCD.setTextSize(3);
    LCD.setCursor(80, 100);
    printf("P1 = ");

    while(1)
    {
        for(i=1;i>1;i++)
        {
            LCD.setCursor(160, 100);
            LCD.printNumb(port);
            printf(" = %d  ", (int)port);
            P1=~port;
            delay_ms(500);
            if(!direction)
                port<<=1;
            else
                port>>=1;
        }
        direction=~direction;
    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para comenzar la secuencia de LED desde LED7 (el LED más a la izquierda) y luego desplazarse bit a bit hacia la derecha y volver a LED7, la condición del bucle for debe cambiar de for(i=1;i>1;i++) a for(i=7;i>=0;i--). Esto hará que el bucle comience en LED7 y desplace los LED hacia la derecha y luego vuelva a LED7.

    La razón por la que el código hacía parpadear el primer LED a la derecha durante 0.5s y luego se detenía es que la condición i>1 en el código original siempre era verdadera, lo que causaba un bucle infinito. Cambiar esto a i>=0 hará que el bucle se ejecute exactamente 8 veces (para los 8 LED) antes de detenerse.

    Además del cambio en el bucle for, la condición if(!direction) debe actualizarse a if(direction==0) y la condición else debe actualizarse a else if(direction==1) para asegurar que la dirección de la secuencia de LED se controle correctamente.

    El código actualizado sería el siguiente:

    void Init_Device(void);
    
    void main(void)
    {
        U8 port=0x80,i;
        bit direction=0;
        Init_Device();
        initSYS();
        LCD_setTextSize(3);
        LCD_setCursor(80, 100);
        printf("P1 = ");
    
        while(1)
        {
            for(i=7;i>=0;i--)
            {
                LCD_setCursor(160, 100);
                LCD_printNumb(port);
                printf(" = %d  ", (int)port);
                P1=~port;
                delay_ms(500);
                if(direction==0)
                    port>>=1;
                else if(direction==1)
                    port<<=1;
            }
            direction=!direction;
        }
    }
    

Comments are closed.