BASIC4MCU | 질문게시판 | atmega128 스위치를 길게 눌러서 LED를 끄는 방법을 알고싶습니다.
페이지 정보
작성자 만민이 작성일2021-04-09 05:22 조회11,813회 댓글3건본문
#include <mega128.h>
#include <delay.h>
void LED_LRShift(void)
{
unsigned char led = 0xFE;
int i;
for(i=0;i<8;i++)
{
delay_ms(500);
PORTB = led;
led = (led<<1)|0x01;
}
led = 0x7f;
for(i=0;i<8;i++)
{
delay_ms(500);
PORTB = led;
led = (led>>1)|0x80;
}
}
void main(void)
{
unsigned char key;
int i;
DDRB = 0xFF;
DDRD = 0x00;
PORTB = 0xFF;
while(1)
{
key = (PIND & 0xFF);
switch(key)
{
case 0xFE:
i=0;
while((PIND&0x01)==0){ delay_ms(10); if(++i>200)break; } // 2초이상 누르면 빠져나감
if(i>200){PORTB = 0xFF;} // 2초 이상 길게 누른 경우
else {LED_LRShift();} // 짧게 누른 경우
while((PIND&0x01)==0); // 키에서 손을 뗄 때까지 대기
delay_ms(500);
break;
case 0xFD:
PORTB = 0x00;
if(PIND.2==0){PORTB = 0x00;}
break;
}
}
}
2초이상 길게 누를 경우 모든 LED가 꺼지게 만들었는데 막상 돌리면 작동이 되지 않습니다. LED를 한 번에 켰을 때 길게 누르면 정상적으로 작동하는데 LED가 이동하면서 켜지는 구문에서는 왜 그런지 작동이 안됩니다.ㅠㅠ이거 때문에 하루 종일 코드만 봤는데도 해결이 되지 않습니다. 도와주시면 감사하겠습니다 ㅠㅠ그리고 PD0에 연결 되어있는 스위치를 누르면 LED가 왕복으로 왔다갔다 하고 PD0를 길게 누르면 동작이 꺼지면서 LED가 전부 꺼지고 다시 PD1을 누르면 모든 LED가 켜지면서 다시 PD0를 누르면 PB0의 LED가 꺼지게 만들고 싶은데 LED가 모두 켜지고 나서 PD1을 누르면 LED 반복이 동작됩니다.어떻게 하면 따로따로 동작이 가능할까요?
댓글 3
조회수 11,813master님의 댓글
master 작성일스위치를 누르면 1이 되는지, 0이 되는지 부터 체크하세요
master님의 댓글
master 작성일
void LED_LRShift(void){
unsigned char led = 0xFE;
int i;
for(i=0;i<8;i++){ delay_ms(500); PORTB = led; led = (led<<1)|0x01; }
led = 0x7f;
for(i=0;i<8;i++){ delay_ms(500); PORTB = led; led = (led>>1)|0x80; }
}
0.5초 딜레이가 8회 루프돌고, 그 아래에서 또 8회 루프 돌아가므로
총 8초가 걸립니다.
//
else {LED_LRShift();} // 짧게 누른 경우
이 코드가 한번 실행되고나면 8초가 걸리므로 최대 10.5초까지 눌러야지 길게(2초) 누른 것을 감지하겠습니다.
만민이님의 댓글
만민이
그럼 같은 스위치를 2초 이상 눌렀을 때 빠져나가게 하려면 방법이 없을까요?? 제가 계속 시도를 해봤는데 해결이 도저히 안되네요 ㅠㅠ