ATmega128 타이머, 알람, LCD, 모터제어 코딩에 대한 질문이 있습니다.
페이지 정보
작성자 리치 작성일21-06-03 14:47 조회6,409회 댓글1건본문
//;**** 먹이 제어 시계 *****
#include <avr/io.h>
#include <avr/interrupt.h>
#include "OK128.h"
unsigned char FL,FL2;
volatile unsigned char second, minute, hour=12;
volatile unsigned char ampm = 'P';
volatile unsigned char minuteA, hourA=00;
volatile unsigned char ampmA = 'A';
void LCD_2digit(unsigned char number) //2자리 디스플레이
{ LCD_data4(number/10 +'0'); //10
LCD_data4(number%10 +'0'); //1
}
//------- 알람 시 셋팅 -------------------------------------
void AACONT(void)
{ hourA++; // increment hour
if(hourA == 13) // if hour = 13, hour = 1
{hourA = 1; }
if(hourA == 12) // if hour = 12, adjust AM/PM
{if(ampmA == 'A') {ampmA='P';}
else ampmA ='A';
}
}
//-------- 알람 분 셋팅 -------------------------------------
void AMCONT(void)
{ minuteA++; // increment minute
if(minuteA == 60) // if minute = 60, minute = 0
{ minuteA = 0;
} }
void DISP_AL1(void)
{ LCD_command4(0xC7); // display AM/PM
LCD_data4(ampmA);
LCD_command4(0xCA); // display hour
LCD_2digit(hourA);
LCD_command4(0xCD); // display minute
LCD_2digit(minuteA);
}
//====== 알람1 시간 셋팅용 함수 ====================
void AL1_SET(void)
{ if((PIND & 0B01000000)==0)
{ AACONT(); DISP_AL1();}
if((PIND & 0B00010000) ==0)
{ AMCONT(); DISP_AL1();}
}
//------- 시 셋팅 ----------------------------------------
void ACONT(void)
{ hour++; // increment hour
if(hour == 13) // if hour = 13, hour = 1
{hour = 1; }
if(hour == 12) // if hour = 12, adjust AM/PM
{if(ampm == 'A') {ampm = 'P';}
else ampm = 'A';
}
}
//-------- 분 셋팅 ----------------------------------------
void MCONT(void)
{ minute++; // increment minute
if(minute ==60) // if minute = 60, minute = 0
{ minute = 0;
}
}
void DISP(void) //디스플레이
{ LCD_command4(0x81); // display AM/PM
LCD_data4(ampm);
LCD_command4(0x84); //display hour
LCD_2digit(hour);
LCD_command4(0x87); //display minute
LCD_2digit(minute);
LCD_command4(0x8A); // display second
LCD_2digit(second);
}
//====== 시간 셋팅용 함수 ===================================
void A_SET(void)
{ if(!(PIND & 0B00100000)) //분 조정 버튼
{ MCONT();
DISP(); }
if(!(PIND & 0B00000100)) //시 조정 버튼
{ ACONT();
DISP(); }
}
//*******************************************************************
ISR(TIMER1_COMPA_vect) //타이머 인터럽트 함수
{ second++; // increment second
if(second == 60) // if second = 60, second = 0
{ second = 0;
minute++; // increment minute
if(minute == 60) // if minute = 60, minute = 0
{ minute = 0;
hour++; // increment hour
if(hour == 13) // if hour = 13, hour = 1
hour = 1;
if(hour == 12) // if hour = 12, adjust AM/PM
{ if(ampm == 'A') ampm='P';
else ampm='A';
}
}
}
DISP();
}
void OPEN(void) //문 여닫기 함수
{PORTD |=0B00000010; //모터 열기 회전.
Delay_ms(150); //150미리초 동안
PORTD &=0B11111101; //모터 정지
Delay_ms(1000); //1초간 열림.
PORTD |=0B00001000; //모터 닫기 회전.
Delay_ms(160); //160미리초 간
PORTD &=0B11110111; //모터 정지
Delay_ms(3000);
}
//***** 메 인 함 수 *************************************
int main(void)
{
DDRB = 0B11111111; // PORTB = output
PORTB =0B00000000;
DDRD = 0B00001010;
PORTD =0B11110101;
LCD_initialize4(); //LCD초기화
LCD_string4(0x80," PM 12:00:00 ");
LCD_string4(0xC0,"ALARM AM 00:00 ");
//;------ Initialize Timer/Counter1 CTC Mode (1초 생성용) -------
TCCR1A = 0x00; // CTC mode(4), don't output OC1A
TCCR1B = 0x0C; // 16MHz/256/(1+62499) = 1Hz
TCCR1C = 0x00;
OCR1A = 31249;
TCNT1 = 0x0000; // clear Timer/Counter1
//----------- 타이머 1 int 셋팅 --------------------------------
TIMSK = 0x10; // enable OC1A interrupt
ETIMSK = 0x00;
TIFR = 0x3C; // clear all interrupt flags
ETIFR = 0x01;
sei(); //인터럽트 시작.
while(1)
{
A_SET(); //현재 시간 조정
AL1_SET(); //알람1 시간 조정
if((minute==minuteA)&&(hour==hourA)&&(ampm==ampmA)) //알람상황이면...
{if(!(FL))
{OPEN(); //모터 작동.
FL=1;
}
}
else FL=0; //알람 아니면
if((PIND & 0B00000001)) //밤이 되면
{if(!(FL2))
{OPEN(); //모터 작동,
FL2=1; //알람 플래그 셋
}
}
if(!(PIND & 0B00000001)) //아침이 되면
{if((FL2))
{OPEN(); //모터작동.
FL2=0; //알람 플래그 셋
}
}
if(!(PIND & 0B10000000)) //임의 스위치 누르면
{OPEN();} //모터 작동.
Delay_ms(200);
}
}
댓글 : 1
조회수 : 6,409
master님의 댓글
master 작성일제공된 예제를 구동해서 각각의 센서 및 회로가 정상동작하는지 체크부터 하세요