BASIC4MCU | 질문게시판 | 마스터님 질문드립니다.
페이지 정보
작성자 ghdrmszz 작성일2019-05-29 10:06 조회3,860회 댓글1건본문
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
//
#define DO 0
#define RE 1
#define MI 2
#define FA 3
#define SOL 4
#define RA 5
#define SI 6
#define DDO 7
#define EOS -1
//
#define STOP 0
#define GO 1
//
#define CDS_VALUE 871
unsigned char digit[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67};
char f_table[8]={17,43,66,77,97,114,117,137};
int song[] ={SOL,MI,MI,FA,RE,RE,DO,RE,MI,FA,SOL,SOL,SOL,SOL,MI,MI,MI,FA,RE,RE,DO,MI,SOL,MI,RE,MI,DO,RE,RE,RE,RE,RE,MI,FA,MI,MI,MI,MI,MI,FA,SOL,SOL,MI,MI,FA,RE,RE,DO,MI,SOL,MI,RE,MI,DO,EOS};
//
volatile int tone,run=STOP;
//
ISR(INT4_vect)
{
if(run==STOP)
run=GO;
}
//
ISR(TIMER0_OVF_vect)
{
if(run==STOP)
{
PORTB=0x00;
run=GO;
}
else
{
PORTB=0x10;
run=STOP;
}
TCNT0=f_table[tone];
}
//
void display_fnd(int i)
{
PORTC=digit[i/100 %10];
PORTG=1;
_delay_us(2500);
PORTC=digit[i/1000 %10];
PORTG=2;
_delay_us(2500);
PORTC=digit[i/10000 %10];
PORTG=4;
_delay_us(2500);
PORTC=digit[i/100000 %10];
PORTG=8;
_delay_us(2500);
}
//
void init_adc()
{
ADMUX=0x00;
ADCSRA=0x87;
}
//
unsigned short read_adc()
{
unsigned char adc_low,adc_high;
unsigned short value;
ADCSRA|=0x40;
while((ADCSRA&0x10)!=0x10);
adc_low=ADCL;
adc_high=ADCH;
value=(adc_high<<8)|adc_low;
return value;
}
//
void show_adc(unsigned short value)
{
if(value < CDS_VALUE)
{
PORTA=0xff;
}
else
{
PORTA=0x00;
}
}
//
int main()
{
int i=0;
unsigned short value;
init_adc();
DDRA=0xff;
PORTC=digit[0];
PORTG=0x0f;
DDRB=0x10;
DDRC=0xff;
DDRE=0xcf;
DDRG=0x0f;
//
for(i=500; i>=0; i--)
{
display_fnd(i);
value=read_adc();
show_adc(value);
}
//
TCNT0=f_table[song[i]];
TCCR0=0x03;
TIMSK=0x01;
EICRB=0xAA;
EIMSK=0x00;
sei();
//
while(1)
{
if(run)
{
while(tone !=EOS)
{
tone=song[i++];
if(tone==EOS)
{
i=0;
run=STOP;
}
_delay_ms(600);
value=read_adc();
show_adc(value);
}
value=read_adc();
show_adc(value);
}
}
}
저희 소스코드가 빌드와 구현에는 문제가 없는데 빨간색으로 칠한 부분을 중복 없이 하나로 만들려고 했지만 자꾸 실패하고 있습니다.
색칠한 부분을 하나로 정리하되 기능은 똑같이 되게하고 싶습니다.오랜시간 고민하고 마스터님께 질문드립니다.
댓글 1
조회수 3,860master님의 댓글
master 작성일
왜 하나로 만들려고 할까요?
각각 처리해야하는 위치가 다르므로 합치지 못합니다.
설령 합칠 수 있더라도 코드가 아주 복잡해집니다.
이해하기 쉬운 코드가 좋은 코드입니다.
억지로 합쳐서 코드를 복잡하게 만든다면 좋은 코드가 아닙니다.
스스로도 합치기 어려울만큼 복잡한 코드라면 본인 수준에서 합치지 않는 것이 바람직한겁니다.