«   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

[avr] LCD 타이머 표시 본문

Univ/AVR atmega128

[avr] LCD 타이머 표시

ITGenerations 2017. 12. 10. 00:00

// source 29

#include <avr/interrupt.h> 

#include <avr/io.h> // I/O 레지스터정의

#include <util/delay.h> // 시간지연함수 

#include <string.h>

#include "lcd.h" // LCD 제어프로그램 헤더파일


#define DEBOUNCING_DELAY 20

#define MAX_NUM 10000 // 타이머 맥시멈 정하기 , 원래 1,000


unsigned short data = 0;

char string[20]; // 문자열을 구성할 배열


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

static char lcdtitle[] = "TIMER:"; // 실습 제목


ISR(INT0_vect)

{

TIMSK &= ~(1 << OCIE2);

msec_delay(DEBOUNCING_DELAY);

while (~PIND & 0x01);

msec_delay(DEBOUNCING_DELAY);


data += 1;// data를 1 증가한다.

if (data > MAX_NUM)

data -= MAX_NUM;

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

LcdMove(1,0); // HOME

sprintf(string,"%d        ", data);

LcdPuts(string);

EIFR = (1 << INTF0);


}

ISR(INT1_vect)

{

TIMSK &= ~(1 << OCIE2);

msec_delay(DEBOUNCING_DELAY);

while (~PIND & 0x02);

msec_delay(DEBOUNCING_DELAY);


data =0 ;// data reset

if (data > MAX_NUM)

data -= MAX_NUM;

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

LcdMove(1,0); // HOME

sprintf(string,"%d        ", data);

LcdPuts(string);

EIFR = (1 << INTF1);

}



ISR(INT2_vect)

{

if (TIMSK & (1 << OCIE2))

{

TIMSK &= ~(1 << OCIE2);

}

else

{

TIMSK |= (1 << OCIE2);

}

msec_delay(DEBOUNCING_DELAY);

while (~PIND & 0x04);

msec_delay(DEBOUNCING_DELAY);


EIFR = (1 << INTF2);

}



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

LcdMove(1,0); // HOME

sprintf(string,"%d        ", data);

LcdPuts(string);

}

}



int main()

{

char i;

data = 0;


LcdInit(); // LCD 초기화

LcdMove(0,0); // HOME

LcdPuts(lcdtitle); // 실습 제목을 쓴다.


string[0]  = '0';

string[1]  = '\0'; // 문자열의 끝


LcdMove(1,0);

LcdPuts(string); // SRAM내의 문자열 출력


/////////////////////////// Switch ////////////////

SFIOR &= ~(1 << PUD); // PUD는 io.h에 정의되어 있음.

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


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


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


TCCR2 = (1 << WGM01) | (0<WGM00) | (1 << COM00) | (1 << CS02) | (0 << CS01) | (1 << CS00);

TCNT2 = 0x00;

OCR2 = 0x9C;

TIMSK |= (1 << OCIE2);



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



while(1);

}


// 시간지연함수

//////////////////////////////////////////

void msec_delay(int n)

{

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

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

}

'Univ > AVR atmega128' 카테고리의 다른 글

[avr]코드 목록  (0) 2017.12.10
[avr]서보모터+LCD  (0) 2017.12.10
[avr] LCD제어 모듈 테스트, 가변저항 x  (0) 2017.12.09
[avr]키패드 입력, 세븐세그먼트 [실패]  (0) 2017.12.09
세븐 세그먼트 + 키패드  (0) 2017.12.09