Autor Tema: Juego luces PIC16F628A  (Leído 1757 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado avaunzaz

  • PIC10
  • *
  • Mensajes: 6
Juego luces PIC16F628A
« en: 08 de Abril de 2020, 16:14:08 »
Buen dia

Espero me puedan claborar a reducir lineas de codigo a este programa que me genera un Juego de luces en un Pic16f628A

// PIC16F628A Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <xc.h> //??????
#include<PIC16f628A.h>//???
#define _XTAL_FREQ 4000000//???

int i,j,k;

int main()
{
    TRISA = 0X00;
    TRISB = 0X00;
    CMCON = 0X07;
    PORTA = 0XFF;
    PORTB = 0XFF;
    __delay_ms(200);
    PORTA = 0X00;
    PORTB = 0X80;
    __delay_ms(200);
   
    do
    {
        /*------------------------------------1-----------------------------------------*/
        for( i=0; i<7; i++ )
        {
            PORTB=PORTB>>1;  //Rota el puerto B a la derecha una vez
            __delay_ms(200);
        }
        PORTB = 0X00;
        PORTA = 0X80;
        __delay_ms(200);
               
        for( i=0; i<7; i++ )
        {
           
            if(i == 3)
            {
            PORTA = 0X10;
            __delay_ms(200);
            PORTA = 0X8;
           __delay_ms(200);
            }
             
           PORTA=PORTA>>1;  //Rota el puerto A a la derecha una vez
            __delay_ms(200);
        }
        //PORTA = 0X00;
        PORTA = 0X01;
        __delay_ms(200);
        for( i=0; i<7; i++ )
        {
       
            if(i == 5)
            {
                //continue;
                PORTA = 0X40;
                __delay_ms(200);
            }
            PORTA = PORTA<<1;   //Rota el puerto A a la izquierda una vez
            __delay_ms(200);
        }
        PORTA = 0x00;
        PORTB = 0X01;
        __delay_ms(200);
        for( i=0; i<7; i++ )
        {
            PORTB=PORTB<<1;    //Rota el puerto B a la izquierda una vez
            __delay_ms(200);
        }
        /*-------------------------------------2----------------------------------------*/
       
        PORTA = 0X00;
        PORTB = 0X00;
        __delay_ms(200);
               
        for( i=0; i<3; i++ )  // prende y apaga dos veces todos los led del puerto AyB
        {
            PORTA = 0XFF;
            PORTB = 0XFF;
            __delay_ms(200);
            PORTA = 0X00;
            PORTB = 0X00;
            __delay_ms(200);
        }
       /*----------------------------------------3-------------------------------------*/
        PORTA = 0X00;
        PORTB = 0X00;
        __delay_ms(200);
       
        for( j=0; j<2; j++ )     
        {
            PORTA = 0X00;      // prende y apaga  puerto A y puerto B enciende
            PORTB = 0XFF;
            __delay_ms(200);
            PORTA = 0XFF;      // prende y apaga  puerto B y puerto A enciende
            PORTB = 0X00;
            __delay_ms(200);
        }
       
        PORTA = 0X00;       
        PORTB = 0X80;
        __delay_ms(200);   
       
       
        /*-------------------------------------------4----------------------------------*/
       
        for( i=0; i<1; i++ )
        {
            for( j=0; j<7; j++ )
                {
                    PORTB=PORTB>>2;  //Rota el puerto B a la derecha saltando impares
                    __delay_ms(500);
                }
                            PORTA = 0X80;      //Rota el puerto A a la derecha saltando impares
                            __delay_ms(500);
                            PORTA = 0X10;     
                            __delay_ms(500);
                            PORTA = 0X04;
                            __delay_ms(500);
                            PORTA = 0X01;
                            __delay_ms(500);   
        }
        /*--------------------------------------------5---------------------------------*/
        PORTA = 0X00;       
        PORTB = 0XE0;
        __delay_ms(200); 
       
        for( i=0; i<7; i++ )           // prenden de 3leds en puerto B a la derecha
        {
                PORTB = PORTB/2;
                __delay_ms(200);
        }
        PORTB = 0X00;                   // prenden de 3leds en puerto A a la derecha
        PORTA = 0X80;                   // con la continuacion del puerto A
        __delay_ms(200);
        PORTA = 0XC0;
        __delay_ms(200);   
        PORTA = 0XD0;
        __delay_ms(200);
        PORTA = 0X58;
        __delay_ms(200);
        PORTA = 0X1C;
        __delay_ms(200);
        for( i=0; i<4; i++ )
        {
                PORTA = PORTA/2;
                __delay_ms(200);
        }
        /*-------------------------------------------6----------------------------------*/
        /*corre a la Izquieda de 2leds encendidos desde el Puerto A y hasta el Puerto B*/
        PORTA = 0X03;
        __delay_ms(200);
        PORTA = 0X06;
        __delay_ms(200);   
        PORTA = 0X0C;
        __delay_ms(200);
        PORTA = 0X18;
        __delay_ms(200);
        PORTA = 0X50;
        __delay_ms(200);
        PORTA = 0XC0;
        __delay_ms(200);
        PORTA = 0X80;
        __delay_ms(200);   
        PORTA = 0X00;
        __delay_ms(200);
        PORTB = 0X01;
        __delay_ms(200);
        PORTB = 0X03;
        __delay_ms(200);
        PORTB = 0X06;
        __delay_ms(200);
       for( i=0; i<7; i++ )
        {
                PORTB = PORTB*2;
                __delay_ms(200);
        }
        /*-------------------------------------------7----------------------------------*/
        /*Puerto B encienden leds a la derecha y Puerto A a la izquierda*/
         PORTB = 0X80 ; PORTA = 0X01;       
         __delay_ms(200);
         PORTB = 0X40 ; PORTA = 0X02;       
         __delay_ms(200);
         PORTB = 0X20 ; PORTA = 0X04;       
         __delay_ms(200);
         PORTB = 0X10 ; PORTA = 0X08;       
         __delay_ms(200);
         PORTB = 0X08 ; PORTA = 0X10;       
         __delay_ms(200);
         PORTB = 0X04 ; PORTA = 0X40;       
         __delay_ms(200);
         PORTB = 0X02 ; PORTA = 0X80;       
         __delay_ms(200);
         PORTB = 0X01 ; PORTA = 0X80;       
         __delay_ms(200);
       
        /*--------------------------------------------8---------------------------------*/
         /*Puerto A encienden leds a la derecha y Puerto B a la izquierda*/
        PORTB = 0X01 ; PORTA = 0X80;       
         __delay_ms(200);
         PORTB = 0X02 ; PORTA = 0X80;       
         __delay_ms(200);
         PORTB = 0X04 ; PORTA = 0X40;       
         __delay_ms(200);
         PORTB = 0X08 ; PORTA = 0X10;       
         __delay_ms(200);
         PORTB = 0X10 ; PORTA = 0X08;       
         __delay_ms(200);
         PORTB = 0X20 ; PORTA = 0X04;       
         __delay_ms(200);
         PORTB = 0X40 ; PORTA = 0X02;       
         __delay_ms(200);
         PORTB = 0X80 ; PORTA = 0X01;       
         __delay_ms(200); 
       
        /*--------------------------------------------9---------------------------------*/
        PORTA = 0X00;
        PORTB = 0X00;
        __delay_ms(200);
               
        for( i=0; i<3; i++ )  // prende y apaga 3 veces p7,p6,p1,p0 de los puertos A y B
        {
            PORTA = 0XC3;
            PORTB = 0XC3;
            __delay_ms(200);
            PORTA = 0X00;
            PORTB = 0X00;
            __delay_ms(200);
           
        }
            PORTB = 0X66 ; PORTA = 0X56;   // se va encendiendo de a dos leds de los puertos A y B   
            __delay_ms(500);               // paresca que se va juntando hasta la mitad de cada puerto individual
            PORTB = 0X3C ; PORTA = 0X1C;       
            __delay_ms(500);
            PORTB = 0X18 ; PORTA = 0X08;       
            __delay_ms(500);
       
        PORTA = 0X00;       
        PORTB = 0X00;
        __delay_ms(200);
        /*--------------------------------------------10---------------------------------*/
        PORTA = 0XFF;       
        PORTB = 0XFF;
        __delay_ms(200);
        for( i=0; i<7; i++ )  // prende de a uno leds
        {                     //dejando encendidos todos los anteriores los puertos A y B
            if(i == 5)
            {
                //continue;
                PORTA = 0X40;
                __delay_ms(200);
            }
            PORTA= PORTA<<1;
            PORTB= PORTB>>1;
            __delay_ms(500);
           
        }
       
        /*-----------------------------------------------------------------------------*/
        PORTA = 0X00;       
        PORTB = 0X80;
        __delay_ms(200);
       
       
    } while(1);
}



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Juego luces PIC16F628A
« Respuesta #1 en: 08 de Abril de 2020, 20:51:47 »
Si no hay un patron, y los tiempos cambian, entonces conviene hacer 3 arrays gigantes constante para que se guarde en la FLASH, y de ahi hacer algo asi:


Código: C
  1. while(1)
  2. {
  3.   PORTA = ArrayA[i];
  4.   PORTB = ArrayB[i];
  5.   delay_100ms(Arrayt[i]);
  6.   if(i = sizeof ArrayA) i = 0;
  7. }

Todos del mismo tamaño, Crear una funcion que espere varias veces 100ms, segun el parametro de la misma, es decir delay_100ms(2) serian 200ms.
Y de alli resumirlo todo en esos Arrays..