#include <AT89X51.h> // I/O가 정의 되어 있는 헤더 파일
#define I_O P1_5
#define SCLK P1_4 // SCK 핀 정의
#define RST P1_6 // RST 핀 정의
// LCD로 디스플레이할 문자
code unsigned char msg1[]=" 2000,00,00,SUN ";
code unsigned char msg2[]=" 00 : 00 : 00 ";
code unsigned char ASCTBL[] = "0123456789ABCDEF";
code char sun[]="SUN.";
code char mon[]="MON.";
code char tue[]="TUE.";
code char wed[]="WED.";
code char thu[]="THU.";
code char fri[]="FRI.";
code char sat[]="SAT.";
// P0.0-P0.7 : 데이터, P2.4=RS, P2.5=RW, P2.6=E
#include "LCD8.h" // LCD 초기설정 루틴이 정의
// 8비트 데이터 메모리로 사용할 경우(MDA-A_D8051 TRAINER)
//#include "LCDM.h" // LCD 초기설정 루틴이 정의
//년,월,일,요일,시간,분,초를 저장하는 버퍼
unsigned char YEAR,MONTH,DATE,DAY,HR,MIN,SEC;
// 어드레스를 받아서 리드한 데이터를 리턴
unsigned char READ(unsigned char address )
{
unsigned char buff1,i;
// 리셋 해제
RST = 1;
DELAY( 2000 );
// 코맨드 데이터 라이트
for( i = 0; i < 8; i++ ){
SCLK = 0; // 클록 0
if(address & 0x01) I_O = 1; //"1"을 전송
else I_O = 0; //"0"을 전송
DELAY( 2000 );
SCLK = 1; // 클록 1
address >>= 1; // 다음 데이터
}
// I_O 핀 입력으로 변경
buff1 = 0;
// 데이터 리드
for( i = 0; i < 8; i ++){
SCLK = 0; // 클록 0
buff1 >>= 1 ;
if(I_O) buff1 |= 0x80; //"1"을 입력
else buff1 &= 0x7F; //"0"을 입력
DELAY( 2000 );
SCLK = 1; // 클록 1
}
// 초기 설정
SCLK = 0;
RST = 0; // 리셋
return ( buff1 ); // 리드한 값 리턴
}
// 어드레스로 데이터를 라이트
void WRITE(unsigned char address, unsigned char out)
{
unsigned char i;
// 리셋 해제
RST = 1;
DELAY( 2000 );
// 코맨드 데이터 라이트
for( i = 0; i < 8; i ++ ){
SCLK = 0; // 클록 0
if(address & 0x01) I_O = 1; //"1"을 전송
else I_O = 0; //"0"을 전송
SCLK = 1; // 클록 1
DELAY( 2000 );
address >>= 1; // 다음 데이터
}
// 데이터 라이트
for( i = 0 ; i < 8; i ++ ){
SCLK = 0; // 클록 0
if(out & 0x01) I_O = 1; //"1"을 전송
else I_O = 0; //"0"을 전송
SCLK = 1; // 클록 1
DELAY( 2000 );
out >>= 1; // 다음 데이터
}
// 초기 설정
SCLK = 0;
RST = 0; // 리셋
}
// 달력 리드
void READ_CAL(void)
{
DATE = READ(0x87); // 요일리드
DATE &= 0x3f;
MONTH = READ(0x89); // 달 리드
MONTH &= 0x1f;
DAY = READ(0x8b); // 일 리드
DAY &= 0x07;
YEAR = READ(0x8d); // 년 리드
}
// 시간 리드
void READ_CLOCK(void)
{
SEC = READ(0x81); // 초 리드
SEC &= 0x7f;
MIN = READ(0x83); // 분 리드
MIN &= 0x7f;
HR = READ(0x85); // 시 리드
HR &= 0x3f;
}
// 달력,시간 라이트
void WRITE_CLOCK(void)
{
WRITE(0x80,SEC); // 초 라이트
WRITE(0x82,MIN); // 분 라이트
WRITE(0x84,HR); // 시 라이트
WRITE(0x86,DATE); // 요일라이트
WRITE(0x88,MONTH); // 달 라이트
WRITE(0x8a,DAY); // 일 라이트
WRITE(0x8c,YEAR); // 년 라이트
}
// 달력 디스플레이
void DISP_CAL(void)
{
unsigned char i;
// 년 디스플레이
COMMAND(0x83); // 커서 조정
CHAR_O(((YEAR >> 4) & 0x0f) + 0x30); // 년 상위
CHAR_O((YEAR & 0x0f) + 0x30); // 년 하위
// 월 디스플레이
COMMAND(0x86); // 커서 조정
CHAR_O(((MONTH >> 4) & 0x0f) + 0x30); // 월 상위
CHAR_O((MONTH & 0x0f) + 0x30); // 월 하위
// 일 디스플레이
COMMAND(0x89); // 커서 조정
CHAR_O(((DATE >> 4) & 0x0f) + 0x30); // 일 상위
CHAR_O((DATE & 0x0f) + 0x30); // 일 하위
// 요일 디스플레이
COMMAND(0x8c); // 커서 조정
// "SUN" 디스플레이
if (DAY == 1){
for (i=0; i < 4; i++) CHAR_O(sun[i]);
}
// "MON" 디스플레이
else if (DAY == 2){
for (i=0; i < 4; i++) CHAR_O(mon[i]);
}
// "TUE" 디스플레이
else if (DAY == 3){
for (i=0; i < 4; i++) CHAR_O(tue[i]);
}
// "WED" 디스플레이
else if (DAY == 4){
for (i=0; i < 4; i++) CHAR_O(wed[i]);
}
// "THU" 디스플레이
else if (DAY == 5){
for (i=0; i < 4; i++) CHAR_O(thu[i]);
}
// "FRI" 디스플레이
else if (DAY == 6){
for (i=0; i < 4; i++) CHAR_O(fri[i]);
}
// "SAT" 디스플레이
else if (DAY == 7){
for (i=0; i < 4; i++) CHAR_O(sat[i]);
}
}
// 시간 디스플레이
void DISP_CLOCK(void)
{
// 시 디스플레이
COMMAND(0xc2); // 커서 조정
CHAR_O(((HR >> 4) & 0x0f) + 0x30); // 시 상위
CHAR_O((HR & 0x0f) + 0x30); // 시 하위
// 분 디스플레이
COMMAND(0xc7); // 커서 조정
CHAR_O(((MIN >> 4) & 0x0f) + 0x30); // 분 상위
CHAR_O((MIN & 0x0f) + 0x30); // 분 하위
// 초 디스플레이
COMMAND(0xcc); // 커서 조정
CHAR_O(((SEC >> 4) & 0x0f) + 0x30); // 초 상위
CHAR_O((SEC & 0x0f) + 0x30); // 초 하위
}
// 메인
void main(void)
{
RST = 0; // DS1302 리셋
SCLK = 0; // DS1302 클록
I_O = 1; // DS1302 데이터 "1"
L_INIT(); // LCD 초기 설정
// msg1, msg2 디스플레이
DISPLAY();
// DS1302 초기 설정
WRITE(0x8E,0); // 라이트 프로텍트 해제
WRITE(0x80,0); // 클록 발진 인에이블
// 버퍼 클리어
YEAR = 0x03;
MONTH = 0x05;
DAY = 0x01;
DATE = 0x04;
HR = 0x00;
MIN = 0x00;
SEC= 0x00;
WRITE_CLOCK(); // 달력 및 시간 라이트
// 달력 디스플레이
READ_CAL();
DISP_CAL();
//시간을 리드해서 디스플레이
do{
READ_CLOCK();
DISP_CLOCK();
}while(1);
}
디지털시계 프로그램 소스 입니다.
질문은 다름이 아니오라 위 소스 설명좀 해주시면 좋겠습니다
기왕이면 좀 부분부분 자세하게 프로그램 설명좀 ^^ 도와주세요~
더 자세한 내용은 기초공부를 좀 하셔야 될듯 합니다..;;
그렇긴 한데 - 중간중간 짤라서 이건 어떤기능을 하는지 설명좀 해주실수 없을까요.
더이상 자세한 설명이 -_-; 주석이 너무나 자세히 달려있는데요//
차라리 순서도를 그려서 블럭단위로 이해해보심이 좋을꺼 같네요
각 함수별로 정리를 하는게 좋을꺼 같아요 기능적인 부분들은 너무 자세히 설명되어서 부연설명하기도 힘드네요.
주석이 달려있으니 차근차근 하나씩 해석해 가보세요
이해 가실겁니다
ㅎㅎ
이걸 어디다 작성해야 하나요????