ITGenerations
세븐 세그먼트 + 키패드 본문
// 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 시간지연
}
'Univ > AVR atmega128' 카테고리의 다른 글
[avr] LCD제어 모듈 테스트, 가변저항 x (0) | 2017.12.09 |
---|---|
[avr]키패드 입력, 세븐세그먼트 [실패] (0) | 2017.12.09 |
[avr] 세븐세그먼트 1씩 증가 (0) | 2017.12.09 |
[avr] 세븐세그먼트/트랜지스터 사용 o (0) | 2017.12.09 |
[avr]세븐세그먼트, 트랜지스터 사용 x (0) | 2017.12.09 |