Här är koden, visningen fungerar bra, så det är troligtvis fel någonstans i sista delen.
Kod: Markera allt
unsigned short shifter, digit, portd_index;
unsigned int number;
unsigned short portd_array[4];
unsigned short digit1 = 0;
unsigned short digit2 = 0;
unsigned short digit3 = 0;
unsigned short digit4 = 0;
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0x3F;
case 1 : return 0x06;
case 2 : return 0x5B;
case 3 : return 0x4F;
case 4 : return 0x66;
case 5 : return 0x6D;
case 6 : return 0x7D;
case 7 : return 0x07;
case 8 : return 0x7F;
case 9 : return 0x6F;
} //case end
}//~
void interrupt() {
PORTA = 0; // Turn off all 7seg displays
PORTB = portd_array[portd_index]; // bring appropriate value to PORTB
PORTA = shifter; // turn on appropriate 7seg. display
// move shifter to next digit
shifter <<= 1;
if (shifter > 8u)
shifter = 1;
// increment portd_index
portd_index++ ;
if (portd_index > 3u)
portd_index = 0; // turn on 1st, turn off 2nd 7seg.
TMR0 = 0; // reset TIMER0 value
INTCON = 0x20; // Clear TMR0IF
}
void main() {
while(1)
{
OPTION_REG = 0x80; // Timer0 settings
portd_index = 0;
shifter = 1;
TMR0 = 0;
INTCON = 0xA0; // Enable GIE, TMR0IE
PORTA = 0; // make sure that all segments are off
TRISA = 0; // designate porta pins as output
PORTB = 0; // make sure that nothing is displayed
TRISB = 0; // designate portd pins as output
portd_array[0] = mask(digit1);
portd_array[1] = mask(digit2);
portd_array[2] = mask(digit3);
portd_array[3] = mask(digit4);
digit1++;
delay_ms(500);
if (digit1 > 9)
{
digit1 = 0;
digit2++;
if (digit2 > 9)
{
digit2 = 0;
digit3++;
if (digit3 > 9)
{
digit3 = 0;
digit4++;
if (digit4 > 9)
{
digit4 = 0;
}
}
}
}
}
}