1. 난수를 발생하여 해당값을 LED에 표시.
ON/OFF를 각각 0.5초간 유지
#include <test.h>
#include <stdlib.h>
#define CPU_CLOCK 16000000
#define TICK_PER_SEC 1000
#define PRESCALER 64
#define LED_DDR DDRE
#define LED_OUT PORTE
volatile unsigned int g_elapsed_time;
void sleep(unsigned int elapsed_time);
void init_LED(void);
void init_TC0(void);
int main()
{
init_LED();
init_TC0();
SREG=SREG|(1<<7);
while(1)
{
LED_OUT=rand();
sleep(500);
LED_OUT=0xFF;
sleep(500);
}
}
void sleep(unsigned int elapsed_time)
{
for(g_elapsed_time=0;g_elapsed_time<elapsed_time;);
}
void __vector_16 (void)
{
TCNT0=256-(CPU_CLOCK/TICK_PER_SEC/PRESCALER);
++g_elapsed_time;
}
void init_LED(void)
{
LED_DDR=0xFF;
LED_OUT=0xFF;
}
void init_TC0(void)
{
TCCR0=1<<CS02|0<<CS01|0<<CS00;
TCNT0=256-(CPU_CLOCK/TICK_PER_SEC/PRESCALER);
TIMSK=TIMSK|1<<TOIE0;
}
2.위의 소스를 수정하여 각각의 LED 하나에만 랜덤으로 ON/OFF 하도록 하시오.
#include <test.h>
#include <stdlib.h>
#define CPU_CLOCK 16000000
#define TICK_PER_SEC 1000
#define PRESCALER 64
#define LED_DDR DDRE
#define LED_OUT PORTE
volatile unsigned int i;
volatile unsigned int g_elapsed_time;
void sleep(unsigned int elapsed_time);
void init_LED(void);
void init_TC0(void);
int main()
{
init_LED();
init_TC0();
SREG=SREG|(1<<7);
while(1)
{
i=rand();
LED_OUT=~(0x01<<i%8);
sleep(500);
LED_OUT=0xFF;
sleep(500);
}
}
void sleep(unsigned int elapsed_time)
{
for(g_elapsed_time=0;g_elapsed_time<elapsed_time;);
}
void __vector_16 (void)
{
TCNT0=256-(CPU_CLOCK/TICK_PER_SEC/PRESCALER);
++g_elapsed_time;
}
void init_LED(void)
{
LED_DDR=0xFF;
LED_OUT=0xFF;
}
void init_TC0(void)
{
TCCR0=1<<CS02|0<<CS01|0<<CS00;
TCNT0=256-(CPU_CLOCK/TICK_PER_SEC/PRESCALER);
TIMSK=TIMSK|1<<TOIE0;
}
|
|