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] 프로세싱에서 키보드로 캐릭터 움직이기 (2510)
- [2018/06/15] processing (쉬운 프로그래밍 언어) (1229)
- [2015/01/08] Character LCD 예제 (3737)
- [2014/11/28] 간단한 유니폴라 스텝모터 구동 (3883)
- [2014/11/28] 컴퓨터-아두이노 간의 블루투스 통신 (채팅) (4806)
- [2013/04/11] WAT-AVR128_PLUS 모듈 (4302)
- [2012/12/03] WAT-AVR128 EXT (AVR128용 확장보드) (4187)
- [2011/10/27] WAT-USB AVR ISP (6565)
- [2011/10/27] WAT-AVR128 모듈 (5534)
- [2013/10/28] ZEO-IO2 BOARD [ZEO IO 실험 보드2] (6465)
#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;
}