AVR Sử Dụng Timer Đếm Thời Gian Hiển Thị LED 7 Thanh

Sơ đồ

Code

#include <mega16.h>

#include <delay.h>


volatile unsigned long dem;

unsigned char flash Maled[10] = {0xc0,0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8 , 0x80, 0x90};

unsigned char i;


interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

    TCNT0 = 130; // luu gia tri dem

    dem++;

}

void hienthi(unsigned int num)

{

     unsigned int ch , dv;

     //tach num luu vao bien ch va dv

     dv= num%10;  //ex: 15%10=5

     ch = num/10; //ex: 15/10=1

     //hien thi led so 1

     PORTD.3 = 0;

     PORTD.2 = 1;

     PORTC = Maled[ch];

     delay_ms(1); 

     //hien thi led so 2 

     PORTD.2 = 0;

     PORTD.3 = 1;

     PORTC = Maled[dv];

     delay_ms(1); 

}


void main(void)

{

    DDRC = 0xff; // output

    PORTC = 0x00; // Low level

    DDRD = (1<<DDD2)|(1<<DDD3); // output

    PORTD = (0<<PORTD2)|(0<<PORTD3); // Low level

    

    TCCR0 = (1<<CS01)|(1<<CS00); //prescaler = 64

    TCNT0 = 130; // x= 0.001 * 8000000 / 64 = 125

                 // TCNT0  = 255 - 125 = 130 

    TIMSK |= (1<<TOIE0); // mode Normal, cho phép ngat


    #asm ("sei")

    i=55;

    while (1)

      {

            hienthi(i); 

            if(dem>=1000)

            {

                dem=0;

                i++;

                if(i>59)i=0;

                hienthi(i);               

            }        

      }

}


Demo