본문 바로가기

AVR 기초/FND 제어하기

[AVR 기초] FND 4자리를 한번에 나타내기

*키트는 Atmega128A를 사용하였습니다*

 

 

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

unsigned char fnd[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f};
unsigned char fnd_pos[4] = {0x01, 0x02, 0x04, 0x08} ;

void fourth(int x){					//fnd의 4번째 자리를 나타내는 함수
	PORTG = fnd_pos[3];				//PORTG에 fnd_pos[3]의 값
	PORTC = fnd[x];					//PORTC에 main 함수에서 x의 값을 받아 fnd[x] 저장
}
void third(int y){					//fnd의 3번째 자리를 나타내는 함수
	PORTG = fnd_pos[2];				//PORTG에 fnd_pos[2]의 값
	PORTC = fnd[y];					//PORTC에 main 함수에서 y의 값을 받아 fnd[y] 저장
}
void second(int o){					//fnd의 2번째 자리를 나타내는 함수
	PORTG = fnd_pos[1];				//PORTG에 fnd_pos[1]의 값
	PORTC = fnd[o];					//PORTC에 main 함수에서 o의 값을 받아 fnd[o] 저장
}
void first(int p){					//fnd의 1번째 자리를 나타내는 함수
	PORTG = fnd_pos[0];				//PORTG에 fnd_pos[0]의 값
	PORTC = fnd[p];					//PORTC에 main 함수에서 p의 값을 받아 fnd[p] 저장
}

int main(void)						//main 함수
{
	DDRC = 0xff;					//fnd 다 사용
	DDRG = 0x0f;					//fnd자리 4자리 다 사용
	while (1)
	{
		fourth(0);					//fourth, third, second, first 각각의 함수에 0을 넣어줘서 모든 fnd에 0출력
		third(0);
		second(0);
		first(0);
		for (int x = 0 ; x <10 ; x++){					//x=0, x<10만큼 반복
			
			for (int y = 0 ; y < 10; y++){				//x=0, x<10만큼 반복
				
				for (int o = 0 ; o < 10; o++){			//x=0, x<10만큼 반복
					
					for (int p = 0 ; p < 10 ; p++){		//x=0, x<10만큼 반복
						for (int sec = 0 ; sec < 500 ; sec++)//sec가 0부터 1씩 증가해 499가 될때까지 반복
						{
							first(p);			//첫번째자리
							_delay_ms(1);		//0.001 딜레이
							second(o);			//두번째 자리
							_delay_ms(1);		//0.001 딜레이
							third(y);			//세번째 자리
							_delay_ms(1);		//0.001 딜레이
							fourth(x);			//네번째 자리
							_delay_ms(1);		//0.001 딜레이
						}
					}
				}
			}
		}
	}
	return 0 ;
}