Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: avaunzaz en 08 de Abril de 2020, 16:14:08
Título: Juego luces PIC16F628A
Publicado por: avaunzaz 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.
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); }
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); }
Título: Re:Juego luces PIC16F628A
Publicado por: KILLERJC 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
while(1)
{
PORTA = ArrayA[i];
PORTB = ArrayB[i];
delay_100ms(Arrayt[i]);
if(i =sizeof ArrayA) i =0;
}
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..