Trang chủ Chưa phân loạiAtmega16 Đồng Hồ Số Hiển Thị LED 7 Đoạn Dùng Timer – CodeVision

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

bởi Admin
44 lượt xem 8 Phút đọc

Đồ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

Để lại bình luận

Focus Mode

Đã phát hiện trình chặn quảng cáo

Vui lòng hỗ trợ chúng tôi bằng cách tắt tiện ích chặn quảng cáo (AdBlocker) trên trình duyệt của bạn khi truy cập trang web của chúng tôi.