#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define CPU_CLOCK 16000000
#define TICK_PER_SEC 1000
#define PRESCALER 128
volatile unsigned int g_elapsed_time; //g_elapsed_time 전역변수로 선언
volatile unsigned int i,k,t,a,j,h;
void sleep(unsigned int elapsed_time); //sleep 함수를 선언
SIGNAL(SIG_OVERFLOW0); //SIGNAL함수를 선언
int main(void)
{
DDRE=0xFF; //E포트의 I/O핀을 출력용으로 설정
PORTE=0xFF; //E포트의 I/O핀에 대한 출력값 초기화
DDRC=0xFF;
PORTC=0xFF;
TCCR0=0x05; //프리스케일러가 128 분주비 이기 떄문에 101로 비트를 세트
TCNT0=0x83; //타이머 카운트레지스터 TCNT0를 분주비가 125칸이므로 131 으로 초기화
TIMSK=0x01; //인터럽트 마스크 레지스터 TIMSK를 사용함으로 설정 (오버플로우 인터럽트설정)
sei();
//같다 SREG=(1<<7)|SREG; //최상위비트를 1로만들어 상태레지스터(SREG) I비트 1설정
//인터럽트 활성화
while(1)
{
for(i=0;i<=60;++i)
{
k=i%10;
t=(i/10<<4)|k;
sleep(1000);
PORTC=t;
if(i==60)
{
PORTE=0xfe<<j&PORTE; //이전 점등을 유지하면서 점등
++j;
i=0;
if(PORTE==0x00)
{
PORTE=0xFF;
}
}
}
}
return 1;
}
void sleep(unsigned int elapsed_time) //sleep 함수 구현
{
for(g_elapsed_time=0;g_elapsed_time<elapsed_time;)//elapsed_time 값이 1000이므로 초기값 0에서 1씩증가 해서 1000과 비교
//SIGNAL 함수에서 ++g_elapsed_time으로 증가하고 있으므로 증감식 생략
{
continue;
}
}
SIGNAL(SIG_OVERFLOW0) //오버플로우가 들어오면 시그널함수 호출
{
TCNT0=0x83; //타이머 카운트레지스터 분주비가 125칸이므로 131 으로 초기화
++g_elapsed_time; //시간변수 1증가
}
분주비(prescaler)를 128 로 1초 딜레이를 주자
160000000 를 1/1000 해주고 다시 128 로 해주면 125 가 나온다.
그러므로 |