==================================================================================================
개발 환경 세팅은 위의 자료들을 참고하세요~!
==================================================================================================
[보드 세팅]
-------------------------------------------------------------------------------------------------
[ 문제 1 ] 버튼을 누르면 두 개의 FND가 동일한 숫자를 표시하도록 하기.
[소스 코드]
#include<avr/io.h>
int main(void)
{
// 초기화
DDRE=0xFF;
PORTE=0xFF;
DDRF=0xFF;
PORTF=0xFF;
/* volatile 은 해당 메모리가 레지스터의 주소이기 때문에
해당 메모리 번지에 대하여 최적화를 하지 않도록 컴파일러에게 알리는 것이다. */
volatile unsigned char i=0; // volatile : 최적화 무시!
volatile unsigned char a=0;
for(;;)
{
asm("NOP");
i=0;
PORTF = PINC;
a=~PINC;
while(a >= 1)
{
a/=2;
i++;
} // i = 누승 (1, 2, 3, … )
PORTE=((i%10)<<4)|(i%10); // 10의 자리와 1의 자리를 같은 수로 만들기
}
return 0;
}
-------------------------------------------------------------------------------------------------
[ 문제 2 ] 0~99까지 순차적으로 숫자를 1씩 증가하면서 FND에 표시 하기
[소스 코드]
#include<avr/io.h>
int main(void)
{
DDRE=0xFF;
PORTE=0xFF;
DDRF=0xFF;
PORTF=0xFF;
volatile unsigned char cnt;
volatile unsigned int i;
volatile unsigned int j;
for(;;)
{
for(cnt=0;cnt<100;cnt++) // 0 ~ 99
{
PORTE=((cnt/10)<<4)|(cnt%10); // 10의 자리와 1의 자리를 구한다.
for(i=0;i<1000;i++) // 디스플레이를 위한 지연
for(j=0;j<600;j++)
;
}
}
return 0;
}
-------------------------------------------------------------------------------------------------
[ 문제 3 ] 99~0까지 순차적으로 숫자를 1씩 감소하면서 FND에 표시 하기
[소스 코드]
#include<avr/io.h>
int main(void)
{
DDRE=0xFF;
PORTE=0xFF;
DDRF=0xFF;
PORTF=0xFF;
volatile unsigned char cnt;
volatile unsigned int i;
volatile unsigned int j;
for(;;)
{
for(cnt=99;cnt>=0;cnt--) // 99 ~ 0
{
PORTE=((cnt/10)<<4)|(cnt%10); // 10의 자리와 1의 자리를 구한다.
for(i=0;i<1000;i++) // 디스플레이를 위한 지연
for(j=0;j<600;j++)
;
}
}
return 0;
}
-------------------------------------------------------------------------------------------------
[ 문제 4 ] 0~99까지 순차적으로 숫자를 1씩 증가시키다가 버튼을 누르면 0부터 다시 시작하기
[소스 코드]
#include<avr/io.h>
int main(void)
{
DDRE=0xFF;
PORTE=0xFF;
DDRF=0xFF;
PORTF=0xFF;
volatile unsigned char cnt;
volatile unsigned char c;
volatile unsigned int i;
volatile unsigned int j;
for(;;)
{
for(cnt=0;cnt<100;cnt++)
{
PORTF=PINC;
c = ~PINC;
if(c > 0) // 버튼을 누른 경우 (0 부터 시작하게 됨)
{
cnt=99;
continue;
}
PORTE=((cnt/10)<<4)|(cnt%10);// 10의 자리와 1의 자리의 수 구함
for(i=0;i<600;i++) // 디스플레이를 위한 지연
for(j=0;j<600;j++)
;
}
}
return 0;
}
-------------------------------------------------------------------------------------------------
[ 문제 5 ] 0~99까지 순차적으로 숫자를 1씩 증가시키다가 버튼을 누르면 현재 값에서 1씩
감소하기, 다시 누르면 1씩 증가하기
[소스 코드]
#include<avr/io.h>
int main(void)
{
DDRE=0xFF;
PORTE=0xFF;
DDRF=0xFF;
PORTF=0xFF;
volatile unsigned char cnt;
volatile unsigned char c;
volatile unsigned int i;
volatile unsigned int j;
volatile unsigned int flag=1;
for(;;)
{
cnt = 0; // 99로 해서 아래의 while문을 빠져나오면 다시 초기화 될 값(0)
while(cnt<100)
{
PORTF=PINC;
c = ~PINC;
if(c > 0) // 키 값이 입력된 경우 -1을 곱하여 증/감을 정한다.
{
flag *= (-1);
continue;
}
PORTE=((cnt/10)<<4)|(cnt%10); // 10의 자리와 1의 자리의 수 구함
cnt+=flag;
if(cnt <= 0) // 계속 감소하다가 0보다 작은 경우, 다시 99로…
{
cnt = 99;
}
for(i=0;i<600;i++) // 디스플레이를 위한 지연
for(j=0;j<300;j++)
;
}
}
return 0;
}
==================================================================================================
'IT_etc > dk-128 (ATmega128)' 카테고리의 다른 글
[스크랩] 7-1. 윈도우 기반 직렬 단방향 통신 (0) | 2009.08.25 |
---|---|
[스크랩] 6. 외부 EEPROM (0) | 2009.08.25 |
[dk-128] 내부 EEPROM 사용하기 (타이머 카운터 사용) (0) | 2009.07.06 |
타이머 카운터 _ 1초마다 LED를 깜빡 거리는 프로그램 구현 (0) | 2009.06.26 |
적외선 센서 문제 풀기 (0) | 2009.06.25 |