BASIC4MCU | 질문게시판 | IF문 단축 관련 문의
페이지 정보
작성자 총체적난국 작성일2021-06-22 16:03 조회4,360회 댓글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);
}
}
댓글 3
조회수 4,360master님의 댓글
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으로 고치기만 하면 그만 아닌가요?
간단한 것인데요