[요구사항]
LED와 KEY를 사용한다
각 LED는 이웃한 각KEY버튼과 짝이 된다.
각 KEY를 누르면 LED가 토글된다.
현재의 상태를 매번 EEPROM에 기억시킨다.
DK-128의 전원을 껏다가 켰을때, 이전의 LED상태를
그대로 표시 하여야 된다..
<코딩>
#include<avr/io.h>
#include<avr/signal.h>
#include<avr/interrupt.h>
#include<avr/eeprom.h>
#define CPU_CLOCK 16000000 //클럭
#define TICKS_PER_SEC 1000 //틱
#define PRESCALER 64 //프리스케일러
volatile unsigned int g_elapsed_time;
volatile unsigned int j=0;
void initLED(void);
void setTCCR0(void);
void initTCNT0(void);
void setTIMSK(void);
void sleep(unsigned int sec);
void toggleLED(char a,char b);
void eeprom_write(unsigned int uiAddress, unsigned char ucData);
unsigned char eeprom_read(unsigned int uiAddress);
SIGNAL(SIG_OVERFLOW0); // timer0의 오버플로우함수,매크로
volatile unsigned int tic_time; // 시간 변수
volatile unsigned int time=0;
int main(void)
{
DDRC = 0x00; // key
PORTC = 0xFF;
unsigned char ch=0;
initLED(); // LED초기화
setTCCR0(); // TCCR0 설정
initTCNT0(); // TCNT0 초기화
setTIMSK(); // TIMSK 설정
sei(); // 인터럽트 활성화
for(;;)
{
ch = ~PINC;
PORTF = eeprom_read(j);
if(ch!=0)
{
toggleLED(ch,PORTF);
eeprom_write(j,PORTF);
sleep(300);
}
}
return 1;
}
SIGNAL(SIG_OVERFLOW0) //시그날
{
g_elapsed_time++;
TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / PRESCALER);
}
void sleep(unsigned int elapsed_time) //딜레이
{
g_elapsed_time=0;
while(elapsed_time>g_elapsed_time);
}
void toggleLED(char a,char b) //토글
{
PORTF = (a^b);
}
void initLED(void) // LED 초기화
{
DDRF=0xFF;
PORTF=0xFF;
}
void setTCCR0(void) //프리스케일러 값
{
TCCR0=(1<<CS02) | (0<<CS01) | (0<<CS00);
}
void initTCNT0(void) //타이머 초기화
{
TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / 64);
}
void setTIMSK(void) // 인트럽트
{
TIMSK = (0 << OCIE0) | (1<<TOIE0);
}
void eeprom_write(unsigned int uiAddress, unsigned char ucData)
{
//이번의 쓰기가 완료되기를 기다린다
while(EECR&(1<<EEWE));
//주소와 레지스터를 설정한다.
EEAR= uiAddress;
EEDR= ucData;
//EEMWE에 1을 설정한다.
EECR|= (1<<EEMWE);
//EEWE를 설정하여 쓰기 시작한다.
EECR|= (1<<EEWE);
return;
}
unsigned char eeprom_read(unsigned int uiAddress)
{
//이번의 쓰기가 완료되기를 기다린다
while (EECR &(1<<EEWE));
//주소 레지스터를 설정한다
EEAR = uiAddress;
//EERE를 설정하여 읽기를 시작한다.
EECR |= (1<<EERE);
//데이터 레지스터에서 데이터를 읽는다.
return EEDR;
}
'임베디드' 카테고리의 다른 글
AVR실습 윈도우 기반의 직렬통신(Read) (0) | 2009.07.14 |
---|---|
AVR실습 윈도우 기반의 직렬통신(Write) (0) | 2009.07.14 |
AVR실습 직렬통신 (0) | 2009.07.14 |
AVR실습 외부 EEPROM쓰기 (0) | 2009.07.08 |
AVR실습//내부 EEPROM 쓰기 (0) | 2009.07.06 |
댓글