# PIC18F45K22 Timer 1 not working properly...

#### Paras77

Joined Mar 4, 2016
12
I am using PIC18f45k22's timer 1 to display D.PIC for 1 second on my 4 digit 7-segment led and after 1 second led should remain off for next 1 second.
This should continue. I am getting what i wrote above but the problem is that when D.PIC is displayed, it is continuously flashing. I want it to remain constant. I have posted my code below.I am using 8Mhz Freq.
C:
unsigned short i=1,cnt,digit_no=0,DISPLAY[4]={0,0,0,0};

void interrupt() {
if (TMR1IF_bit) {
cnt++;

if(cnt<=8){
switch (digit_no){
case 0:{
PORTB=0;
PORTD= DISPLAY[0];
PORTB = 0b00000001;
digit_no=1;
break;
}
case 1:{
PORTB=0;
PORTD = DISPLAY[1];
PORTB = 0b00000010;
digit_no=2;
break;
}
case 2: {
PORTB=0;
PORTD = DISPLAY[2];
PORTB = 0b00000100;
digit_no=3;
break;
}
case 3:{
PORTB=0;
PORTD = DISPLAY[3];
PORTB = 0b00001000;
digit_no=0;
break;
}
}
}
else if((cnt>8)&&(cnt<16)){
PORTB=0;
}
else if(cnt>16)
cnt=0;
TMR1IF_bit = 0;
TMR1H = 0x00;
TMR1L = 0x00;
}
}

void main() {

LATB  = 0;                  // Initialize PORTB
TRISB = 0;                  // PORTB is output
LATD  = 0;                  // Initialize PORTD
TRISD = 0;                  // PORTD is output
T1CON = 0x21;               // Timer1 settings                          //1:4 Prescaler
TMR1IF_bit = 0;             // clear TMR1IF
TMR1H = 0x0;               // Initialize Timer1 register
TMR1L = 0x00;
TMR1IE_bit = 1;             // enable Timer1 interrup
cnt =   0;                  // initialize cnt
INTCON = 0xC0;              // Set GIE, PEIE

do {
DISPLAY[0] = 57;                               // C
DISPLAY[1] = 6;                                // I
DISPLAY[2] = 115;                            // P
DISPLAY[3] = 249;                           // D.
} while (1);
}

Last edited by a moderator:

#### AlbertHall

Joined Jun 4, 2014
11,498
During the display on time, each digit is displayed for 1/8 of a second and is then off for 3/8 second. This will be very noticeable.
Use a shorter period for timer 1 (perhaps load timer 1 with some value rather than than setting to zero), then modify the testing of cnt. Now each digit is still on for only 1/4 of the time but the cycling is much quicker so persistence of vision means that the eye sees all digits lit.

#### Paras77

Joined Mar 4, 2016
12
Thank you for your reply.. i did not understand why you have written 1/8 and 3/8 of seconds? please elobrate.

#### AlbertHall

Joined Jun 4, 2014
11,498
Your timer interrupt occurs every 1/8 of a second. During the first second, when the display is on, each timer interrupt displays the next digit and as there are four digits, each digit is on for 1/8 second and off for the 3/8 of a second while the other three digits are displayed in turn.

#### GopherT

Joined Nov 23, 2012
8,012
Put your code inside '['code] '['/code] tags so we can see the formatting.

Do NOT use the quote marks when you use code tags. I needed them or they would disappear as they try to display code.