BASIC4MCU | 질문게시판 | 답변 : 알람시계 만드는 중입니다.. FND 결선 문제가 있어보여서 질문드립니다...,
페이지 정보
작성자 master 작성일2019-12-26 23:29 조회3,273회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=11420
본문
헤더파일이 지워진 것을보니 네이버 지식인에 올린 질문을 복사했나봅니다.
//#include <mega128.h>#include <delay.h>//#define RESET 0#define GO 1#define STOP 2//int seg_number[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};int seg_count=0;//int stopwatch_count=0,stopwatch_count_control=0;int number_count=0,number_count_temp=0;int N1000,N100,N10,N1;//char mode=0;//int watch_count=0;int second=0,minute=0,hour=0,M1=0,M10=0,H1=0,H10=0;//int alarm_minute=0,alarm_hour=0,alarm_M1=0,alarm_M10=0,alarm_H1=0,alarm_H10=0;//void time_and_alarm_init(void){hour=23; minute=59; alarm_hour=0; alarm_minute=0;}//void switch_1(void){ // PG2 눌렀을 때의 함수(시간-알람 바꾸기,스탑워치 시작-정지)//현재 시간 바꾸기if(mode<5){if (mode==1){ M1=(M1+1)%10; }else if(mode==2){ M10=(M10+1)%6; }else if(mode==3){if (H10< 2)H1=(H1+1)%10;else if(H10==2)H1=(H1+1)%4;}else if(mode==4){if(H1>3){ H10=(H10+1)%2; }else { H10=(H10+1)%3; }}//minute=M10*10+M1; hour=H10*10+H1; // 세팅한 값을 현재 시간에 업데이트}// 스탑워치 동작시 스위치의 동작을 결정/*--------------------------------------------------------------------------------------*/if(mode==5){if ((stopwatch_count_control==STOP)||(stopwatch_count_control==RESET)){ stopwatch_count_control=GO; }else if(stopwatch_count_control==GO ){ stopwatch_count_control=STOP; }}// 알람시간 바꾸기/*--------------------------------------------------------------------------------------*/if(mode>5){if (mode==6){ alarm_M1=(alarm_M1+1)%10; }else if(mode==7){ alarm_M10=(alarm_M10+1)%6; }else if(mode==8){if (alarm_H10< 2)alarm_H1=(alarm_H1+1)%10;else if(alarm_H10==2)alarm_H1=(alarm_H1+1)%4;}else if(mode==9){ alarm_H10=(alarm_H10+1)%3; }//alarm_minute=alarm_M10*10+alarm_M1; alarm_hour=alarm_H10*10+alarm_H1; // 알람 시간 업데이트}delay_ms(200);}//void switch_2(void){ // PG3 눌렀을 때의 함수(모드 바꾸기,스탑워치 리셋)//스탑워치 리셋 구문if(mode==5){// 스탑워치가 STOP인 상태에서는 모드가 바뀌지 않는다.if(stopwatch_count_control==STOP){ stopwatch_count_control=RESET; }// 스탑워치가 GO나 RESET 상태에서는 모드가 바뀐다.else if((stopwatch_count_control==GO)||(stopwatch_count_control==RESET)){ mode=6; }}else{ mode++; } // 스탑워치 이외의 모드에서는 모드 바꾸기 동작//delay_ms(200);if(mode==10)mode=0; //모드 변수 리셋}// 타이머/카운트 레지스터void timer_init(void){TCCR0=0x05; TCNT0=6; TIMSK=0x01; // 2ms}//interrupt[TIM0_OVF]void timer_int0(void){TCNT0=6;// 7-세그먼트/*-------------------------------------------------------------*/if(++seg_count==5)seg_count=1;//시계 동작 세팅/*----------------------------------------------------------*/if(++watch_count==500){ //1초watch_count=0;if(++second==60){ second=0;if(++minute==60){ minute=0; if(++hour==24)hour=0; }}}//H10=hour/10; H1=hour%10; M10=minute/10; M1=minute%10;//if(mode<5){if(seg_count==1){PORTC=0b00001110;if(mode==4){ //0.5초마다 깜빡임.if(watch_count>250)PORTA=seg_number[H10];else PORTA=0x80;}else PORTA=seg_number[H10];}else if(seg_count==2){PORTC=0b00001101;if(mode==3){if(watch_count>250)PORTA=seg_number[H1]|0x80;else PORTA=0x80;}else PORTA=seg_number[H1]|0x80;}else if(seg_count==3){PORTC=0b00001011;if(mode==2){if(watch_count>250)PORTA=seg_number[M10];else PORTA=0x80;}else PORTA=seg_number[M10];}else if(seg_count==4){PORTC=0b00000111;if(mode==1){if(watch_count>250)PORTA=seg_number[M1];else PORTA=0x80;}else PORTA=seg_number[M1];}}//초시계 동작 세팅/*----------------------------------------------------------*/N1000=number_count/1000; number_count_temp=number_count%1000;N100=number_count_temp/100; number_count_temp=number_count_temp%100;N10=number_count_temp/10; number_count_temp=number_count_temp%10;N1=number_count_temp;//0.01초 간격일 때.0.1초로 하려면 stopwatch_count를 50으로.if(stopwatch_count==5){ number_count++; stopwatch_count=0; }//if(mode==5){if (seg_count==1){ PORTC=0b00001110; PORTA=seg_number[N1000]; }else if(seg_count==2){ PORTC=0b00001101; PORTA=seg_number[N100]|0x80; }else if(seg_count==3){ PORTC=0b00001011; PORTA=seg_number[N10]; }else if(seg_count==4){ PORTC=0b00000111; PORTA=seg_number[N1]; }}//if (stopwatch_count_control==GO )stopwatch_count++;else if(stopwatch_count_control==STOP )stopwatch_count=stopwatch_count;else if(stopwatch_count_control==RESET)stopwatch_count=0,number_count=0;//알람동작 세팅/*-----------------------------------------------------------------------------------*/if(mode>5){if(seg_count==1){PORTC=0b00001110;if(mode==9){if(watch_count>250)PORTA=seg_number[alarm_H10];else PORTA=0x80;}else PORTA=seg_number[alarm_H10];}else if(seg_count==2){PORTC=0b00001101;if(mode==8){if(watch_count>250)PORTA=seg_number[alarm_H1]|0x80;else PORTA=0x80;}else PORTA=seg_number[alarm_H1]|0x80;}else if(seg_count==3){PORTC=0b00001011;if(mode==7){if(watch_count>250)PORTA=seg_number[alarm_M10];else PORTA=0x80;}else PORTA=seg_number[alarm_M10];}else if(seg_count==4){PORTC=0b00000111;if(mode==6){if(watch_count>250)PORTA=seg_number[alarm_M1];else PORTA=0x80;}else PORTA=seg_number[alarm_M1];}}}//void main(){DDRA=0xff; DDRC=0xff; DDRG=0x03;timer_init();time_and_alarm_init();SREG=0x80;while(1){if((PING&0x04)==0x04){ switch_1(); }if((PING&0x08)==0x08){ switch_2(); }//if((alarm_hour==hour)&&(alarm_minute==minute)){ //알람시간과 현재 시간이 맞을 때 행동if(watch_count<250)PORTG=0x01;else PORTG=0x02;}else{ PORTG=0x00; }}}소스코드는 정성을 들여서 들여쓰기를 하세요
가독성이 좋아져서 수정이나 디버깅이 쉬워집니다.
//
while(1){if((PING&0x04)==0x04){ switch_1(); }if((PING&0x08)==0x08){ switch_2(); }스위치를 누르면 HIGH가 되는 회로구성인지 체크하세요//number_count는 무한정 증가하도록 되어 있군요int 로 선언 했으니 음수값도 나오겠습니다.if(stopwatch_count_control==GO){if(++stopwatch_count==5){ stopwatch_count=0; //0.01초 간격일 때.0.1초로 하려면 stopwatch_count를 50으로.if(++number_count>9999)number_count=0;}}else if(stopwatch_count_control==STOP ){ stopwatch_count=stopwatch_count; }else if(stopwatch_count_control==RESET){ stopwatch_count=0,number_count=0; }이런식으로 작성해서 일정값이상 증가하지 않도록 하세요//
![]()
회로는 PC가 세그먼트고 PE가 콤몬인데
소스에서는 PA가 세그먼트고 PC가 콤몬입니다.
소스코드에 맞게 회로를 다시 연결하세요
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-12-26 오후 11:29:48// by Ok-Hyun Park//#include <mega128.h>#include <delay.h>//#define RESET 0#define GO 1#define STOP 2//int seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};int seg_cnt=1;//int stopwatch_cnt=0,stopwatch_cnt_ctrl=0;int n_cnt=0,n_cnt_tp=0;int N1000,N100,N10,N1;//char mode=0;//int watch_cnt=0;int second=0,minute=59,hour=23,M1=0,M10=0,H1=0,H10=0;//int alarm_minute=0,alarm_hour=0,alarm_M1=0,alarm_M10=0,alarm_H1=0,alarm_H10=0;//void switch_1(){ // PG2 (시간-알람 바꾸기,스탑워치 시작-정지)//현재 시간 바꾸기if(mode<5){if (mode==1){ M1 =(M1+1)%10; }else if(mode==2){ M10=(M10+1)%6; }else if(mode==3){if (H10< 2)H1=(H1+1)%10;else if(H10==2)H1=(H1+1)%4;}else if(mode==4){if(H1>3){ H10=(H10+1)%2; }else { H10=(H10+1)%3; }}//minute=M10*10+M1; hour=H10*10+H1; // 세팅한 값을 현재 시간에 업데이트}// 스탑워치 동작시 스위치의 동작을 결정/*--------------------------------------------------------------------------------------*/if(mode==5){if ((stopwatch_cnt_ctrl==STOP)||(stopwatch_cnt_ctrl==RESET)){ stopwatch_cnt_ctrl=GO; }else if(stopwatch_cnt_ctrl==GO ){ stopwatch_cnt_ctrl=STOP; }}// 알람시간 바꾸기/*--------------------------------------------------------------------------------------*/if(mode>5){if (mode==6){ alarm_M1 =(alarm_M1+1)%10; }else if(mode==7){ alarm_M10=(alarm_M10+1)%6; }else if(mode==8){if (alarm_H10< 2)alarm_H1=(alarm_H1+1)%10;else if(alarm_H10==2)alarm_H1=(alarm_H1+1)% 4;}else if(mode==9){ alarm_H10=(alarm_H10+1)%3; }//alarm_minute=alarm_M10*10+alarm_M1; alarm_hour=alarm_H10*10+alarm_H1; // 알람 시간 업데이트}delay_ms(200);}//void switch_2(){ // PG3 (모드 바꾸기,스탑워치 리셋)if(mode==5){if (stopwatch_cnt_ctrl==STOP ){ stopwatch_cnt_ctrl=RESET; } // 스탑워치가 STOP인 상태에서는 모드가 바뀌지 않는다.else if((stopwatch_cnt_ctrl==GO )||(stopwatch_cnt_ctrl==RESET)){ mode=6; } // 스탑워치가 GO나 RESET 상태에서는 모드가 바뀐다.}else{ if(++mode==10)mode=0; } // 스탑워치 이외의 모드에서는 모드 바꾸기 동작//delay_ms(200);}//interrupt[TIM0_OVF]void timer_int0(){TCNT0=6;//if(++watch_cnt==500){ watch_cnt=0; //1초 //시계 동작 세팅if(++second==60){ second=0;if(++minute==60){ minute=0; if(++hour==24)hour=0; }}H10=hour/10; H1=hour%10; M10=minute/10; M1=minute%10;}//초시계 동작 세팅/*----------------------------------------------------------*/if(stopwatch_cnt_ctrl==GO){if(++stopwatch_cnt==5){ stopwatch_cnt=0; //0.01초 간격일 때.0.1초로 하려면 stopwatch_cnt를 50으로.if(++n_cnt>9999)n_cnt=0;N1000=n_cnt/1000; n_cnt_tp=n_cnt %1000;N100=n_cnt_tp/100; n_cnt_tp=n_cnt_tp%100;N10=n_cnt_tp/10; n_cnt_tp=n_cnt_tp%10;N1=n_cnt_tp;}}else if(stopwatch_cnt_ctrl==STOP ){ stopwatch_cnt=stopwatch_cnt; }else if(stopwatch_cnt_ctrl==RESET){ stopwatch_cnt=0,n_cnt=0; }//if(++seg_cnt==5)seg_cnt=1; // 7-세그먼트//if(mode<5){if(seg_cnt==1){ PORTC=~1;if(mode==4){ if(watch_cnt<250)PORTA=0x80; } //0.5초마다 깜빡임.else { PORTA=seg[H10]; }}else if(seg_cnt==2){ PORTC=~2;if(mode==3){ if(watch_cnt<250)PORTA=0x80; }else { PORTA=seg[H1]|0x80; }}else if(seg_cnt==3){ PORTC=~4;if(mode==2){ if(watch_cnt<250)PORTA=0x80; }else { PORTA=seg[M10]; }}else if(seg_cnt==4){ PORTC=~8;if(mode==1){ if(watch_cnt<250)PORTA=0x80; }else { PORTA=seg[M1]; }}}else if(mode==5){if (seg_cnt==1){ PORTC=~1; PORTA=seg[N1000]; }else if(seg_cnt==2){ PORTC=~2; PORTA=seg[N100]|0x80; }else if(seg_cnt==3){ PORTC=~4; PORTA=seg[N10]; }else if(seg_cnt==4){ PORTC=~8; PORTA=seg[N1]; }}else{ // if(mode>5) 알람동작 세팅if(seg_cnt==1){ PORTC=~1;if(mode==9){ if(watch_cnt<250)PORTA=0x80; }else { PORTA=seg[alarm_H10]; }}else if(seg_cnt==2){ PORTC=~2;if(mode==8){ if(watch_cnt<250)PORTA=0x80; }else { PORTA=seg[alarm_H1]|0x80; }}else if(seg_cnt==3){ PORTC=~4;if(mode==7){ if(watch_cnt<250)PORTA=0x80; }else { PORTA=seg[alarm_M10]; }}else if(seg_cnt==4){ PORTC=~8;if(mode==6){ if(watch_cnt<250)PORTA=0x80; }else { PORTA=seg[alarm_M1]; }}}}//void main(){DDRA=0xFF; DDRC=0x0F; DDRG=0x03;TCCR0=0x05; TCNT0=6; TIMSK=0x01; // 2msH10=hour/10; H1=hour%10; M10=minute/10; M1=minute%10;SREG=0x80;while(1){if(PING&4){ switch_1(); }if(PING&8){ switch_2(); }//if((alarm_hour==hour)&&(alarm_minute==minute)){ //알람시간과 현재 시간이 맞을 때 행동if(watch_cnt<250)PORTG=0x01;else PORTG=0x02;}else{ PORTG=0x00; }}}
복잡한 소스는 남이 봐주기 어렵습니다.
스스로 문제점을 찾아서 디버깅해야합니다.
댓글 1
조회수 3,273Busan님의 댓글
Busan 작성일감사합니다...! 해보도록 하겠습니다.