/*
* avr-0910.cpp
*
* Created: 2018-09-10 오전 9:20:31
* Author : USER
*/
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include "lcd.h"
#include <avr/interrupt.h>
#include <stdio.h>
#define LED_SEL1 (*(volatile unsigned char *)0xA000)
#define LED_SEL2 (*(volatile unsigned char *)0xB000)
#define FND (*(volatile unsigned char *)0x8000)
void io_init(void)
{
MCUCR|=(1<<SRE) | (1<<SRW10);
XMCRA=(1<<SRL2) | (0<<SRL1) | (0<<SRL0) | (1<<SRW01) | (1<<SRW00) | (1<<SRW11);
XMCRB |= 0x00;
}
unsigned int count =0, sec=0, min=0,hour=0;
unsigned int mode =0, ampm =0;
unsigned int flag=0;
unsigned int saveSec=0, saveMin=0,saveHour=0;
ISR(TIMER0_OVF_vect){
TCNT0 =6;
count++;
if (count >1000){
sec++; count=0;
if(sec>=60){
min++; sec=0;
if (min>=60){
hour++; min=0;
if(hour>12){
hour=0;
if(ampm == 0) ampm =1;
else if(ampm ==1) ampm=0;
count =0;
}
}
}
}
}
int main(void)
{
/* Replace with your application code */
io_init();
lcd_init();
DDRE = 0x8f; // 스위치
PORTE = 0xff;
// 타이머 인터럽트 레지스터
TIMSK = 0x01; // R/W 선택 TIMER 0 사용
TCCR0 =0x04; // 분주비 64
TCNT0 =6; // 6에서 시작 255가되어 256이 되면 OVF가 되어 인터럽트 구문을 실행한다.
/*
1/16000000 = 0.0000000625
분주비가 64
0.0000000625 *64 = 0.000004 // TCNT0가 1올라가는 속도.
ISR이 발생하는 시간 = 0.000004
TCNT 250 회로 OVF 발생시 걸리는 시간 0.001
500번이 OVF 인터럽트가 발생하면 1초가 된다.
*/
mode =0;
sei();
char temp[16];
int sel =0;
while (1)
{
//input
if (((PINE & 0x10)== 0x00) && flag ==0 ){
sel=0;
mode++;
if(mode >=2)mode =0;
flag=1;
}
// 숫자 증가 input
else if (((PINE & 0x20)== 0x00)&& flag==0 && mode==1 ){
if (sel==0){hour++;
if (hour >=60) hour =0;
}
else if (sel ==1){ min++;
if(min>=60) min=0;
}
else if(sel ==2){ sec++;
if(sec>=60) sec=0;
}
else if(sel==3){
if (ampm ==0) ampm =1;
else if (ampm ==1) ampm=0;
}
flag=1;
}
// 숫자 선택 셀 증가
else if (((PINE & 0x40)== 0x00)&& flag==0 && mode==1 ){
sel++;
if (sel >=4) sel=0;
flag=1;
}
else if (PINE == 0xff){ flag=0;
}
//display
switch(mode){
case 0:
sprintf(temp," %2d :%2d :%2d %2s",hour,min,sec,(ampm==0)?"AM":"PM");
lcd_putsf(0,0," Normal Mode ");
lcd_putsf(0,1,temp);
break;
case 1:
sprintf(temp," %2d :%2d :%2d %2s",hour,min,sec,(ampm==0)?"AM":"PM");
if (sec%2 ==0){
if(sel==0)temp[1] = temp[2] =' ';
else if(sel==1)temp[5] = temp[6] =' ';
else if(sel==2)temp[9] = temp[10] =' ';
else if (sel==3)temp[12] = temp[13] =' ';
else sel =0;
}
lcd_putsf(0,0," Modify Mode ");
lcd_putsf(0,1,temp);
break;
}
}
}