Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

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.

Latest threads

New Articles From Microcontroller Tips

Back
Top