Jag håller på med mitt första PIC-project där jag använder en PIC24FJ64GA004 och C30.
I projektet använder jag 5 st 7-segments displayer. LEDs från displayerna är parallellt kopplade till 8 st portar på PICen. Katoden på varje display är kopplad till en N-MOSFET vars gate är kopplad till en port.
Jag har skrivit en funktion som tar ett tecken och ett displaynummer och som tänder rätt LEDs och kopplar till angiven MOSFET.
Detta funkar precis som det ska om jag statiskt tänder en display, men när jag försöker cykla flera displayer blir allt jättekonstigt.
Mellan varje displaytändning gör jag en liten paus med en for loop, och om jag jag gör en så lång paus så att jag ser varje cykel kan jag se att det är allsköns kombinationer av LEDs som tänds, samt att det ofta är flera displayer som tänds samtidigt.
Jag har uppenbarligen missat något viktigt här. Kan någon ge mig en hint?
Här är koden till funktionen:
Kod: Markera allt
//*** function dispFig ***
//*** Takes a character ((-2)-9), a display number
//*** and wether a dot should be displayed or not.
//*** -1 is a minus sign and -2 is no LEDs lit.
//*** All displays are reset before setting the new display.
void dispFig(int figure, int displayNo, int dot)
{
//pins to segments
//RB8 = g
//RB7 = f
//RB6 = e
//RB5 = d
//RC5 = c
//RC4 = b
//RC3 = a
//RA2 = dp
//DISP1-5 = RB9, RC6-9
//resetting all displays ground connections
_RB9 = 0;
_RC6 = 0;
_RC7 = 0;
_RC8 = 0;
_RC9 = 0;
switch (displayNo)
{
case 1:
_RB9 = 1;
break;
case 2:
_RC6 = 1;
break;
case 3:
_RC7 = 1;
break;
case 4:
_RC8 = 1;
break;
case 5:
_RC9 = 1;
break;
default:
break;
}
//sets the different display leds
switch (figure)
{
case -1: //-sign
{
_RB8 = 1;
_RC3 = _RC4 = _RC5 = _RB5 = _RB6 = _RB7 = 0;
break;
} //empty, no leds lit
case -2:
{
_RC3 = _RC4 = _RC5 = _RB5 = _RB6 = _RB7 = _RB8 = 0;
break;
}
case 0:
{
_RB8 = 0;
_RC3 = _RC4 = _RC5 = _RB5 = _RB6 = _RB7 = 1;
break;
}
case 1:
{
_RC3 = _RB5 = _RB6 = _RB7 = _RB8 = 0;
_RC4 = _RC5 = 1;
break;
}
case 2:
{
_RC5 =_RB7 = 0;
_RC3 = _RC4 = _RB5 = _RB6 = _RB8 = 1;
break;
}
case 3:
{
_RB6 = _RB7 = 0;
_RC3 = _RC4 = _RC5 = _RB5 = _RB8 = 1;
break;
}
case 4:
{
_RC3 = _RB5 = _RB6 = 0;
_RC4 = _RC5 = _RB7 = _RB8 = 1;
break;
}
case 5:
{
_RC4 = _RB6 = 0;
_RC3 = _RC5 = _RB5 = _RB7 = _RB8 = 1;
break;
}
case 6:
{
_RC4 = 0;
_RC3 = _RC5 = _RB5 = _RB6 = _RB7 = _RB8 = 1;
break;
}
case 7:
{
_RB5 = _RB6 = _RB7 = _RB8 = 0;
_RC3 = _RC4 = _RC5 = 1;
break;
}
case 8:
{
_RB5 = _RB6 = _RB7 = _RB8 = _RC3 = _RC4 = _RC5 = 1;
break;
}
default:
{
break;
}
}
if (dot)
_RA4 = 1;
else
_RA4 = 0;
return;
}