회원가입 ID/PW 찾기

1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.

콘텐츠 수 1,041
판매자 킬유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(" ");
}
}

}
}}


profile
om 2015.02.20 00:30
감사합니다^___^
프로그램 열심히 하셨군요?^^
profile
우바구조 2015.12.20 03:39

감사합니다

profile
시나브로69 2016.07.16 15:51

좋은 자료 감사합니다.

search
List of Articles
번호 분류 제목 평점 포인트 판매자 등록일 구매수 조회 수
공지 공공의 목적으로 공유하고자 하는 소프트웨어는 '소프트웨어 자료실'에 업로드를 요청드립니다.
공지 구매후 평점 댓글을 남겨주시면 구매포인트의 20%를 돌려드립니다.
1041 마이크로프로세서 AVR RTOS template [2] 무료 아크마 2017-08-26 0 177
1040 마이크로프로세서 AVR ISP 결선도(프린터 포트/LPT) [1] 무료 아크마 2017-08-26 0 245
1039 마이크로프로세서 STM32 시리즈 MCU graphical configuration tool [5] 무료 코찌코찌 2013-12-11 0 408
1038 마이크로프로세서 Avr Studio에 형변환 연산자가 있나요? [2] 무료 트리비 2016-11-12 0 121
1037 마이크로프로세서 PIC CC-C메뉴얼 [2] 무료 크히히힝 2016-08-12 0 175
1036 마이크로프로세서 PIC MCU를 처음 접해보는데.. [1] 무료 크히히힝 2016-08-04 0 187
1035 마이크로프로세서 mplab ide 8.92 설치! [2] 무료 회사간공대생 2016-08-04 0 558
1034 마이크로프로세서 8051 [5] 무료 크크크크크1 2016-06-08 0 125
1033 펌웨어 & 코딩언어 AVR 128에 시리얼통신칩 설정 참고 [1] 무료 어부 2015-11-17 0 410
1032 마이크로프로세서 stm32f103 demo board example [2] 무료 seele 2015-09-04 0 557
1031 마이크로프로세서 stm32f103자료입니다. [3] 무료 seele 2015-09-04 0 765
1030 마이크로프로세서 따끈한 MPLAB X IDE 한글 메뉴얼입니다. [25] 무료 om 2015-08-10 0 2950
1029 마이크로프로세서 네오스 즐겨찾기 to 텍스트 VB6 [3] 무료 네오스f91e9 2015-07-31 0 186
1028 마이크로프로세서 네오스 AVR soft usart code 생성기 VB6 [1] 무료 네오스f91e9 2015-07-30 0 213
1027 마이크로프로세서 네오스 GPS 시뮬레이터 VB6 [3] 무료 네오스f91e9 2015-07-30 0 240
1026 마이크로프로세서 네오스 AVR ISP 케이블 짝짓기 VB6 [1] 무료 네오스f91e9 2015-07-30 0 255
1025 마이크로프로세서 네오스 LRC 계산기 VB6 [3] 무료 네오스f91e9 2015-07-30 0 561
1024 마이크로프로세서 네오스 사인 테이블 생성기 VB6 [2] 무료 네오스f91e9 2015-07-30 0 243
1023 마이크로프로세서 네오스 스위치 코드 메이커 VB6 무료 네오스f91e9 2015-07-30 0 223
1022 마이크로프로세서 네오스 주석변경 툴 A, B VB6 무료 네오스f91e9 2015-07-30 0 217
  • 사람이란 자기가 생각하는 만큼 결코 행복하지도 불행하지도 않다.
    - 라 로시코프
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.