interruptClock
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define MIN1 0xFE //FND0
#define MIN0 0xFD //FND1
#define SEC1 0xFB //FND2
#define SEC0 0xF7 //FND3
int num[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x27, 0x7F, 0x6F};
int hour = 0;
int min = 0;
int sec = 0;
int ms = 0;
void setup(void);
void setupTimer(void);
void fndDisplay(int select, int data);
SIGNAL(SIG_OVERFLOW0);
int main(void)
{
setup(); // 설정 초기화
setupTimer(); // 타이머를 초기화한다.
sei(); // 모든 이터럽트가 끝나고 초기화
// PORTG = FND0; // 나타날 위치
// PORTE = hex[3]; // 나타낼 값
while(1)
{
fndDisplay(MIN1, min / 10);
fndDisplay(MIN0, min % 10);
fndDisplay(SEC1, sec / 10);
fndDisplay(SEC0, sec % 10);
}
}
void setup(void)
{
// pe0~7, fnd data
// pg0~3, select
DDRE = 0xFF; // FE( 1110 ), FD( 1101 ), FB( 1011 ), F7( 0111 )
DDRG = 0x0F;
}
void setupTimer(void)
{
// 사용할 타이머 설정 <- timer0
// 타이머 인터럽트 설정 TIMSK
// 타이머 인터럽트
// 타이머 카운트 시간 설정
TCCR0 = 0x07; // 분주비 1024 ( 0000 0111)
TCNT0 = 0xFF - 72; // 카운트 시작값.
// 7372800 / 1024 = 7200 / 100 = 72 => 255 -72 = (8bit)
TIMSK = TIMSK | 0x01; //0x01; // Timer Overflow 0000 0001
TIFR = TIFR & 0xFE; //0x01; // Timer0 Overflow flag 0000 0001
}
void fndDisplay(int select, int data)
{
PORTG = select;
PORTE = num[data];
_delay_ms(1);
}
SIGNAL(SIG_OVERFLOW0)
{
cli();
TCNT0 = 0xFF - 72;
++ms;
if ( ms == 100 )
{
++sec;
ms = 0;
}
if ( sec == 60 )
{
++min;
sec = 0;
}
if( min == 60 )
min = 0;
sei();
}
'AVR' 카테고리의 다른 글
config (0) | 2015.04.14 |
---|---|
ADConverter (0) | 2015.04.14 |
exUART (0) | 2015.04.14 |
PDF - AVR MCU (ATmega128) (0) | 2015.04.13 |
interruptTimer (0) | 2015.04.13 |
interruptStopWatch (0) | 2015.04.13 |
Interrupt (0) | 2015.04.10 |
switch (0) | 2015.04.10 |