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

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

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

Nhận xét

Mới hơn Cũ hơn