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