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;
}