#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key = P3^2;
sbit key1 = P3^3;
sbit key2 = P3^4;
void Outside_Init();
void init();
void L1602_disp(uint SEC,uint MIN,uint HOUR);
void start();
void enable(uchar sign);
void write(uchar sign);
void delay();
void delay1(uint z);
void L1602_char(uchar hang,uchar lie,char sign);
void L1602_string(uchar hang,uchar lie,uchar *p);
void press() ;
sbit E = P2^7;
sbit RW = P2^6;
sbit RS = P2^5;
uint num1 = 0;
uint num2 = 0;
uint num3 = 0;
uint count = 0;
uint n = 0;
uchar stay = 0;
uchar change = 0;
uchar UpdatatimeMode = 0;
uchar UpdataSECMode = 0;
uchar UpdataMINMode = 0;
uchar UpdataHOURMode = 0;
void main()
{
init();
Outside_Init();
IE = 0x83;
start();
while(1)
{ press();
L1602_disp(num1,num2,num3);
}
return ;
}
void Outside_Init()
{
IT0 = 1;
}
void Outside_time() interrupt 0
{
EX0 = 0;
delay1(10); //延时30ms,去掉这行会出现按一下中断几次的情况
if (key == 0) //对按键进行抗干扰处理
{
UpdatatimeMode++;
if(UpdatatimeMode >= 4)
{
UpdatatimeMode = 0;
UpdataSECMode = 0;
UpdataMINMode = 0;
UpdataHOURMode = 0;
}
/*n ++;
if (n == 1)
{
stay = !stay;
}
if (n == 2)
{
stay = !stay;
}
if (n >= 3)
{
n = 0;
}*/
}
delay1(10);
EX0 = 1;
}
void init()
{
TMOD = 0x01;
TH0 = 0x4c;
TL0 = 0x00;
TR0 = 1;
return ;
}
void time0() interrupt 1
{
TH0 = 0x4c;
TL0 = 0x00;
if(!UpdatatimeMode)
{
change = 0;
count++;
if (count >= 20)
{
count = 0;
num1 ++;
if (num1 >= 60)
{
num1 = 0;
num2++;
if (num2 >= 60)
{
num3++;
num2 = 0;
if (num3 >= 24)
{
num3 = 0;
}
}
}
}
}
else
{
if (UpdatatimeMode == 1)
{
UpdataSECMode =~UpdataSECMode;
UpdataMINMode = 0;
UpdataHOURMode = 0;
}
if (UpdatatimeMode == 2)
{
UpdataMINMode =~UpdataMINMode;
UpdataSECMode = 0;
UpdataHOURMode = 0;
}
if (UpdatatimeMode == 3)
{
UpdataHOURMode =~UpdataHOURMode;
UpdataSECMode = 0;
UpdataMINMode = 0;
}
}
return ;
}
void press()
{
if (UpdatatimeMode == 1)
{
if (key1 == 0)
{
delay1(10);
if (key1 == 0)
{
num1++;
if (num1 >= 60)
{
num1 = 0;
}
while(!key1);
}
}
if (key2 == 0)
{
delay1(10);
if (key2 == 0)
{
if (num1 == 0)
{
num1 = 60;
}
num1--;
while(!key2);
}
}
}
if (UpdatatimeMode == 2)
{
if (key1 == 0)
{
delay1(10);
if (key1 == 0)
{
num2++;
if (num2 >= 60)
{
num2 = 0;
}
while(!key1);
}
}
if (key2 == 0)
{
delay1(10);
if (key2 == 0)
{
if (num2 == 0)
{
num2 = 60;
}
num2--;
while(!key2);
}
}
}
if (UpdatatimeMode == 3)
{
if (key1 == 0)
{
delay1(10);
if (key1 == 0)
{
num3++;
if (num3 >= 24)
{
num3 = 0;
}
while(!key1);
}
}
if (key2 == 0)
{
delay1(10);
if (key2 == 0)
{
if (num3 == 0)
{
num3 = 24;
}
num3--;
while(!key2);
}
}
}
return ;
}
void L1602_disp(uint SEC,uint MIN,uint HOUR)
{
L1602_string(1,1," 2011-08-09 ");
L1602_char(2,1,' ');
L1602_char(2,2,' ');
L1602_char(2,3,' ');
if(!UpdataHOURMode)
{
enable(0x80+0x43);
write(0x30 + HOUR/10);
write(0x30 + HOUR%10);
}
else
{
L1602_char(2,4,' ');
L1602_char(2,5,' ');
P0 = 0;
}
L1602_char(2,6,':');
if(!UpdataMINMode)
{
enable(0x80+0x46);
write(0x30 + MIN/10);
write(0x30 + MIN%10);
}
else
{
L1602_char(2,7,' ');
L1602_char(2,8,' ');
P0 = 0;
}
L1602_char(2,9,':') ;
if(!UpdataSECMode)
{
enable(0x80+0x49);
write(0x30 + SEC/10);
write(0x30 + SEC%10);
}
else
{
L1602_char(2,10,' ');
L1602_char(2,11,' ');
P0 = 0;
}
return ;
}
void start()
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
//enable();
return ;
}
void enable(uchar sign)
{
P0 = sign;
RS = 0;
RW = 0;
E = 0;
delay();
E = 1;
delay();
return ;
}
void write(uchar sign)
{
P0 = sign;
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
return ;
}
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0') break;
write(*p);
p++;
}
}
void delay()
{
uint i,j;
for (i=0; i<=1; i++)
{
for (j=0; j<=5; j++)
{
;
}
}
return ;
}
void delay1(uint z)
{
uint i;
uint j;
for (i=0; i<z; i++)
{
for(j=0; j<1827; j++)
{
;
}
}
return ;
}