ITGenerations
[avr] LCD 타이머 표시 본문
// 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 |