Atmega16 Đồng Hồ Số Hiển Thị LED 7 Đoạn Dùng Timer - CodeVision

Sơ đồ

Code Cách 1:

#include <mega16.h>

#include <delay.h>

#define UP PINB.0

#define DN PINB.1

#define OK PINB.2


volatile unsigned long dem;

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

eeprom unsigned char gio=0, phut=0, giay=0;

unsigned char time=0;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

    TCNT0 = 130; // luu gia tri dem

    dem++;

}

void hienthigiay(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 = 0x00;

     PORTD.4 = 1;

     PORTC = Maled[ch];

     delay_ms(2); 

     //hien thi led so 2  

     PORTD = 0x00;

     PORTD.5 = 1;

     PORTC = Maled[dv];

     delay_ms(2); 

}

void hienthiphut(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 3  

     PORTD = 0x00;

     PORTD.2 = 1;

     PORTC = Maled[ch];

     delay_ms(2); 

     //hien thi led so 4 

     PORTD = 0x00;

     PORTD.3 = 1;

     PORTC = Maled[dv];

     delay_ms(2); 

}


void hienthigio(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 4 

     PORTD = 0x00;

     PORTD.0 = 1;

     PORTC = Maled[ch];

     delay_ms(2); 

     //hien thi led so 5 

     PORTD = 0x00;

     PORTD.1 = 1;

     PORTC = Maled[dv];

     delay_ms(2); 

}

void _creat_time()

{

    if(dem>=1000)

    {

        dem=0;

        giay++;

        if(giay>59)

        {

            giay=0; 

            phut++;       

        }

        if(phut>59)

        {

            phut=0; 

            gio++;       

        }

        if(gio>23)

        {

            gio=0;       

        }        

    }  

}

void _get_time(unsigned char gio,unsigned char phut,unsigned char giay)

{            

     hienthigio(gio);

     hienthiphut(phut);

     hienthigiay(giay);     

}


void _set_giay()

{ 

    delay_ms(150);

    PORTD.4 = 0;

    PORTD.5 = 0;  

    delay_ms(150);

    hienthigiay(giay);   

}

void _set_phut()

{ 

    delay_ms(150);

    PORTD.2 = 0;

    PORTD.3 = 0;  

    delay_ms(150);

    hienthiphut(phut);   

}

void _set_gio()

{ 

    delay_ms(150);

    PORTD.0 = 0;

    PORTD.1 = 0;  

    delay_ms(150);

    hienthigio(gio);   

}

void main(void)

{

    

    DDRA = 0xff; // input

    PORTA = 0x00; // Tro keo len

    DDRB = 0x00; // input

    PORTB = 0xff; // Tro keo len

    DDRC = 0xff; // output

    PORTC = 0x00; // Low level

    DDRD = (1<<DDD6)|(1<<DDD5)|(1<<DDD4)|(1<<DDD3)|(1<<DDD2)|(1<<DDD1)|(1<<DDD0); // output

    PORTD = (0<<PORTD6)|(0<<PORTD5)|(0<<PORTD4)|(0<<PORTD3)|(0<<PORTD2)|(0<<PORTD1)|(0<<PORTD0); // 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")

    while (1)

      {

            if(OK==0)

            {

                time++;

                if(time>3)time=0;

                while(OK==0);

            }

    

            switch(time)

            {

                case 0:

                {

                    _creat_time();                     

                    _get_time(gio,phut,giay);  

                    if(giay%2==0){PORTA.7 = 1;}  

                    else{PORTA.7 = 0;}

                    break;

                }

                case 1:

                {

                    _set_giay(); 

                    if(UP==0)

                    {

                        giay++;

                        if(giay>59)giay=0;

                        while(UP==0){hienthigiay(giay);}

                    } 

                    if(DN==0)

                    {

                        giay--;

                        if(giay==255)giay=59;

                        while(DN==0){hienthigiay(giay);}

                    } 

                    break;

                }

                case 2:

                {

                    _set_phut(); 

                    if(UP==0)

                    {

                        phut++;

                        if(phut>59)phut=0;

                        while(UP==0);

                    }   

                    if(DN==0)

                    {

                        phut--;

                        if(phut==255)phut=59;

                        while(DN==0){hienthiphut(phut);}

                    } 

                    break;

                }

                case 3:

                {

                    _set_gio(); 

                    if(UP==0)

                    {

                        gio++;

                        if(gio>23)gio=0;

                        while(UP==0);

                    }

                    if(DN==0)

                    {

                        gio--;

                        if(gio==255)gio=23;

                        while(DN==0){hienthigio(gio);}

                    } 

                    break;

                }

            }    

      }

}

Code Cách 2:

/******************************************************* Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *******************************************************/ #include <mega16.h> #include <delay.h> #define UP PINB.0 #define DN PINB.1 #define OK PINB.2 volatile unsigned long dem;unsigned char flash Maled[10] = {0xc0,0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8 , 0x80, 0x90};eeprom unsigned char gio, phut, giay;unsigned char index;interrupt [TIM0_OVF] void timer0_ovf_isr(void){ TCNT0 = 130; // luu gia tri dem dem++;}//on_h,on_m,on_s de bat tat led hien thi gio, phut, giay void _show_time(unsigned char on_h,unsigned char on_m,unsigned char on_s,unsigned char h,unsigned char m,unsigned char s){ //hien thi gio PORTD = 0x00; PORTD.0 = on_h; PORTC = Maled[h/10]; delay_ms(1); PORTD = 0x00; PORTD.1 = on_h; PORTC = Maled[h%10]; delay_ms(1); //hien thi phut PORTD = 0x00; PORTD.2 = on_m; PORTC = Maled[m/10]; delay_ms(1); PORTD = 0x00; PORTD.3 = on_m; PORTC = Maled[m%10]; delay_ms(1); //hien thi giay PORTD = 0x00; PORTD.4 = on_s; PORTC = Maled[s/10]; delay_ms(1); PORTD = 0x00; PORTD.5 = on_s; PORTC = Maled[s%10]; delay_ms(1);}void _creat_time(){ if(dem>=1000)//1s { dem=0; giay++; if(giay>59) { giay=0; phut++; } if(phut>59) { phut=0; gio++; } if(gio>23) { gio=0; } } if(giay%2==0){PORTA.7 = 1;} else{PORTA.7 = 0;} }void main(void){ DDRA = 0xff; // input PORTA = 0x00; // Tro keo len DDRB = 0x00; // input PORTB = 0xff; // Tro keo len DDRC = 0xff; // output PORTC = 0x00; // Low level DDRD = (1<<DDD6)|(1<<DDD5)|(1<<DDD4)|(1<<DDD3)|(1<<DDD2)|(1<<DDD1)|(1<<DDD0); // output PORTD = (0<<PORTD6)|(0<<PORTD5)|(0<<PORTD4)|(0<<PORTD3)|(0<<PORTD2)|(0<<PORTD1)|(0<<PORTD0); // 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") while (1) { if(OK==0) { index++; if(index>3)index=0; while(OK==0); } switch(index) { case 0: { _creat_time(); _show_time(1,1,1,gio,phut,giay); break; } case 1: { _show_time(0,0,1,gio,phut,giay); if(!UP) { giay++; if(giay>59)giay=0; while(!UP){_show_time(0,0,1,gio,phut,giay);} } if(!DN) { giay--; if(giay==255)giay=59; while(!DN){_show_time(0,0,1,gio,phut,giay);} } break; } case 2: { _show_time(0,1,0,gio,phut,giay); if(!UP) { phut++; if(phut>59)phut=0; ; while(!UP){_show_time(0,1,0,gio,phut,giay);} } if(!DN) { phut--; if(phut==255)phut=59; while(!DN){_show_time(0,1,0,gio,phut,giay);} } break; } case 3: { _show_time(1,0,0,gio,phut,giay); if(!UP) { gio++; if(gio>23)gio=0; while(!UP){_show_time(1,0,0,gio,phut,giay);} } if(!DN) { gio--; if(gio==255)gio=23; while(!DN){_show_time(1,0,0,gio,phut,giay);} } break; } } }}

Demo