=================================================================================================
프로그램 상에서 지연을 반복문으로 줬다... 이는 안 좋은 방법이고, 원래는 타이머 카운트와 인터럽트를
이용해야 한다.. 하지만 아직 배우지 않았고, 다음 시간에 배울 예정이다..
하면서 느낀건데...내가 모르는 새로운 것을 배운다는 것은 언제나 즐거운 것 같다...
=================================================================================================
[보드 세팅]
=================================================================================================
[소스 코드 및 설명]
가. 적외선 센서 신호를 수신할 때 마다, LED 불빛을 전체 껐다가 다시 수신하면 켜기
[소스코드 및 설명]
#include<avr/io.h>
/* 광센서는 Port D의 8번째 최상위 비트인 PD7(32번핀)에 입력된다고 가정 */
int main(void)
{
DDRC = 0x00; // 키입력
PORTC = 0x00; // 초기화
DDRD = 0x00001111; // D포트-EEPROM : 적외선 광센서
PORTD = 0x11111111; // D번째 IO 핀에 대한 출력값 초기화
DDRF = 0xFF; // F번째 IO핀 : LED
PORTF = 0xFF; // F번째 IO핀에 대한 출력값 초기화
volatile unsigned char flag = 0x00; // LED 불을 크고 끄는 플래그 변수
volatile unsigned int i, j;
while(1)
{
asm("NOP");
if(PIND == 0x7F) // 적외선 센서에 값이 입력되면
{
for(i=0; i<1000; ++i) // 플래그 값을 수정하기 위한 딜레이
for(j=0; j<600; ++j)
;
flag = ~flag;
}
if(flag == 0x00)
{
PORTF = 0xFF;
}
else
{
PORTF = 0x00;
}
}
return 1;
}
나. 적외선센서 신호를 수신할 때 마다, LED의 불빛이 좌측에서 우측으로 1칸씩
이동 시키기
[소스코드 및 설명]
#include<avr/io.h>
int main(void)
{
DDRC = 0x00;
PORTC = 0x00;
DDRD = 0x00001111;
PORTD = 0x11111111;
DDRF = 0xFF;
PORTF = 0xFF;
volatile unsigned int i, j, count = 0;
while(1)
{
asm("NOP");
if(PIND == 0x7F)
{
for(i=0; i<1000; ++i) // 값 설정을 위한 딜레이
for(j=0; j<600; ++j)
;
PORTF = ~(1<<count); // 1에 0을 시프트 하면서 LED를 옮김
count++;
if(count > 7)
count = 0;
}
}
return 1;
}
다. LED 불빛을 자동으로 1칸씩 우측으로 이동 시키다가, 적외선 센서 신호를 수신할 때 마다 이동 방향을 바꾸기
[소스코드 및 설명]
#include<avr/io.h>
int main(void)
{
DDRC = 0x00;
PORTC = 0x00;
DDRD = 0x00001111;
PORTD = 0x11111111;
DDRF = 0xFF;
PORTF = 0xFF;
volatile unsigned int i, j, b = 1;
volatile unsigned char count = 0;
while(1)
{
if(PIND == 0x7F)
{
for(i=0; i<1000; ++i) // 값 설정을 위한 딜레이
for(j=0; j<600; ++j)
;
b *= -1; // -1을 곱해줌으로써 방향을 정할 수 있다.(-1, 1)
}
PORTF = ~(1<<count); // 1을 시프트 하면서 LED 불을 옮긴다
if(count >= 7) // LED가 계속 돌기 위해 설정
count = 0;
if(count <= 0) // LED가 계속 돌기 위해 설정
count = 7;
count += b; // b = 1: 증가, b = -1: 감소
for(i=0; i<700; ++i)
for(j=0; j<600; ++j)
;
}
return 1;
}
라. 적외선센서 신호를 수신할 때 마다, FND의 값을 0에서부터 1씩 증가 시키기
[소스코드 및 설명]
#include<avr/io.h>
int main(void)
{
DDRC = 0x00;
PORTC = 0x00;
DDRD = 0x00001111;
PORTD = 0x11111111;
DDRE = 0xFF;
PORTE = 0xFF;
volatile unsigned char count = 0;
volatile unsigned int i, j;
while(1)
{
// 10의 자리와 1의 자리를 구해서 출력.
PORTE = ((count/10)<<4) | (count%10);
if(PIND == 0x7F)
{
for(i=0; i<1000; ++i) // 값 설정을 위한 딜레이
for(j=0; j<600; ++j)
;
count++;
if(count > 99)
count = 0;
}
}
return 1;
}
마. 0~99까지 순차적으로 숫자를 1씩 증가시키다가 버튼을 누르면 현재 값에서 1씩 감소하기, 다시 누르면 1씩 증가하기
[소스코드 및 설명]
#include<avr/io.h>
int main(void)
{
DDRC = 0x00;
PORTC = 0x00;
DDRD = 0x00001111;
PORTD = 0x11111111;
DDRE = 0xFF;
PORTE = 0xFF;
volatile unsigned char count = 0;
volatile unsigned int i, j, flag = 1;
while(1)
{
asm("NOP");
if(PIND == 0x7F)
{
for(i=0; i<1000; ++i) // 값 설정을 위한 딜레이
for(j=0; j<600; ++j)
;
// flag : 정지, 진행의 값을 담고 있는 플래그 변수
if(flag == 0)
flag = 1;
else
flag = 0;
}
// 10의 자리와 1의 자리 수를 구함
PORTE = ((count/10)<<4) | (count%10);
count += flag;
if(count > 99)
count = 0;
for(i=0; i<1000; ++i) // 디스플레이를 위한 딜레이
for(j=0; j<600; ++j)
;
}
return 1;
}
=================================================================================================
'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 |
[Atmega128] FND 문제 풀기 (0) | 2009.06.24 |