2. 다음과 같이 LED를 네 가지 형태로 동작시키는 프로그램을 작성하시오.
① PORTD.4에 연결된 버튼 스위치가 ON되면, PORTB.0
PORTB.7의 순서로 LED가 하나씩 점멸
② PORTD.5에 연결된 버튼 스위치가 ON되면, PORTB.7 
PORTB.0의 순서로 LED가 하나씩 점멸
③ PORTD.6에 연결된 버튼 스위치가 ON되면, PORTB에 연결된 모
든 LED가 점멸
④ PORTD.7에 연결된 버튼 스위치가 ON되면, 8개 LED중 상위 4개,
하위 4개의 LED가 교대로 점멸
 
 #include<avr/io.h> 
 #include<util/delay.h> 
 
 void key_in(void); 
 
 unsigned char LED_Data[8] = {0x01,
0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; 
 unsigned char input= 0; 
 int i,j; 
 
 void key_in(void) {         input = PIND;         if(input
== 0x10)         {                for(i
= 0; i < 8; i++) 
                {  
                        PORTE = LED_Data[i]; 
                        for(j=0;
j<25; j++) 
                               _delay_ms(20); 
                } 
         } 
         else if(input == 0x20)         { 
                for(i
= 7; 0 <= i; i--) 
                { 
                        PORTE = LED_Data[i]; 
                        for(j=0;
j<25; j++) 
                               _delay_ms(20); 
                } 
         } 
         else if(input == 0x40)         { 
                 for(i = 0; i < 8; i++)                { 
                        PORTE = 0xFF;                        for(j=0;
j<25; j++)                               _delay_ms(20); 
                        PORTE = 0x00;                        for(j=0;
j<25; j++)                               _delay_ms(20); 
                } 
         } 
         else if(input == 0x80)         { 
                for(i
=0; i < 8; i++)                {                        PORTE = 0xF0; 
                        for(j=0;
j<25; j++)                               _delay_ms(20); 
                        PORTE = 0x0F;                        for(j=0;
j<25; j++)                               _delay_ms(20); 
                }         } } 
 int main(void) {         DDRD = 0x00;         DDRE = 0xff; 
         while(1)         {                key_in();                 PORTE=PIND;  
         } 
         return
0; 
 } 
 
위와 같이 구성하였는데 이렇게하면 한번실행중 중간에 LED점멸을 바꿀수가없어서
인터럽트로 실행하려고 하는데 방법 좀 알려주세요.
무한루프안에서 스위치를 바꿔누를때마다 LED가 바뀌어야합니다..
- [2018/06/15] 프로세싱에서 키보드로 캐릭터 움직이기 (3321)
- [2018/06/15] processing (쉬운 프로그래밍 언어) (1899)
- [2016/09/24] XML 으로 환경설정 저장하기 ( \n,엔터값 포함, NewLine) (10538)
- [2015/01/08] Character LCD 예제 (3815)
- [2014/11/28] 간단한 유니폴라 스텝모터 구동 (3971)
- [2014/11/28] 컴퓨터-아두이노 간의 블루투스 통신 (채팅) (4901)
- [2013/04/11] WAT-AVR128_PLUS 모듈 (4800)
- [2012/12/03] WAT-AVR128 EXT (AVR128용 확장보드) (4646)
- [2011/10/27] WAT-USB AVR ISP (7064)
- [2011/10/27] WAT-AVR128 모듈 (6027)


#include <avr/io.h>
#include <util/delay.h>
void key_in(void);
unsigned char LED_Data[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
unsigned char input= 0;
int i,j;
//1 PORTD.4에연결된버튼스위치가ON되면, PORTB.0
//
//PORTB.7의순서로LED가하나씩점멸
// 2 PORTD.5에연결된버튼스위치가ON되면, PORTB.7
// PORTB.0의순서로LED가하나씩점멸
// 3 PORTD.6에연결된버튼스위치가ON되면, PORTB에연결된모
// 든LED가점멸
// 4 PORTD.7에연결된버튼스위치가ON되면, 8개LED중상위4개,
// 하위4개의LED가교대로점멸
unsigned char g_Status = 0; //0:
int iStep; // 0 ~7 까지왕복
void key_in(void)
{
input = PIND;
// PORTD.4 가눌리면
if((input & 0x10)!= 0x10)
{
g_Status = 1;
}
else if((input & 0x20)!= 0x20) // PORTD.5 가눌리면
{
g_Status = 2;
}
else if((input & 0x40)!= 0x40) // PORTD.6 가눌리면
{
g_Status = 3;
}
else if((input & (0x80)) != 0x80) // PORTD.7 가눌리면
{
g_Status = 4;
}
else
{
g_Status = 0;
iStep = 0;
}
}
int main(void)
{
DDRD = 0x00;
DDRE = 0xff;
while(1)
{
key_in();
if(g_Status ==1)
{
PORTE = LED_Data[iStep];
iStep++;
if(iStep>7) iStep = 0;
}
else if(g_Status ==2)
{
PORTE = LED_Data[iStep];
iStep--;
if(iStep<0) iStep = 7;
}
else if(g_Status ==3)
{
if((iStep++ %2) ==0)
PORTE = 0xFF;
else
PORTE = 0x00;
}
else if(g_Status ==4)
{
if((iStep++ %2) ==0)
PORTE = 0x0F;
else
PORTE = 0xf0;
}
_delay_ms(20*25);
}
return 0;
}