#include<reg51.h>
#include"lcd.h"
#include"ds1302.h"
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
void Int0Configuration();
void LcdDisplay();
void Keyscan();
bit SetState;
unsigned char SetPlace ;
void Delay10ms() ;
void main()
{
Int0Configuration();
LcdInit();
Ds1302Init();
while(1)
{
if(SetState==0)
{
Ds1302ReadTime();
LcdDisplay();
if(SetState==1)
{
Keyscan();
}
}
}
}
void LcdDisplay()
{
if(SetState==0)
{
LcdWriteCom(0x80+0X40);
LcdWriteData('0'+TIME[2]/16); //時
LcdWriteData('0'+(TIME[2]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[1]/16); //分
LcdWriteData('0'+(TIME[1]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[0]/16); //秒
LcdWriteData('0'+(TIME[0]&0x0f));
LcdWriteCom(0x80);
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16); //年
LcdWriteData('0'+(TIME[6]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16); //月
LcdWriteData('0'+(TIME[4]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16); //日
LcdWriteData('0'+(TIME[3]&0x0f));
LcdWriteCom(0x80+12);
switch(TIME[5]&0x0f) //周
{
case (1):
LcdWriteData('M');LcdWriteData('0');LcdWriteData('N');break;
case (2):
LcdWriteData('T');LcdWriteData('U');LcdWriteData('E');break;
case (3):
LcdWriteData('W');LcdWriteData('E');LcdWriteData('D');break;
case (4):
LcdWriteData('T');LcdWriteData('H');LcdWriteData('U');break;
case (5):
LcdWriteData('F');LcdWriteData('R');LcdWriteData('I');break;
case (6):
LcdWriteData('S');LcdWriteData('A');LcdWriteData('T');break;
case (7):
LcdWriteData('S');LcdWriteData('U');LcdWriteData('N');break;
}
}
if(SetState==1)
{
switch(SetPlace)
{
case(0):LcdWriteCom(0x80+0x40+7);LcdWriteCom(0x0e);break; //光標指向--秒//
case(1):LcdWriteCom(0x80+0x40+4);break; //光標指向--分//
case(2):LcdWriteCom(0x80+0x40+1);break; //光標指向--時//
case(3):LcdWriteCom(0x80+9);break; //光標指向--日//
case(4):LcdWriteCom(0x80+6);break; //光標指向--月//
case(5):LcdWriteCom(0x80+12);break; //光標指向--周//
case(6):LcdWriteCom(0x80+3);break; //光標指向--年//
}
}
}
void Keyscan()
{
unsigned char i;
if(K4==0) //檢測按鍵K4是否按下
{
Delay10ms(); //消除抖動
if(K4==0)
{
SetPlace++;
if(SetState==1)
{
if(SetPlace>=7) SetPlace=0;
}
}
LcdDisplay();
while((i<50)&&(K4==0)) //檢測按鍵是否松開
{
Delay10ms();
i++;
}
i=0;
}
if(K1==0) //檢測按鍵K2是否按下
{
Delay10ms(); //消除抖動
if(K1==0)
{
if(SetState==1)
{
TIME[SetPlace]++;
if((TIME[SetPlace]&0x0f)>9) //換成BCD碼。
{
TIME[SetPlace]=TIME[SetPlace]+6;
}
if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小時只能到23
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
{
TIME[SetPlace]=0x01;
}
if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
{
TIME[SetPlace]=0x01;
}
if((TIME[SetPlace]>=0x8)&&(SetPlace==5)) //周只能到7
{
TIME[SetPlace]=0x01;
}
if((TIME[SetPlace]>=0x9a)&&(SetPlace==6)) //年只能到99
{
TIME[SetPlace]=0;
}
}
LcdDisplay();
while((i<50)&&(K1==0)) //檢測按鍵是否松開
{
Delay10ms();
i++;
}
i=0;
}
}
}
void Int0() interrupt 0
{
Delay10ms();
if(K3==0)
{
Delay10ms() ;
if(K3==0)
{
SetPlace=0;
if(SetState==0)
{
LcdDisplay();
}
if(SetState==1)
{
SetPlace++;
}
}
}while(!K3);
}
void Int0Configuration()
{
//設置INT0
IT0=1;//跳變沿出發方式(下降沿)
EX0=1;//打開INT0的中斷允許。
EA=1;//打開總中斷
}
void Delay10ms() //誤差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
} |