Mplab X con compilador Xc8 juego de ping-pong

Hola gente! Pues estoy empezando a entrar en el mundo de los microcontroladores y soy estudiante.
Tengo una practica (para ir aprendiendo a usar el programa) y es hacer un ping pong con el pic16f886 en una matriz de leds de 8x8 y controlar las barras que son laterales con push boton.

Hasta ahora solo he podido hacer que se muevan las barras laterales pero no se como hacer para que la pelota se mueva y lleve su trayectoria y que al momento de chocar con el borde rebote.

¿Alguien me puede ayudar?

Hasta ahora este es el código que llevo:
Código:
#include <xc.h>
#define _XTAL_FREQ 8000000
// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF

int main(void) {

    unsigned char i;

    int jugador1,jugador2;
    int bolitax,bolitay;
  

    OSCCONbits.SCS=1;
    OSCCONbits.IRCF=0b111;

    PORTA=0; //limpia puerto A
    PORTB=0; //Limpia puerto B
    PORTC=0; // Limpia el puerto C

    ANSEL=0;  //Configura como digital el puerto A
    ANSELH=0;  //Configura como digital el puerto B

    TRISA=0b00000000;  // Todo el puerto A como salida
    TRISB=0b00000000;  // Todo el puerto B como entrada
    TRISC=0b00001111;

    jugador1=28;
    jugador2=28;
    bolitax=0b00001000;
    bolitay=0b11110111;

    while(1)
    {
       
        if(PORTCbits.RC0==1 && jugador1 < 224)jugador1=jugador1<<1;
        __delay_ms(20);
        if(PORTCbits.RC1==1 && jugador1 > 7)jugador1=jugador1>>1;
        __delay_ms(20);
        if(PORTCbits.RC2==1 && jugador2 < 224)jugador2=jugador2<<1;
        __delay_ms(20);
        if(PORTCbits.RC3==1 && jugador2 > 7)jugador2=jugador2>>1;
        __delay_ms(20);
        
        PORTA=jugador1;
        PORTB=0b11111110;
        __delay_ms(20);
        PORTA=bolitax;
        PORTB=bolitay;
        __delay_ms(20);
        PORTA=jugador2;
        PORTB=0b01111111;
        __delay_ms(20);
  
    }

    return;
}
 
Última edición por un moderador:
Bienvenido a los foros de electrónica, darknessrty.

Debes convertir la posición X de la bolita en el valor de columna de LED que se debe iluminar, y la Y en el bit dentro de esa columna (o al revés, dependiendo de cómo hayas dispuesto la matriz de LED).

Fíjate que determinar la posición de la X es muy parecido a como lo haces con las palas de los jugadores.

Ejemplo: si bolitax contiene la posición de la bola (entre 0 y 7), calcular la posición X es tan sencillo como hacer 1 << bolitax (o 128 >> bolitax, según el origen de tus coordenadas dentro de la matriz).

Para el caso de la Y, se trata de activar la fila que coincida con el valor de bolitaY.

Juntándolo todo, sería algo así (no probado):

Código:
    PORTA = 1 << bolitax;
    PORTB = 0xFF ^ (1 << bolitay);
El operador '^' es el o-exclusivo. La operación en el PORTB lo que hace es mandar todos '1' menos en la la posición de bolitay.

Para hacer que se mueva, debes actualizar los valores de bolitax y bolitay según otras variables direccionx y direcciony:

bolitax += direccionx;
bolitay += direcciony;

Para los rebotes, debes comprobar si la bolita ha llegado a alguno de los cuatro márgenes, y en ese caso, cambiar o invertir el valor de las direcciones:

if (bolitay == 0 || bolitay == 7) direcciony = -direcciony;

En el caso de la x es distinto: hay que comprobar que hay una pala golpeando a la bolita.

if (bolitax == 0 && jugador1 == bolitax) direccionx = 1;
if (bolitax == 7 && jugador2 == bolitax) direccionx = -1;
 
Última edición por un moderador:
Bienvenido a los foros de electrónica, darknessrty.

Debes convertir la posición X de la bolita en el valor de columna de LED que se debe iluminar, y la Y en el bit dentro de esa columna (o al revés, dependiendo de cómo hayas dispuesto la matriz de LED).

Fíjate que determinar la posición de la X es muy parecido a como lo haces con las palas de los jugadores.

Ejemplo: si bolitax contiene la posición de la bola (entre 0 y 7), calcular la posición X es tan sencillo como hacer 1 << bolitax (o 128 >> bolitax, según el origen de tus coordenadas dentro de la matriz).

Para el caso de la Y, se trata de activar la fila que coincida con el valor de bolitaY.

Juntándolo todo, sería algo así (no probado):

Código:
    PORTA = 1 << bolitax;
    PORTB = 0xFF ^ (1 << bolitay);
El operador '^' es el o-exclusivo. La operación en el PORTB lo que hace es mandar todos '1' menos en la la posición de bolitay.

Para hacer que se mueva, debes actualizar los valores de bolitax y bolitay según otras variables direccionx y direcciony:

bolitax += direccionx;
bolitay += direcciony;

Para los rebotes, debes comprobar si la bolita ha llegado a alguno de los cuatro márgenes, y en ese caso, cambiar o invertir el valor de las direcciones:

if (bolitay == 0 || bolitay == 7) direcciony = -direcciony;

En el caso de la x es distinto: hay que comprobar que hay una pala golpeando a la bolita.

if (bolitax == 0 && jugador1 == bolitax) direccionx = 1;
if (bolitax == 7 && jugador2 == bolitax) direccionx = -1;

Oooh muchas gracias!! tenia la idea pero con lo que me dices ya se me aclararon muchas cosas, Gracias!!:D
 
Atrás
Arriba