BASIC4MCU | 질문게시판 | 답변 : LED 순서 점등 제어 관련해서 질문드립니다.
페이지 정보
작성자 master 작성일2018-04-09 08:57 조회8,392회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=472
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-04-09 오전 8:47:55// by Ok-Hyun ParkLED 를 순차대로 점등시키는 회로를 PORTD에서 드라이브 구동방식으로 LED를 점등시키고PORTA에 스위치를 4개달아서PORTA.0에 달린 스위치를 누르면 LED가 리셋되고PORTA.1에 달린 스위치를 누르면 LED가 0에서7까지 순차대로 점등되고PORTA.2에 달린 스위치를 누르면 딜레이가 200ms 증가해서 보다 느리게 점등되고PORTA.3에 달린 스위치를 누르면 딜레이가 200ms 감소해서 보다 빨리 점등되게 구성했습니다.그런데 이론적으로는 PORTA.3에 달린 스위치를 계속 누르면결론적으로 delay가 1ms 가 되도록 설정을 해주었으므로 LED가 전부 켜져있는것처럼 보여야하지만스위치를 계속 꾹누르고 있으면 LED 가 딱 1개만 켜지는 오동작이 발생했습니다.그래서 아래의코드의 ledshift 함수의 코드를//#include <mega128.h>#include <delay.h>//unsigned char LED=0x01,key;int plus=500;//void ledshift(void){while(1){if(PINA==0x0e||PINA==0x0b||PINA==0x07)break;LED=0x01; delay_ms(plus); LED=(LED<<1); if(LED==0x80)LED=0x01; PORTD=LED;}}//void ledshiftplus(void){ plus+=200; delay_ms(300); }//void ledshiftminus(void){if(plus>1){ plus-=200; delay_ms(300); }}//void main(void){DDRD=0xff; DDRA=0xf0;while(1){key=(PINA&0x0f);switch(key){case 0x0e: PORTD=0x00; break;case 0x0d: ledshift(); break;case 0x0b: ledshiftplus(); ledshift(); break;case 0x07: ledshiftminus(); ledshift(); break;}}}//다음과같이 plus 가 0미만이면 무조건 LED가 전부 점등되게 설정을해주었는데도 오동작이 계속해서 발생합니다.//void ledshift(void){while(1){if(PINA==0x0e||PINA==0x0b||PINA==0x07)break;if(plus<0)LED=0xff;else{ LED=0x01; delay_ms(plus); LED=(LED<<1); if(LED==0x80)LED=0x01; PORTD=LED; }}}
void ledshift(void){
while(1){ // <-- 무한루프if(PINA==0x0e||PINA==0x0b||PINA==0x07)break; // <-- 비트마스크 없이 읽고 있슴LED=0x01; delay_ms(plus); LED=(LED<<1); if(LED==0x80)LED=0x01; PORTD=LED;}}
key=(PINA&0x0f);
메인함수에서는 비트마스크 방법으로 키를 읽습니다.
if(PINA==0x0e||PINA==0x0b||PINA==0x07)break;비트마스크 방법을 사용하지 않으면 키값을 못 읽을 수도 있습니다.
키를 읽지 못하면 무한루프를 빠져나오지 못하죠
//case 0x0e: PORTD=0x00; break;설명에서는 LED가 리셋 된다고 적혀있는데 포트만 크리어시키고 있습니다.
LED 변수를 크리어 시키지 않아도 상관없는지 체크하세요
//
while(1){if(PINA==0x0e||PINA==0x0b||PINA==0x07)break;LED=0x01; delay_ms(plus); LED=(LED<<1); if(LED==0x80)LED=0x01; PORTD=LED;}
루프 안에서 1로 강제 지정하고 좌로 1쉬프트하면
포트는 비트1만 켜지고 움직이지 않습니다.
//
기초가 부실하면 계속 애를 먹습니다.
먼저 쉬운 예제를 많이 공부 해서 기본기를 충분히 쌓은 후에
응용해서 만드시기 바랍니다.
댓글 1
조회수 8,39227315co님의 댓글
27315co 작성일네 정말 감사합니다. 쉬운예제부터 차근차근 시작하도록 하겠습니다.