«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

ITGenerations

세븐 세그먼트 + 키패드 본문

Univ/AVR atmega128

세븐 세그먼트 + 키패드

ITGenerations 2017. 12. 9. 20:52

// source 26

// 세븐 세그먼트 + 키패드

/*

트랜지스터 사용하면 작동 x

*/ 


#include <avr/interrupt.h>

#include <avr/io.h>

#include <util/delay.h>

#include "iseg7.h"

#define DEBOUNCING_DELAY 20

#define HIGHNIBBLE 4

#define MAX_NUM 99

void msec_delay(int n);

unsigned short data=0;



//1st button

//1씩 증가

ISR(INT0_vect)

{

TIMSK &= ~(1<<OCIE2);

msec_delay(DEBOUNCING_DELAY);

while(~PIND&0x01);

msec_delay(DEBOUNCING_DELAY);


data += 1;

if(data>MAX_NUM)

{data -=MAX_NUM;}

ISeg7DispNum(data, 10);

EIFR=(1<<INTF0);


}

//2nd button

//5씩 증가

ISR(INT1_vect)

{

TIMSK &= ~(1<<OCIE2);

msec_delay(DEBOUNCING_DELAY);

while(~PIND&0x02);

msec_delay(DEBOUNCING_DELAY);


data += 5;

if(data>MAX_NUM)

data -=MAX_NUM;

ISeg7DispNum(data, 10);

EIFR=(1<<INTF1);


}




//3rd button

//정지, 다시시작

ISR(INT2_vect)

{

msec_delay(DEBOUNCING_DELAY);

while(~PIND&0x04);

msec_delay(DEBOUNCING_DELAY);

if(TIMSK&(1<<OCIE2)){

TIMSK &= ~(1<<OCIE2);

}

else{

TIMSK |= (1<<OCIE2);

}


EIFR=(1<<INTF2);

}


// Control Timer Speed

// 1씩 증가속도 제어

ISR(TIMER2_COMP_vect)

{

static int n_enter2=0;

n_enter2++;

if(n_enter2==10){

n_enter2=0;

data++;

if(data>MAX_NUM){

data-=MAX_NUM;}

ISeg7DispNum(data,10);

}

}


int main()

{

//내부 pull up 활성화

DDRD=0x00;

SFIOR &= ~(1<<PUD);


//7세그먼트 초기화 

ISeg7Init();


PORTD|=(0x01);



PORTD |= (1 << PD0) | (1 << PD1) | (1 << PD2); // Switch로 사용할 PD0와 PD1, PD2만을 출력으로 설정.


EICRA =  (1<<ISC21) | (1<<ISC11) | (1<<ISC01); // Interrupt 0,1,2를 하강모서리 트리거 (교재 p110)


EIMSK |= (1<<INT0)| (1<<INT1)|(1<<INT2);


TCCR2 = (1<<WGM01)|(0<<WGM00)|(1<<COM00)|(1<<CS02)|(0<<CS01)|(1<<CS00); // Timer 강의자료 참조



TCNT2 = 0x00;



OCR2 = 0x9C;

TIMSK |= (1 << OCIE2);



sei(); // 전역 인터럽트 허용.


   // 초기 쓰기작업 

ISeg7DispNum(data, 10);// 10진수로 표시



while (1);


return 0;

}

void msec_delay(int n)// 시간지연함수

{

for (; n >0; n--)  // 1msec 시간지연을 n회 반복

_delay_ms(1);// 1msec 시간지연

}