BASIC4MCU | 질문게시판 | atmega128 fnd 24시간 시계
페이지 정보
작성자 마이크로어려워 작성일2023-04-27 12:15 조회980회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=22517
본문
안녕하세요 저는 아트멜 스튜디오를 이용하여 atmega128로 실습을 하고 있는 중 입니다.
현재 24 시간 시계 를 구현해야 되는데 조건이
SW1을 한 번 누르면 시간 단위를 수정할 수 있는 모드가 되고, 두 번 누르면 분 단위를 수정할 수 있는 모드가 되고, 3번 누르면 다시 정상적으로 돌아와 시계가 동작됨.
수정 모드에서는 SW2을 한번 누를 때마다 대상이 되는 값이 1씩 증가됨(단, 시간의 경우는 23>1, 분의 경우는 59>1로 변경) 이렇게 인데 조건은 어느정도 맞게 짜여진거 같습니다.
현재 시간은 분 상태이고 분은 초 상태인데요. 시간 수정 모드에서 +1씩 할때 9시에서 10시가 되어야 하는데 0____ 이런식으로 이상하게 출력이 되네요... 어떻게 해야 될지 모르겠어서 질문글 올립니다
#include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 16000000UL #include <util/delay.h> #define STOP 0 #define HOUR_MODE 1 // 시간 수정 모드 #define MINUTE_MODE 2 // 분 수정 모드 volatile int cur_time = 0; volatile int state = STOP;; unsigned char digit[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67}; unsigned char fnd_sel[4] = {0x01, 0x02, 0x04, 0x08}; ISR(INT4_vect) { _delay_ms(10); EIFR |= 1<<4; if((PINE & 0x10) == 0x10) return; if (state == STOP) { state = HOUR_MODE; // SW1을 한 번 누르면 시간 수정 모드로 변경 } else if (state == HOUR_MODE) { state = MINUTE_MODE; // SW1을 두 번 누르면 분 수정 모드로 변경 } else { state = STOP; // SW1을 세 번 누르면 수정 모드를 종료하고, 시간을 흐르게 함 } } ISR(INT5_vect) { _delay_ms(10); EIFR |= 1<<5; if((PINE & 0x20) == 0x20) return; if (state == STOP) { cur_time = 0; // SW2를 누르면 시간 초기화 } else if (state == HOUR_MODE) { cur_time += 3600; // 시간 수정 모드에서 SW2를 누르면 1시간 추가 if (cur_time >= 86400) // 24시를 넘어가면 0시로 변경 { cur_time = cur_time % 86400; } } else if (state == MINUTE_MODE) { cur_time += 60; // 분 수정 모드에서 SW2를 누르면 1분 추가 if ((cur_time / 60) % 60 >= 60) // 60분을 넘어가면 1분으로 변경 { cur_time -= 60; } } } void init() { DDRC = 0xff; DDRG = 0x0f; DDRE = 0xcf; PORTC = digit[0]; PORTG = 0x0f; EICRB = 0x0a; EIMSK = 0x30; sei(); } void display_fnd(int count) { int i,j, fnd[4]; fnd[3] = (count / 36000) % 6; // 0~2까지의 값으로 변경 fnd[2] = (count / 3600) % 10; fnd[1] = (count / 600 ) % 6; fnd[0] = (count / 60) % 10; // for(j=0; j<100; j++){ for(i=0; i<4; i++) { PORTC = digit[fnd[i]]; PORTG = fnd_sel[i]; _delay_ms(2); if(i == 1 || i == 3) { PORTC |= 0x80; } else { PORTC &= ~0x80; } } // } } int main() { init(); while(1) { if (state == STOP) { display_fnd(cur_time); cur_time++; if (cur_time >= 86400) // 24시간을 넘어가면 0시로 변경 { cur_time = 0; } } else { display_fnd(cur_time); } } }
댓글 1
조회수 980master님의 댓글
master 작성일
if ((cur_time / 60) % 60 >= 60)cur_time -= 60; // 60분을 넘어가면 1분으로 변경
이 문장이 필요 할까요?
if (cur_time >= 86400)cur_time = cur_time % 86400;
시간에서 사용한 이 코드를 그대로 분에서도 사용하면 될 것 같습니다.