4550_timer_interrupt_and_3_7_segments_display
Avoid using too long interrupt time.
In my case, LEDs do not glow equally and I got best result at TMROL 250.
The next thing is I could not watch the INTCON register in mikroc
debugging.
Remember that I am just testing and a good one at PIC.
//POETD.b0 to a
//.....
//.....
//PORTD.b6 to g
#define dig1 PORTD.f5
#define dig10 PORTD.f6
#define dig100 PORTD.f7
unsigned int show=0;
unsigned char num1,num10,num100,cnt;
unsigned char pattern;
unsigned char display(unsigned char num)
{
unsigned char dig[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
0x7D,0x07,0x7F,0x6F};
pattern=dig[num];
return(~pattern);
}
void interrupt()
{
TMR0l=245; //2.5ms interrupt
INTCON=0x20; //check
portd=0;
if(show==1)
{
PORTB=display(num1);
dig1=1;
dig10=0;
dig100=0;
}
if(show==10)
{
PORTB=display(num1);
dig1=1;
dig10=0;
dig100=0;
PORTB=display(num10);
dig1=0;
dig10=1;
dig100=0;
}
if(show==100)
{
PORTB=display(num1);
dig1=1;
dig10=0;
dig100=0;
PORTB=display(num10);
dig1=0;
dig10=1;
dig100=0;
PORTB=display(num100);
dig1=0;
dig10=0;
dig100=1;
}
}
void main()
{
TRISA=0;
TRISC=0;
TRISD=0;
TRISB=0;
ADCON1=0x3f; //make all nit sigital on portb
TMR0l=245; //2.5ms interrupt
INTCON=0xA0;
T0CON=0xC4;
for(;;)
{
delay_ms(10);
if(cnt>999)cnt=0;
cnt=cnt+1;
if(cnt<10)
{
show=1;
num1=cnt;
}
if(cnt>=10 && cnt<=99)
{
show=10;
num1=cnt%10;
num10=cnt/10;
}
if(cnt>99)
{
show=100;
num100=cnt/100;
num10=(cnt/10)%10;
num1=cnt%10;
}
}
}
Comments
Post a Comment