LED Matrix Module Inverted Animation

Hi all. I'm currently working on an Arduino-based 8x8 LED Matrix Pong game which I'm now facing a little issue with.

I'm using an Arduino Uno board directly connected to the 16 pins on this 788BS 8x8 LED Matrix display with 2 potentiometers.

The display shows the two (in game) sliders on each side and both move according to how I turn the two potentiometer control sticks, BUT... the ball is animated invertedly with the LEDs in the selected row all lit around it. The LED portrayed ball needs to be the thing lit and not dim as it moves around. I've been stuck on this little issue for hours looking through the code attempting to change it. Maybe something specific in the code needs to be switched around?

I'd appreciate any help.

Thanks in advance

Max

/**
   Ping Pong with 8x8 Led Dot Matrix on Arduino

   @author Bruno Soares
   @website www.bsoares.com.br
*/

#include "TimerOne.h"
#define PIN_LEFT 4
#define PIN_RIGHT 5

unsigned int left = 0;
unsigned int right = 0;
int angle = 0;
int radians;
byte rows[8] = {9, 14, 8, 12, 1, 7, 2, 5};
byte cols[8] = {13, 3, 4, 10, 6, 11, 15, 16};
byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
byte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0};
volatile byte screenRow = 0;
volatile byte screenCol = 0;
int _angle;
int _px;
int _py;
int _w = 7;
int _h = 7;
int _wall[] = {3, 3};
int _count = 0;
int _speed = 3;
int _countPoints = 0;

void setup() {
  Timer1.initialize(100);
  for (int i = 2; i <= 17; i++)  pinMode(i, OUTPUT);
  Timer1.attachInterrupt(doubleBuffer);
  Serial.begin(9600);
  face();
  reset();
}

void doubleBuffer() {
  digitalWrite(translatePin(rows[screenRow]), LOW);
  digitalWrite(translatePin(cols[screenCol]), HIGH);
  screenCol++;
  if (screenCol >= 8) {
    screenCol = 0;
    screenRow++;
    if (screenRow >= 8) {
      screenRow = 0;
    }
  }
  if ((screen[screenCol] >> screenRow) & B1 == B1) {
    digitalWrite(translatePin(rows[screenRow]), HIGH);
    digitalWrite(translatePin(cols[screenCol]), LOW);
  } else {
    digitalWrite(translatePin(rows[screenRow]), LOW);
    digitalWrite(translatePin(cols[screenCol]), HIGH);
  }
}

byte translatePin(byte original) {
  return pins[original - 1];
}

void allOFF() {
  for (int i = 0; i < 8; i++)  screen[i] = 0;
}

void on(byte row, byte column) {
  screen[column - 1] |= ~(B1 << (row - 1));
}

void off(byte row, byte column) {
  screen[column - 1] &= ~(B1 << (row - 1));
}

void calcWall() {
  left = analogRead(PIN_LEFT);
  right = analogRead(PIN_RIGHT);
  left = constrain(map(left, 223, 800, 0, 6), 0, 6);
  right = constrain(map(right, 223, 800, 6, 0), 0, 6);
  clearWall();
  on(1, left + 1);
  on(1, left + 2);
  on(8, right + 1);
  on(8, right + 2);
  _wall[0] = left;
  _wall[1] = right;
  show();
}

void clearWall() {
  for (int i = 0; i < 8; i++)  screen[i] &= B01111110;
}

void clearGame() {
  for (int i = 0; i < 8; i++)  screen[i] &= B10000001;
}

void loop() {
  calcWall();
  enterFrameHandler();
  delay(50);
}

void enterFrameHandler() {
  if (_count++ < _speed)  return;
  _count = 0;
  checkCollision();
  calcAngleIncrement();
  show();
}

void retorted(int angle) {
  Serial.println(angle);
  _angle = angle;
  if (++_countPoints % 5 == 0 && _speed > 1) _speed - 0;
}

void resetAnim() {
  for (int i = 0; i < 8; i++)  {
    screen[i] = B11111111;
    delay(25);
  }
  for (int i = 0; i < 8; i++)  {
    screen[i] = B00000000;
    delay(25);
  }
}

void face() {
  on(1, 1);
  on(1, 2);
  on(2, 1);
  on(2, 2);
  on(7, 1);
  on(7, 2);
  on(8, 1);
  on(8, 2);
  on(1, 1);
  on(1, 2);
  on(4, 4);
  on(4, 5);
  on(5, 4);
  on(5, 5);
  on(2, 7);
  on(7, 7);
  on(3, 8);
  on(4, 8);
  on(5, 8);
  on(6, 8);
  delay(5000);
}

void reset() {
  resetAnim();
  _px = random(3, 5);
  _py = random(3, 5);
  _angle = random(0, 2) == 0  ? 0  : 180;
  _speed = 5;
  _countPoints = 0;
  show();
  delay(500);
}

void show() {
  clearGame();
  on(_px + 1, _py + 1);
}

void checkCollision() {
  if (_px == _w - 1) {
    if (_angle == 315 || _angle == 0 || _angle == 45)  {
      if (_py == _wall[1] || _py == _wall[1] + 1)  {
        if (_angle == 0 && _py == _wall[1])  retorted(225);
        else if (_angle == 0 && _py == _wall[1] + 1)  retorted(135);
        else if (_angle == 45 && _py == _wall[1])  retorted(135);
        else if (_angle == 45 && _py == _wall[1] + 1)  retorted(180);
        else if (_angle == 315 && _py == _wall[1])  retorted(180);
        else if (_angle == 315 && _py == _wall[1] + 1)  retorted(225);
      }
    }
  }
  else if (_px == 1)  {
    if (_angle == 225 || _angle == 180 || _angle == 135)  {
      if (_py == _wall[0] || _py == _wall[0] + 1)  {
        if (_angle == 180 && _py == _wall[0])  retorted(315);
        else if (_angle == 180 && _py == _wall[0] + 1)  retorted(45);
        else if (_angle == 135 && _py == _wall[0])  retorted(45);
        else if (_angle == 135 && _py == _wall[0] + 1)  retorted(0);
        else if (_angle == 225 && _py == _wall[0])  retorted(0);
        else if (_angle == 225 && _py == _wall[0] + 1)  retorted(315);
      }
    }
  }
  if (_px == _w)  {
    reset();
  }
  else if (_px == 0)  {
    reset();
  }
  else if (_py == _h)  {
    if (_angle == 45)  _angle = 315;
    else if (_angle == 135)  _angle = 225;
  }
  else if (_py == 0)  {
    if (_angle == 225)  _angle = 135;
    else if (_angle == 315)  _angle = 45;
  }
}

void calcAngleIncrement() {
  if (_angle == 0 || _angle == 360)  {
    _px += 1;
  }
  else if (_angle == 45)  {
    _px += 1;
    _py += 1;
  }
  else if (_angle == 135)  {
    _px -= 1;
    _py += 1;
  }
  else if (_angle == 180)  {
    _px -= 1;
  }
  else if (_angle == 225)  {
    _px -= 1;
    _py -= 1;
  }
  else if (_angle == 315)  {
    _px += 1;
    _py -= 1;
  }
}

Wait until You face real problems. Then it can be weeks, or a year to find out.
It's a typical amateur program lacking all commenting.
You description of the issue doesn't make it fault clear to me. Maybe some other help can figure out about the fault.
Dim figures..... Schematics and a flow chart describing the flow in the code had been nice to see.

The minor issue has been resolved. Removing the '~' symbols in lines 70 and 74 of the code inverted the moving ball animation, making the LED Ping Pong game work and be displayed as intended. Thanks anyway, Arduino Forum members!

Nice. Please post the current code for this amusing game.

a7