Atmega16 Đồng Hồ Số Hiển Thị LED 7 Đoạn Dùng Timer - CodeVision
#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;
}
}
}
}
Đăng nhận xét