질문게시판 > IF문 단축 관련 문의

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

IF문 단축 관련 문의

페이지 정보

작성자 총체적난국 작성일21-06-22 16:03 조회4,348회 댓글3건

본문

안녕하세요.

 

하기 코드는 스위치를 누르면 1씩 증가하여 0부터 9999까지 FND에 표현해주는 코드입니다.

void reset 함수 실행이 많이 지체되어 원인을 살펴보니 void fnd_on_0 함수가 if문이 4개나 돼서 지체되는 것으로 확인했습니다. (if문을 하나로 줄이니까 빨리 실행됨)

 

그런데 하나로 줄이면 표현하는 값이 한 자리수여도 fnd 네자리가 모두 켜지게되서 이렇게는 사용이 불가능하고 숫자를 표현하는 fnd만 켜져야 합니다.

이러한 조건을 유지하면서 fnd on_0 함수를 최대한 줄이고 싶은데 조언 가능하실까요? 

 

#include <avr/io.h>

#include <avr/delay.h>

 

char fnd[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned int buff4,buff3,buff2,buff1;

unsigned int i=0;

unsigned int var1;

int main()

{

  DDRC=0xff; // FND 출력

  DDRD=0b11110000; // TN 출력(7~4), 카운터,리셋 입력(3,2) 

  DDRA= 0x00; // ADC 입력

 

  while(1)

 {

  counter();

  display();

  fnd_on_0();

  reset();

  

  if(i>9999)  // 9999되면 0으로 리셋

 {

   i=0;

 }  

 

 }

}

 

void counter()

{

 

 PIND = 0x00;

 var1 = PIND & 0b00000100;

 

 if(var1 == 0)

  {

   i++;

   _delay_ms(50);

  }

 

}

 

void display()

{

  buff4 =i/1000;

  buff3 =i%1000/100;

  buff2 =i%100/10;

  buff1 =i%10;

}

 

void fnd_on_0()

{

    if(i < 10)

   {

    PORTD=0b10000000; PORTC=fnd[buff1];  _delay_ms(1); PORTC=0xff;

   }

   else if(i < 100)

   {

    PORTD=0b10000000; PORTC=fnd[buff1];  _delay_ms(1); PORTC=0xff;

    PORTD=0b01000000; PORTC=fnd[buff2];  _delay_ms(1); PORTC=0xff;

   }

   else if(i < 1000)

   {

    PORTD=0b10000000; PORTC=fnd[buff1];  _delay_ms(1); PORTC=0xff;

    PORTD=0b01000000; PORTC=fnd[buff2];  _delay_ms(1); PORTC=0xff;

    PORTD=0b00100000; PORTC=fnd[buff3];  _delay_ms(1); PORTC=0xff;

   }

   else if(i < 10000)

   {

    PORTD=0b10000000; PORTC=fnd[buff1];  _delay_ms(1); PORTC=0xff;

    PORTD=0b01000000; PORTC=fnd[buff2];  _delay_ms(1); PORTC=0xff;

    PORTD=0b00100000; PORTC=fnd[buff3];  _delay_ms(1); PORTC=0xff;

    PORTD=0b00010000; PORTC=fnd[buff4];  _delay_ms(1); PORTC=0xff;

   } 

}

 

void reset()

{

   if(!(PIND & 0b00001000))

{

      int t=0;

  while(t < 900)

{

fnd_on_0();

t++;

if(PIND & 0b00001000)

  break;

}

   if(t>=900)

{

      i=0;

}

else

{

  i=9999;

}

          _delay_ms(1000);  

     }

}


  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 3

조회수 : 4,348

master님의 댓글

master 작성일

#include <avr/io.h>
#include <avr/delay.h>
//
char fnd[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned int i=0,buff4,buff3,buff2,buff1;
//
void fnd_on_0(){ // 4ms
  if(i>1000){
    PORTD=0x10; PORTC=fnd[buff4]; _delay_ms(1); PORTC=0xff;
    PORTD=0x20; PORTC=fnd[buff3]; _delay_ms(1); PORTC=0xff;
    PORTD=0x40; PORTC=fnd[buff2]; _delay_ms(1); PORTC=0xff;
    PORTD=0x80; PORTC=fnd[buff1]; _delay_ms(1); PORTC=0xff;
  }
  else if(i>100){
    PORTD=0x20; PORTC=fnd[buff3]; _delay_us(1333); PORTC=0xff;
    PORTD=0x40; PORTC=fnd[buff2]; _delay_us(1333); PORTC=0xff;
    PORTD=0x80; PORTC=fnd[buff1]; _delay_us(1333); PORTC=0xff;
  }
  else if(i>  10){
    PORTD=0x40; PORTC=fnd[buff2]; _delay_ms(2); PORTC=0xff;
    PORTD=0x80; PORTC=fnd[buff1]; _delay_ms(2); PORTC=0xff;
  }
  else{
    PORTD=0x80; PORTC=fnd[buff1]; _delay_ms(4); PORTC=0xff;
  }
}
//
void reset(){
  int t=0;
  if(!(PIND&8)){
    while(t<250){ fnd_on_0(); t++; if(PIND&8)break; }
    if(t>=250)i=0; else i=9999;
    _delay_ms(1000);
  }
}
//
int main(){
  DDRC=0xff; DDRD=0xF0;
  while(1){
  if(PIND&4==0){ i++; _delay_ms(50); }
    buff4=i/1000; buff3=i/100%10; buff2=i/10%10; buff1=i%10;
    fnd_on_0();
    reset();
    if(i>9999)i=0;
  }
}

4ms * 250 = 1000ms = 1sec
누르는 시간을 최대 1초로 조정했습니다.

총체적난국님의 댓글

총체적난국 작성일

아 제가 말씀 안드린 부분이 있는데 스위치를 3초정도 눌러야 리셋 되는 기능을 구현하기 위해 짠 코드라 누르는 시간 단축은 하면 안됩니다.ㅠㅠ

혹시 시간 단축말고 다른 방법은 없을까요?

master님의 댓글

master 댓글의 댓글작성일

3초면 250을 750으로 고치기만 하면 그만 아닌가요?
간단한 것인데요

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[25] master  17-10-29
질문 라즈베리파이4 신형 선택문제 댓글[1] maximum 새글 22-06-26
질문 음전압 ADC 댓글[1] 412904 새글 22-06-26
질문 아두이노 센서값 출력 질문입니다! 댓글[1] 아궁2  22-06-24
질문 ATmega128, ATmega28 RS232통신 첨부파일Moon4201  22-06-24
답변 답변 : ATmega128, ATmega28 RS232… 댓글[1] master  22-06-25
질문 서보모터, 온습도센서 코드 질문 댓글[2] 첨부파일kshdlfaldfh  22-06-22
답변 답변 : 서보모터, 온습도센서 코드 질문 댓글[15] master  22-06-22
질문 steppermulti5 질문 응애  22-06-21
답변 답변 : steppermulti5 질문 댓글[1] master  22-06-22
질문 atmega128 avr usart 질문 snoflak  22-06-21
답변 답변 : atmega128 avr usart 질문 댓글[5] master  22-06-21
질문 사용자 정의 함수 변환 하는 방법 댓글[2] 첨부파일da0800  22-06-21
질문 atmega128 댓글[1] 양의노래  22-06-20
질문 아두이노 동시동작 재질문 댓글[9] 첨부파일죠르디  22-06-20
질문 초음파센서로 dc모터 제어하기 댓글[1] 첨부파일난쟁2  22-06-20
질문 아두이노 동시동작 댓글[7] 죠르디  22-06-19
질문 ATMEGA128 UART,FND 연동 질문 JMOD  22-06-19
답변 답변 : ATMEGA128 UART,FND 연동 질문 댓글[1] master  22-06-20
질문 atmeg128 질문이요 댓글[1] 첨부파일공대생er  22-06-18
질문 atmega128 초음파 센서로 신호등 시간초 늘리기 서동씨  22-06-18
답변 답변 : atmega128 초음파 센서로 신호등 시간초… 댓글[1] master  22-06-18
질문 atmega128 댓글[2] 망경이  22-06-18
질문 앱인벤터 이용해서 수동 자동 할라고하는데 ..잘안됩니다… 댓글[1] 따랑해영  22-06-18
답변 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 ..… 댓글[1] 첨부파일따랑해영  22-06-19
답변 질문 : 앱인벤터 이용해서 수동 자동 할라고하는데 .… 첨부파일따랑해영  22-06-19
질문 서보모터와 초음파센서 댓글[1] 브링미히어  22-06-17
질문 LCD 도와주세요 ㅜㅠㅠㅠ 댓글[2] 첨부파일dentist22  22-06-17
질문 안녕하세요 atmega128 질문드리고 싶습니다. (자… 댓글[3] dlcldl  22-06-17
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전