C question 8x8 RGB led 18f4620

Status
Not open for further replies.

gabeNC

Member
I've got a 8x8 RGB led array with transistors driving the columns. Looking for a good way to control each "pixel".

Is this an efficient way to pull this off? thanks.

Code:
void columnDriver(char columnLocation)
   {
    if (columnLocation == 0){PORTD=0b00000000;}
    if (columnLocation == 1){LATDbits.LATD0=1;}
    if (columnLocation == 2){LATDbits.LATD1=1;}
    if (columnLocation == 3){LATDbits.LATD2=1;}
    if (columnLocation == 4){LATDbits.LATD3=1;}
    if (columnLocation == 5){LATDbits.LATD4=1;}
    if (columnLocation == 6){LATDbits.LATD5=1;}    
    if (columnLocation == 7){LATDbits.LATD6=1;}
    if (columnLocation == 8){LATDbits.LATD7=1;}
    }
   
void RowA(char led1,char led2,char led3,char columnLocation,char delay)
    {
    // led1 = green    led2 = blue    led3 = red 
    columnDriver(columnLocation);
    if (led1 == 0){LATAbits.LATA0=0;}
    if (led1 == 1){LATAbits.LATA0=1;}
    if (led2 == 0){LATAbits.LATA1=0;}
    if (led2 == 1){LATAbits.LATA1=1;}
    if (led3 == 0){LATAbits.LATA2=0;}
    if (led3 == 1){LATAbits.LATA2=1;}

    Delay1KTCYx(delay);
    } // end RowA

void knight (int led1,int led2, int led3,char columnLocation,char delay,char direction,char fullbar)
    {
    unsigned char i;
    if (direction == 0) 
    {
      for(i=1;i<9;i++)
       {
       columnA(led1,led2,led3,i,delay);
        if (fullbar == 0) { columnA(0,0,0,0,0);}
       }
    }
    if (direction == 1) 
    {
    for(i=8;i>0;i--)
        {
        columnA(led1,led2,led3,i,delay);
        if (fullbar == 0) { columnA(0,0,0,0,0);}
        }
    }    
    }  // end knight rider type pattern


 while (1)
     { 
      // parameters
      // knight (led1,led2,led3,columnLocation,delay,direction,fullbar)
    knight(1,0,0,1,48,0,1);
    RowA(0,0,0,0,32);  // turn off
    knight(1,0,0,1,48,1,1);    
    RowA(0,0,0,0,32); // turn off
    }
 
Just some code simplification.... I don't know if this makes it better for you to understand or not..
Code:
void columnDriver(char columnLocation)
     {
      if (columnLocation == 0){PORTD=0b00000000;}
		else LATD = LATD|(0b00000001<<(columnLocation-1));
     }


void RowA(char led1,char led2,char led3,char columnLocation,char delay)
    {
 // led1 = green    led2 = blue    led3 = red 
columnDriver(columnLocation);
LATAbits.LATA0=led1;
LATAbits.LATA1=led2;
LATAbits.LATA2=led3;
Delay1KTCYx(delay);
    } // end RowA
 
Last edited:
Ahhh yes makes sense! Bit-shifting.

I've changed the row to allow for easier loops... how's this?

Thanks!


Code:
void columnDriver(char columnLocation)
       {
    if (columnLocation == 0){PORTD=0b00000000;}
    else LATD = LATD|(0b00000001<<(columnLocation-1));
    }
   
void Row(char row,char led1, char led2, char led3, char columnLocation, char delay)
    {
    columnDriver(columnLocation);
    // clear all
    if (row == 0)
        {
        PORTA=0x00;
        PORTB=0x00;
        PORTC=0x00;
        PORTD=0x00;
        PORTE=0x00;
        }
    if (row == 1) 
        {
        LATAbits.LATA0=led1;
        LATAbits.LATA1=led1;
        LATAbits.LATA2=led1;
        }
    if (row == 2)
        {
        LATEbits.LATE0=led1;
        LATEbits.LATE1=led1;
        LATEbits.LATE2=led1;    
        }
    if (row == 3) 
        {
        LATAbits.LATA3=led1;
        LATAbits.LATA5=led1;
        LATAbits.LATA6=led1;
        }
    if (row == 4)
        {
        LATCbits.LATC0=led1;
        LATCbits.LATC1=led1;
        LATCbits.LATC2=led1;    
        }
    if (row == 5) 
        {
        LATCbits.LATC3=led1;
        LATCbits.LATC4=led1;
        LATCbits.LATC5=led1;
        }
    if (row == 6)
        {
        LATBbits.LATB0=led1;
        LATBbits.LATB1=led1;
        LATBbits.LATB2=led1;    
        }
    if (row == 7) 
        {
        LATBbits.LATB3=led1;
        LATBbits.LATB4=led1;
        LATBbits.LATB5=led1;
        }
    if (row == 8)
        {
        LATCbits.LATC6=led1;
        LATCbits.LATC7=led1;
        LATBbits.LATB6=led1;    
        }
    //Delay1KTCYx(delay);
    }

void knight (char row,char led1,char led2, char led3,char columnLocation,char delay,char direction,char fullbar)
    {
    unsigned char i;
    if (direction == 0) 
      {
      for(i=1;i<9;i++)
       {
        Row(row,led1,led2,led3,i,delay);
        if (fullbar == 0) {       Row(0,0,0,0,0,0);}
       }
      }
    if (direction == 1) 
      {
    for(i=8;i>0;i--)
        {
        Row(row,led1,led2,led3,i,delay);
        if (fullbar == 0) { Row(0,0,0,0,0,0);}
        }
      }    
    }

void main (void)
{
  OSCCON = 0x62;                    // Int Osc, 4Mhz
  OSCTUNEbits.PLLEN = 1;      // Set up system clock at 4MHz x 4
  TRISA = 0;
  TRISB = 0;    
  TRISC = 0;
  TRISD = 0;
  TRISE = 0;

  while (1)
    { 
    // since RA4 is sink only wire to a single
    // LED for indicator start of while loop
      LATAbits.LATA4=1;
      //Delay1KTCYx(0);
      LATAbits.LATA4=0;
      //Delay1KTCYx(0);
      LATAbits.LATA4=1;
      //Delay1KTCYx(0);
      LATAbits.LATA4=0;
    
    // void Row(row,led1,led2,led3,columnLocation,delay)
    Row(1,1,1,0,1,1);
    Row(1,1,0,0,1,1);
    }
}
 
else if

You may want to change the if to else if, because if the condition is executed why check everything else again? If you have the Microchip simulator working, step through your function, then try the one I posted, it will execute one item then continue with the code without trying everything else bellow it...

Code:
void Row(char row,char led1, char led2, char led3, char columnLocation, char delay)
    {
    columnDriver(columnLocation);
    // clear all
    if (row == 0)
        {
        PORTA=0x00;
        PORTB=0x00;
        PORTC=0x00;
        PORTD=0x00;
        PORTE=0x00;
        }
    else if (row == 1) 
        {
        LATAbits.LATA0=led1;
        LATAbits.LATA1=led1;
        LATAbits.LATA2=led1;
        }
    else if (row == 2)
        {
        LATEbits.LATE0=led1;
        LATEbits.LATE1=led1;
        LATEbits.LATE2=led1;    
        }
    else if (row == 3) 
        {
        LATAbits.LATA3=led1;
        LATAbits.LATA5=led1;
        LATAbits.LATA6=led1;
        }
    else if (row == 4)
        {
        LATCbits.LATC0=led1;
        LATCbits.LATC1=led1;
        LATCbits.LATC2=led1;    
        }
    else if (row == 5) 
        {
        LATCbits.LATC3=led1;
        LATCbits.LATC4=led1;
        LATCbits.LATC5=led1;
        }
    else if (row == 6)
        {
        LATBbits.LATB0=led1;
        LATBbits.LATB1=led1;
        LATBbits.LATB2=led1;    
        }
    else if (row == 7) 
        {
        LATBbits.LATB3=led1;
        LATBbits.LATB4=led1;
        LATBbits.LATB5=led1;
        }
     else if (row == 8)
        {
        LATCbits.LATC6=led1;
        LATCbits.LATC7=led1;
        LATBbits.LATB6=led1;    
        }
    //Delay1KTCYx(delay);
    }
 
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…