hemanteda
Member level 1

Hi everyone,
This is in continuation to the 16x16 LED matrix I've been trying to build. I was having current issues earlier and as suggested in the forum I'm using ULN2003 and UDN2981 now with no hardware issues (or thats what I feel).
My current config is PIC16F877 ->74HC573->ULN->Matrix
->74HC573->UDN->100 ohm->Matrix
The problem is that I see ghost (dimly lit LED) for each LED thats on. I'm not sure if this is a hardware issue or software. The pic is running at 16Mhz (external crystal) My code is as follows (CCS, Refresh() is called using Timer0 interrupt - setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16)
void Refresh(void)
{
unsigned int8 HighByte, LowByte;
//get low byte
LowByte = make8(LED[Row_Counter],0);
//get high byte
HighByte = make8(LED[Row_Counter],1);
//output lowbyte to latch 1
Latch_Data(Latch_1, PORT_D, LowByte);
//output highbyte to latch 2
Latch_Data(Latch_2, PORT_D, HighByte);
// switch the current row on, latch 3 and 4
switch(Row_Counter)
{
case 0:
Latch_Data(Latch_3, PORT_D, 0b00000001);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 1:
Latch_Data(Latch_3, PORT_D, 0b00000010);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 2:
Latch_Data(Latch_3, PORT_D, 0b00000100);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 3:
Latch_Data(Latch_3, PORT_D, 0b00001000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 4:
Latch_Data(Latch_3, PORT_D, 0b00010000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 5:
Latch_Data(Latch_3, PORT_D, 0b00100000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 6:
Latch_Data(Latch_3, PORT_D, 0b01000000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 7:
Latch_Data(Latch_3, PORT_D, 0b10000000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 8:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00000001);
break;
case 9:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00000010);
break;
case 10:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00000100);
break;
case 11:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00001000);
break;
case 12:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00010000);
break;
case 13:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00100000);
break;
case 14:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b01000000);
break;
case 15:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b10000000);
break;
}
//increment Row_Counter
Row_Counter++;
//check and reset row counter
if(Row_Counter > 15) Row_Counter = 0;
}
//loads new data into a 74HC537 latch
//arguments pin = pin to which the latch enable is connected, data to be loaded, port on which the bus is
void Latch_Data(unsigned int16 pin, unsigned int8 port, unsigned int8 data)
{
//put latch enable pin to high
output_high(pin);
//select port connected to bus, output data on port
switch(port)
{
case 0:
output_a(data);
break;
case 1:
output_b(data);
break;
case 2:
output_c(data);
break;
case 3:
output_d(data);
break;
case 4:
output_e(data);
break;
}
//close latch
output_low(pin);
}
Any suggestions?
This is in continuation to the 16x16 LED matrix I've been trying to build. I was having current issues earlier and as suggested in the forum I'm using ULN2003 and UDN2981 now with no hardware issues (or thats what I feel).
My current config is PIC16F877 ->74HC573->ULN->Matrix
->74HC573->UDN->100 ohm->Matrix
The problem is that I see ghost (dimly lit LED) for each LED thats on. I'm not sure if this is a hardware issue or software. The pic is running at 16Mhz (external crystal) My code is as follows (CCS, Refresh() is called using Timer0 interrupt - setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16)
void Refresh(void)
{
unsigned int8 HighByte, LowByte;
//get low byte
LowByte = make8(LED[Row_Counter],0);
//get high byte
HighByte = make8(LED[Row_Counter],1);
//output lowbyte to latch 1
Latch_Data(Latch_1, PORT_D, LowByte);
//output highbyte to latch 2
Latch_Data(Latch_2, PORT_D, HighByte);
// switch the current row on, latch 3 and 4
switch(Row_Counter)
{
case 0:
Latch_Data(Latch_3, PORT_D, 0b00000001);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 1:
Latch_Data(Latch_3, PORT_D, 0b00000010);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 2:
Latch_Data(Latch_3, PORT_D, 0b00000100);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 3:
Latch_Data(Latch_3, PORT_D, 0b00001000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 4:
Latch_Data(Latch_3, PORT_D, 0b00010000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 5:
Latch_Data(Latch_3, PORT_D, 0b00100000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 6:
Latch_Data(Latch_3, PORT_D, 0b01000000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 7:
Latch_Data(Latch_3, PORT_D, 0b10000000);
Latch_Data(Latch_4, PORT_D, 0b00000000);
break;
case 8:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00000001);
break;
case 9:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00000010);
break;
case 10:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00000100);
break;
case 11:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00001000);
break;
case 12:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00010000);
break;
case 13:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b00100000);
break;
case 14:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b01000000);
break;
case 15:
Latch_Data(Latch_3, PORT_D, 0b00000000);
Latch_Data(Latch_4, PORT_D, 0b10000000);
break;
}
//increment Row_Counter
Row_Counter++;
//check and reset row counter
if(Row_Counter > 15) Row_Counter = 0;
}
//loads new data into a 74HC537 latch
//arguments pin = pin to which the latch enable is connected, data to be loaded, port on which the bus is
void Latch_Data(unsigned int16 pin, unsigned int8 port, unsigned int8 data)
{
//put latch enable pin to high
output_high(pin);
//select port connected to bus, output data on port
switch(port)
{
case 0:
output_a(data);
break;
case 1:
output_b(data);
break;
case 2:
output_c(data);
break;
case 3:
output_d(data);
break;
case 4:
output_e(data);
break;
}
//close latch
output_low(pin);
}
Any suggestions?