1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 킬유21 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
#include <89c51ac2.h> #define CBYTE ((unsigned char volatile code *)0)// 코드메모리 처리 #define DBYTE ((unsigned char volatile data *)0)// 데이터 메모리 처리 #define PBYTE ((unsigned char volatile pdata *)0)//페이지 메모리 처리 #define XBYTE ((unsigned char volatile xdata *)0)//외부 메모리 처리 #define LCD_IW *((unsigned char xdata *)0x0800) //LCD의 어드레스 맵 #define LCD_IR *((unsigned char xdata *)0x0801) #define LCD_DW *((unsigned char xdata *)0x0802) #define LCD_DR *((unsigned char xdata *)0x0803) idata char *num1[]={"0","1","2","3","4","5","6","7","8","9"}; //날짜, 시간을 표시하기위한 내부 데이터 메모리에 변수 지정 idata char *num2[]={"01","02","03","04","05","06","07","08","09","10","11","12"};//시간, 달을 표시하기 위해 지정 idata char *week[]={"MON","TUE","WEN","THU","FRI","SAT","SUN"}; // 요일 지정 idata char *mode[]={"MODE YEAR", "MODE MOON","MODE DAY ","MODE WEEK","MODE P/AM","MODE TIME","MODE AL1 ","MODE AL2 ","MODE STOP"};//모드의 종류 지정 idata char *pm_am[]={"AM","PM"};// PM, AM 지정하기 위해 unsigned char sec1=5,sec2=5; // 초기화초 unsigned char min1=5,min2=9; // 초기화 분 unsigned char clock_index=10; // 초기화 시 unsigned char al1_hour_index=0; // 알람 시간 unsigned char al1_min1=0; // 알람 분 앞자리 unsigned char al1_min2=1; // 알람 뒷자리 unsigned char al2_hour_index=0; // 알람 시간 unsigned char al2_min1=0; // 알람 분 앞자리 unsigned char al2_min2=1; // 알람 뒷자리 unsigned char al1_pm_am_index=0;//알람PM, AM인덱스 unsigned char al2_pm_am_index=0;//알람PM, AM 인덱스 unsigned char week_index=0; //요일 인덱스 unsigned char pm_am_index=1;//PM, AM 인덱스 unsigned char mode_index=0;//모드 인덱스 unsigned char ss1=0, ss2=0, s1=0, s2=0, m1=0, m2=0;//스탑워치 분,초,1/100초 지정 변수 unsigned char count;//오버플로 카운트하는 변수 unsigned char year1_index=0, year2_index=3;//두자리 년도표시 변수 지정 unsigned char month_index=11;//달을 표시하기 위한 인덱스 unsigned char day1=3,day2=1;//날짜 표시위한 인덱스 unsigned char day1_limit=0,day2_limit=0;//날짜 체크 인덱스 unsigned char k;//스탑워치의 시작, 정지 제어 변수 void Delay(void) //딜레이 함수 { unsigned int i; for(i=0; i<4000; i++); } void Busy_chk(void) //비지체크 함수 { Delay(); while(LCD_IR & 0x80); } void Disp_pos(char line, char col) //디스플레이 위치지정 함수 { if(line == 1) { LCD_IW = 0x80 + col; } else { LCD_IW = 0xC0 + col; } Busy_chk(); } void Init_Lcd(void) // LCD 초기화 함수 { LCD_IW = 0x38;Delay(); LCD_IW = 0x38;Busy_chk(); LCD_IW = 0x38;Busy_chk(); LCD_IW = 0x0C;Busy_chk(); LCD_IW = 0x06;Busy_chk(); LCD_IW = 0x02;Busy_chk(); LCD_IW = 0x01;Busy_chk(); } void Put_char(char data1) //캐릭터를 출력하기 위한 함수 { LCD_DW = data1; Busy_chk(); } void Put_string(char *data1)//문자열을 출력하기 위한 함수 { while(*data1 != '\0') { Put_char(*data1); ++data1; } } void timer_init(void) //타이머2 초기화 함수 { CKCON=1; // X2모드 사용 EA=1; //전체 인터럽트 허용 RCAP2H=0x63; //오버플로 주기 1/100초 RCAP2L=0xC0; ET2=1; //타이머2 인터럽트 허용 TR2=1; //타이머2 시작 } void disp_stop(void) // 스탑워치 디스플레이 함수, 59분59초 99까지 카운트 가능 { Disp_pos(2,15); // 1/100초 Put_string(num1[ss2]); Disp_pos(2,14); // 1/10초 Put_string(num1[ss1]); Disp_pos(2,12); // 1초 Put_string(num1[s2]); Disp_pos(2,11); // 10초 Put_string(num1[s1]); Disp_pos(2,9); // 1분 Put_string(num1[m2]); Disp_pos(2,8); // 10분 Put_string(num1[m1]); } void disp() //스탑워치를 제외한 나머지 부분들을 표시하기 위한 함수 { //time position Disp_pos(1,1); //달표시 Put_string(num2[month_index]); Disp_pos(1,3); // /표시 Put_char('/'); Disp_pos(1,4); //앞자리 날짜 표시 Put_string(num1[day1]); Disp_pos(1,5); //뒷자리 날짜 표시 Put_string(num1[day2]); Disp_pos(1,6); // /표시 Put_char('/'); Disp_pos(1,7); //년도 앞자리 표시 Put_string(num1[year1_index]); Disp_pos(1,8); //년도 뒷자리 표시 Put_string(num1[year2_index]); Disp_pos(2,15); //초 뒷자리 표시 Put_string(num1[sec2]); Disp_pos(2,14); //초 앞자리 표시 Put_string(num1[sec1]); Disp_pos(2,13); // : 표시 Put_char(':'); Disp_pos(2,12); //분 뒷자리 표시 Put_string(num1[min2]); Disp_pos(2,11); //분 앞자리 표시 Put_string(num1[min1]); Disp_pos(2,10); // : 표시 Put_char(':'); Disp_pos(2,8); //시간표시 Put_string(num2[clock_index]); Disp_pos(2,4); // PM,AM 표시 Put_string(pm_am[pm_am_index]); Disp_pos(2,0); //week 표시 Put_string(week[week_index]); } void Timer2_int(void) interrupt 5 //타이머2 오버플로 인터럽트 { count++; //주기 1/100초로 카운트가 하나씩 증가됨 TF2=0; //TF2 플래그를 0으로 if(k==1) { //조건이 맞으면 스탑워치 시작됨 if(ss2>=9) //메인의 모드설정에 스탑워치모드에서 스위치를 누르면 k값이 변화 { // 1/100초 주기이므로 오버플로 마다 아래의 조건 단계들을 실행 ss2=0; //스탑워치의 디스플레이는 메인안 모드설정 부분에 들어있음 if(ss1>=9){ ss1=0; if(s2>=9){ s2=0; if(s1>=5){ s1=0; if(m2>=10){ m2=0; if(m1>=5){ m1=0; }else m1++; }else m2++; }else s1++; }else s2++; }else ss1++; }else ss2++; } if(count>=99) //위에서 count가 100이 되면 1초가 증가됨 { //초가 60이 될때 1분 증가시키고 00으로 초기화 됨 if(sec2>=9) // 이런 식으로 시간, PM,AM 인덱스가 변경됨 { sec2=0; if(sec1>=5){ sec1=0; if(min2>=9){ min2=0; if(min1>=5){ min1=0; if(clock_index>=10){ pm_am_index++; if(pm_am_index>=1) pm_am_index = 0; } if(clock_index>=11){ clock_index=0; } else{ clock_index++; } }else min1++; }else min2++; }else sec1++; }else sec2++; count=0; //한번의 수행을 끝내고 카운트값을 다시 0으로 초기화 } } void main(void) { Init_Lcd(); //LCD 초기화 함수 불러옴 timer_init(); //타이머 초기화 함수 불러옴 CGRAM_Set(); // 한글입력 함수 불러옴 P1=0xFF; // 스위치를 입력으로 사용하기 위해 while(1) { disp(); //인터럽트에서 돌아와 시간을 표시 if(min1==5 && min2==9 &&sec1==5 &&sec2==8) //매시간 59분 58초부터 00분 00초까지 { //LCD 라이트와 부저가 켜졌다 커짐 if(count<=40)P4=0; else P4=3; } if(min1==5 && min2==9 &&sec1==5 &&sec2==9) { if(count<=40)P4=0; else P4=3; } if(min1==0 && min2==0 &&sec1==0 &&sec2==0) { if(count<=80)P4=0; else P4=3; } if(P1_1==0) P4=2; // LCD의 불을 켜고 싶을때 스위치 2를 누름 if(pm_am_index == al1_pm_am_index && clock_index == al1_hour_index && min1 == al1_min1 && min2 == al1_min2) P4 = 0; //알람1의 조건이 맞으면 1분동안 부저와 LCD가 켜짐 if(pm_am_index == al2_pm_am_index && clock_index == al2_hour_index && min1 == al2_min1 && min2 == al2_min2) P4 = 0; //알람2의 조건이 맞으면 1분동안 부저와 LCD가 켜짐 if(P1_2==0) { P4=3; //알람1이 울릴때 1분 안에 끄고 싶으면 스위치 3을 누름 조건이 바꿔서 알람이 꺼짐 al1_min2=al1_min2-1; } if(P1_3==0) { P4=3; //알람2이 울릴때 1분 안에 끄고 싶으면 스위치 3을 누름 조건이 바꿔서 알람이 꺼짐 al2_min2=al2_min2-1; } if(clock_index==11 && min1==0 && min2==0 && sec1==0 && sec2==0 && count<8) { if(pm_am_index==0) // PM, AM변경되기 위한 조건 pm_am_index=1; //조건에 카운트가 들어간 이유 else //조건이 1분동안 유지하게 되면 프로그램이 몇바퀴 돌아서 원하는 값을 얻을수 없기 때문 pm_am_index=0; } if(month_index==11 && day1==3 && day2 ==1 && clock_index==11 && min1==0 && min2==0 && sec1==0 && sec2==0 && pm_am_index==0 && count<25) {year2_index++; //년도 변경을 위한 조건 if(year2_index>10) {year2_index=0;year1_index++;} } if(clock_index==11 && min1==0 && min2==0 && sec1==0 && sec2==0 && pm_am_index==0 && count<30) { week_index++; if(week_index>7) week_index=0; //요일, 날짜, 달이 변경 되기 위한 조건 if(month_index==1) { day1_limit=2; day2_limit=8; //2월에는 28일 이후에 3월로 변경됨 day2++; if(day2>10) day2=0, day1++; if(day1_limit==day1 && day2_limit<day2) { month_index++; day1=0, day2=1;} if(month_index>=12) month_index=0; } else if(month_index==0||month_index==2||month_index==4||month_index==6||month_index==7||month_index==9||month_index==11) { day1_limit=3; day2_limit=1; //달이 31일로 끝나는 달은 조건이 맞으면 다음달로 증가 day2++; if(day2>10) day2=0, day1++; if(day1_limit==day1 && day2_limit<day2) { month_index++; day1=0, day2=1;} if(month_index>=12) month_index=0; } else{ day1_limit=3; day2_limit=0; //달이 30일로 끝나는 달은 조건이 맞으면 다음달로 증가 day2++; if(day2>10) day2=0, day1++; if(day1_limit==day1 && day2_limit<day2) { month_index++; day1=0, day2=1;} if(month_index>=12) month_index=0; } } if(P1_0==0) // 모드설정을 위한 스위치 1번 { while((P1_0|P1_1)!=0){ // 스위치 1,2를 동시에 누르지 않으면 루프를 벗어나지 못함 Disp_pos(1,7); // 각각의 모드를 표시 Put_string(mode[mode_index]); if(P1_1==0) { Delay(); mode_index++; if(mode_index>=10) mode_index=0; switch(mode_index){ case 1:while(P1_0!=0) { //set year if(P1_2==0) { year2_index++; if(year2_index>10) {year2_index=0; year1_index++;} if(year1_index>10) year1_index=0; } Disp_pos(2,2); Put_string(" "); Disp_pos(2,0); Put_string(num1[year1_index]); Disp_pos(2,1); Put_string(num1[year2_index]); } break; case 2:while(P1_0!=0) { //set month if(P1_2==0) month_index++; if(month_index>=12) month_index=0; Disp_pos(1,1); Put_string(num2[month_index]); } break; case 3: while(P1_0!=0) { //set day if(P1_2==0) day2++; if(day2>=10) day2=0; if(P1_3==0) day1++; if(day1>3) day1=0; Disp_pos(1,4); Put_string(num1[day1]); Disp_pos(1,5); Put_string(num1[day2]); } break; case 4: while(P1_0!=0) { //set week if(P1_2==0) week_index++; if(week_index>=7) week_index=0; Disp_pos(2,0); //week Put_string(week[week_index]); } break; case 5: while(P1_0!=0){ //set pm/am if(P1_2==0) pm_am_index=1; if(P1_3==0) pm_am_index=0; Disp_pos(2,4); //pm,am Put_string(pm_am[pm_am_index]); } break; case 6: while(P1_0!=0){ //set time if(P1_2==0) clock_index++; if(clock_index>=12) clock_index=0; if(P1_3==0) min2++; if(min2>=10) {min2=0; min1++;} if(min1>=6) min1=0; Disp_pos(2,12); //분 Put_string(num1[min2]); Disp_pos(2,11); Put_string(num1[min1]); Disp_pos(2,8); //시 Put_string(num2[clock_index]); } break; case 7: while(P1_0!=0){ //set alarm1 if(P1_2==0) al1_hour_index++; if(al1_hour_index>=12) al1_hour_index=0; if(P1_3==0) al1_min2++; if(al1_min2>=10) {al1_min2=0; al1_min1++;} if(al1_min1>=6) al1_min1=0; if(P1_1==0 && P1_2==0) al1_pm_am_index=1; if(P1_2==0 && P1_3==0) al1_pm_am_index=0; //alarm1 position Disp_pos(2,12); //분 Put_string(num1[al1_min2]); Disp_pos(2,11); Put_string(num1[al1_min1]); Disp_pos(2,8); //시 Put_string(num2[al1_hour_index]); Disp_pos(2,4); //pm,am Put_string(pm_am[al1_pm_am_index]); } break; case 8: while(P1_0!=0){ //set alarm2 if(P1_2==0) al2_hour_index++; if(al2_hour_index>=12) al2_hour_index=0; if(P1_3==0) al2_min2++; if(al2_min2>=10) {al2_min2=0; al2_min1++;} if(al2_min1>=6) al2_min1=0; if(P1_1==0 && P1_2==0) al2_pm_am_index=1; if(P1_2==0 && P1_3==0) al2_pm_am_index=0; //alarm2 position Disp_pos(2,12); //분 Put_string(num1[al2_min2]); Disp_pos(2,11); Put_string(num1[al2_min1]); Disp_pos(2,8); //시 Put_string(num2[al2_hour_index]); Disp_pos(2,4); //pm,am Put_string(pm_am[al2_pm_am_index]); } break; case 9: while(P1_0!=0){ //stop watch if(P1_3==0) {k=1; ss2=ss1=s1=s2=m2=m1=0; } if(P1_2==0) k=1; disp_stop(); if(P1_1==0) {k=0; } } break; } Disp_pos(1,7); Put_string(" "); } } } }}
프로그램 열심히 하셨군요?^^