BASIC4MCU | 질문게시판 | 답변 : AVR led 질문
페이지 정보
작성자 master 작성일2020-04-19 15:48 조회47,852회 댓글9건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2020-04-19 오후 3:46:49// by Ok-Hyun Park//PINB는 Switch 모듈에 연결되어 있고 PORTE는 LED 모듈에 연결되어있습니다.스위치 0번을 눌렀을 때 LED 7번이 켜지고스위치 1번을 눌렀을 때 LED 6번이 켜지고스위치 2번을 눌렀을 때 LED 5번이 켜지고...스위치 7번을 눌렀을 때 LED 0번이 켜지는소스를 만들고 싶어 이렇게 적어봤는데 확인해주실수 있나요?//#include <avr/io.h>//int main(){DDRE=0xFF;while(1){if(PINB&0x01)PINB|=0x80; else PINB&=~0x80;if(PINB&0x02)PINB|=0x40; else PINB&=~0x40;if(PINB&0x04)PINB|=0x20; else PINB&=~0x20;if(PINB&0x08)PINB|=0x10; else PINB&=~0x10;if(PINB&0x10)PINB|=0x08; else PINB&=~0x08;if(PINB&0x20)PINB|=0x04; else PINB&=~0x04;if(PINB&0x40)PINB|=0x02; else PINB&=~0x02;if(PINB&0x80)PINB|=0x01; else PINB&=~0x01;}return 0;}
스위치를 눌렀을 때에 0이 되는 경우에는 아래처럼 작성하면 됩니다.
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2020-04-19 오후 3:47:55// by Ok-Hyun Park//#include <avr/io.h>//int main(){DDRE=0xFF;while(1){if(PINB&0x01==0)PINB|=0x80; else PINB&=~0x80;if(PINB&0x02==0)PINB|=0x40; else PINB&=~0x40;if(PINB&0x04==0)PINB|=0x20; else PINB&=~0x20;if(PINB&0x08==0)PINB|=0x10; else PINB&=~0x10;if(PINB&0x10==0)PINB|=0x08; else PINB&=~0x08;if(PINB&0x20==0)PINB|=0x04; else PINB&=~0x04;if(PINB&0x40==0)PINB|=0x02; else PINB&=~0x02;if(PINB&0x80==0)PINB|=0x01; else PINB&=~0x01;}return 0;}
for 루프문을 사용할 수도 있습니다.
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2020-04-19 오후 3:50:31// by Ok-Hyun Park//#include <avr/io.h>//int main(){int i;DDRE=0xFF;while(1){for(i=0;i<8;i++){if(PINB&(0x80>>i)==0)PINB|=(1<<i); else PINB&=~(1<<i);}}}
https://www.basic4mcu.com/bbs/board.php?bo_table=gesiyo6&wr_id=63
기초가 부족하면 애를 먹습니다.
쉬운 강좌글 참고해서 공부해보세요
댓글 9
조회수 47,852혼자옵서예님의 댓글
혼자옵서예 작성일
와...갑자기 난이도가 확 뛰어오르네요..ㅠㅠ 기초강의를 봐도 긴가민가하네요..
혹시
if(PINB&0x01)PINB|=0x80; else PINB&=~0x80;
-----------------------------------------------------------------
if(PINB&0x01==0)PINB|=0x80; else PINB&=~0x80;
만약 PINB와 0000 0001의 논리 곱이 0이라면 PINB값은 0000 1000으로 지정한다. ...?
이 두 소스 설명해주실수 있나요?
master님의 댓글
master
이 분야는 비트 연산을 모르면 아무 것도 하지 못합니다.
PC용 C 언어에서는 비트 연산을 많이 사용하지 않죠
//
0x01 은 비트0, 0x80은 비트7 입니다.
2진 16진 변환은 기본으로 외우고 있어야 합니다.
혼자옵서예님의 댓글
혼자옵서예 작성일
논리연산자와 비트에 대해서 공부하고 왔습니다.. 지난 날의 저가 무지했다는 걸 깨닫게 되네요..
두번째로 적어주신 소스는 0번 스위치를 눌렀을 때 7번 led빼고 불이 다 켜지고 1번 스위치를 눌렀을 때 6번 led 빼고 불이 다 켜지는 소스인거죠?
혼자옵서예님의 댓글
혼자옵서예 작성일
#include<avr/io.h>
int main(){
DDRE=0xFF;
DDRB=0x00;
while(1){
PORTE=PINB;
if(PINB&0x01)
{
PINB=0x80
}
else if(PINB&0x02)
{
PINB=0x40
}
else if(PINB&0x04)
{
PINB=0x20
}
else if(PINB&0x08)
{
PINB=0x10
}
else if(PINB&0x10)
{
PINB=0x08
}
else if(PINB&0x20)
{
PINB=0x04
}
else if(PINB&0x40)
{
PINB=0x02
}
else if(PINB&0x80)
{
PINB=0x01
}
else
{
PINB==0
}
return 0;
}
이렇게 작성해도 맞지 않나요?
master님의 댓글
master
c문법 오류부터 해결하시고
문제가 있는 것은 동작시켜보면 바로 알 수 있습니다.
혼자옵서예님의 댓글
혼자옵서예
네 알겠습니다 감사합니다.
혼자옵서예님의 댓글
혼자옵서예 작성일
제가 저 나름대로 첫번째 소스를 해석해봤는데 맞는지 확인해주실수 있나요??
ex) 0번스위치를 눌렀을 경우;
if(PINB&0x01)PINB|=0x80; else PINB&=~0x80; // if문이 성립하니깐 PINB = 1000 0001로 저장됩니다.
if(PINB&0x02)PINB|=0x40; else PINB&=~0x40; // if문이 성립하지 않으므로 PINB = 1000 0001로 저장됩니다.
if(PINB&0x04)PINB|=0x20; else PINB&=~0x20; // if문이 성립하지 않으므로 PINB = 1000 0001로 저장됩니다.
if(PINB&0x08)PINB|=0x10; else PINB&=~0x10; // if문이 성립하지 않으므로 PINB = 1000 0001로 저장됩니다.
if(PINB&0x10)PINB|=0x08; else PINB&=~0x08; // if문이 성립하지 않으므로 PINB = 1000 0001로 저장됩니다.
if(PINB&0x20)PINB|=0x04; else PINB&=~0x04; // if문이 성립하지 않으므로 PINB = 1000 0001로 저장됩니다.
if(PINB&0x40)PINB|=0x02; else PINB&=~0x02; // if문이 성립하지 않으므로 PINB = 1000 0001로 저장됩니다.
if(PINB&0x80)PINB|=0x01; else PINB&=~0x01; // if문이 성립하지 않으므로 PINB = 1000 0000로 저장됩니다.
따라서 7번 LED가 켜지는 거죠..?
그리고
DDRB=0x00;
PORTE=PINB;
선언안해도 되나요?
master님의 댓글
master
해석은 맞지 않는 것 같습니다.
//
if(PINB&(0x80>>i)==0)PINB|=(1<<i); else PINB&=~(1<<i);
위 문장은 문제가 있습니다.
if(PINB&(0x80>>i)==0)PORTE|=(1<<i); else PORTE&=~(1<<i);
이렇게 수정하세요
혼자옵서예님의 댓글
혼자옵서예
네 감사합니다