Avr

[Atmega 128] FND 제어

ETIT 2020. 4. 11. 19:54
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>

#define COM1 4
#define COM2 5
#define COM3 6
#define COM4 7

unsigned char digit[10] = {0b11000000,0b11111001,0b10100100,0b10110000,0b0011001,0b10010010,0b10000010,0b11011000,0b10000000,0b10011000};
unsigned char fnddig[4] = {0,0,0,0};
unsigned char* fndp = fnddig;


volatile int m_cnt = 0;
volatile int s_cnt = 0;
volatile unsigned char p = 0;

void init_port();
void init_int();
void up_count();
void down_count();


ISR(TIMER0_COMP_vect)
{
	m_cnt++;	
	if(m_cnt >= 100)
	{
		m_cnt = 0;
		s_cnt++;		
	}		
}

ISR(INT0_vect)
{
	p++;
	
	if(p >= 2)
		p = 1;
	
	if(p == 1)
	up_count(s_cnt);
	else if(p == 2)
	down_count(s_cnt);
}

int main(void)
{
	init_port();
	init_int();
	sei();
	while(1)
	{
		;
	}		
}

void init_port()
{
	DDRC |= 0XFF;
	DDRB |= 0XF0;
	DDRD |= 0x00;	
	PORTC |= 0XFF;
	PORTB |= 0XF0;
}

void init_int()
{		
	ASSR = 0;
	TCCR0 |= (1 << WGM01)|(1 << CS02)|(1 << CS01)|(1 << CS00);
	TIMSK |= (1 << OCIE0);
	TCNT0 |= 0X00;	
	OCR0 = 160;
	TIFR = 0;	
}

void up_count(int i)
{	

	*fndp= (i%10000)/1000;
	*(fndp+1) = (i%1000)/100;
	*(fndp+2) = (i%100)/10;
	*(fndp+3) = i%10;
		
	for(int k = 0 ; k < 30 ; k++)
	{
		PORTB |= 1 << COM1;
		_delay_ms(1);
		PORTB &= 1 << COM1;
		PORTC = digit[fndp[0]];
		
		PORTB |= 1 << COM2;
		_delay_ms(1);
		PORTB &= 1 << COM2;
		PORTC = digit[fndp[1]];
		
		PORTB |= 1 << COM3;
		_delay_ms(1);
		PORTB &= 1 << COM3;
		PORTC = digit[fndp[2]];
		
		PORTB |= 1 << COM4;
		_delay_ms(1);
		PORTB &= 1 << COM4;
		PORTC = digit[fndp[3]];
	}
	
	i++;
	if(i >= 10000)
	i=0;
}

void down_count(int i)
{
	*fndp= (i%10000)/1000;
	*(fndp+1) = (i%1000)/100;
	*(fndp+2) = (i%100)/10;
	*(fndp+3) = i%10;
	
	for(int k = 0 ; k < 30 ; k++)
	{
		PORTB |= 1 << COM1;
		_delay_ms(1);
		PORTB &= 1 << COM1;
		PORTC = digit[fndp[0]];
		
		PORTB |= 1 << COM2;
		_delay_ms(1);
		PORTB &= 1 << COM2;
		PORTC = digit[fndp[1]];
		
		PORTB |= 1 << COM3;
		_delay_ms(1);
		PORTB &= 1 << COM3;
		PORTC = digit[fndp[2]];
		
		PORTB |= 1 << COM4;
		_delay_ms(1);
		PORTB &= 1 << COM4;
		PORTC = digit[fndp[3]];
	}
	
	i--;
	if(i <= 0)
	i=0;
}