#include<reg52.h>
#define DataPort P0
#define KeyPort P3
#define key P1
#define u8 unsigned char
#define u16 unsigned int
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;
#define KEY1 1
#define KEY2 2
#define KEY3 3
#define KEY4 4
unsigned char hour,minute,second;
unsigned char hour_L, hour_H, minute_L, minute_H, second_L, second_H;
bit UpdateTimeFlag;
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char TempData[8];
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 DisplayData[8];
char datnum1=0,datnum2=0,datnum3=0,datnum4=0,datnum5=0,datnum6=0,datnum7=0,datnum8=0;
u8 setflag=0;
u8 wei_change=0;
void DigDisplay();
void Init_Timer0(void);
void Key16_16(void);
void delay(u16 i)
{
while(i--);
}
void DigDisplay()
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)
{
case(7):
LSA=0;LSB=0;LSC=0; break;
case(6):
LSA=1;LSB=0;LSC=0; break;
case(5):
LSA=0;LSB=1;LSC=0; break;
case(4):
LSA=1;LSB=1;LSC=0; break;
case(3):
LSA=0;LSB=0;LSC=1; break;
case(2):
LSA=1;LSB=0;LSC=1; break;
case(1):
LSA=0;LSB=1;LSC=1; break;
case(0):
LSA=1;LSB=1;LSC=1; break;
}
P0=TempData[i];
delay(100);
P0=0x00;
}
}
u8 KeyScan(u8 mode)
{
static u8 keyen=1;
if(mode==1)
{
keyen=1;
}
if(keyen==1&&(k1==0||k2==0||k3==0||k4==0))
{
delay(1000);
keyen=0;
if(k1==0)return KEY1;
else if(k2==0)return KEY2;
else if(k3==0)return KEY3;
else if(k4==0)return KEY4;
}
else if(k1==1&&k2==1&&k3==1&&k4==1)
{
keyen=1;
}
return 0;
}
int key16()
{
int key_value=0;
key=0xf7;
if(key!=0xf7)
{
delay(10);
switch(key)
{
case 0x77: key_value=1;break;
case 0xb7: key_value=5;break;
case 0xd7: key_value=9;break;
case 0xe7: key_value=13;break;
}
}
while(key!=0xf7);
key=0xfb;
if(key!=0xfb)
{
delay(10);
switch(key)
{
case 0x7b: key_value=2;break;
case 0xbb: key_value=6;break;
case 0xdb: key_value=10;break;
case 0xeb: key_value=14;break;
}
}
while(key!=0xfb);
key=0xfd;
if(key!=0xfd)
{
delay(10);
switch(key)
{
case 0x7d: key_value=3;break;
case 0xbd: key_value=7;break;
case 0xdd: key_value=11;break;
case 0xed: key_value=15;break;
}
}
while(key!=0xfd);
key=0xfe;
if(key!=0xfe)
{
delay(10);
switch(key)
{
case 0x7e: key_value=4;break;
case 0xbe: key_value=8;break;
case 0xde: key_value=12;break;
case 0xee: key_value=16;break;
}
}
while(key!=0xfe);
return key_value;
}
void Key16_16(void)
{
unsigned char num;
num=key16();
switch(num)
{
case 1: TempData[wei_change]=0x3f; break;
case 2: TempData[wei_change]=0x06; break;
case 3: TempData[wei_change]=0x5b; break;
case 4: TempData[wei_change]=0x4f; break;
case 5: TempData[wei_change]=0x66; break;
case 6: TempData[wei_change]=0x6d; break;
case 7: TempData[wei_change]=0x7d; break;
case 8: TempData[wei_change]=0x07; break;
case 9: TempData[wei_change]=0x7f; break;
case 10: TempData[wei_change]=0x6f; break;
default:break;
}
}
void datapros()
{
u8 key,num;
key=KeyScan(0);
num=key16();
if(key==KEY4)
{
setflag++;
TR0=0;
if(setflag==2)
{
TR0=1;
setflag=0;
}
}
if(setflag==0)
{
TempData[0]=dofly_DuanMa[hour_H];
TempData[1]=dofly_DuanMa[hour_L];
TempData[2]=0x40;
TempData[3]=dofly_DuanMa[minute_H];
TempData[4]=dofly_DuanMa[minute_L];
TempData[5]=0x40;
TempData[6]=dofly_DuanMa[second_H];
TempData[7]=dofly_DuanMa[second_L];
}
else
{
if(key==KEY1)
{
wei_change++;
if(wei_change>7)wei_change=0;
}
else if(key==KEY2)
{
switch(wei_change)
{
case 0: hour_H=key16_16();
break;
case 1: hour_L=key16_16();
break;
case 2: TempData[2]=key16_16();
break;
case 3: minute_H=key16_16();
break;
case 4: minute_L=key16_16();
break;
case 5: TempData[5]=key16_16();
break;
case 6: second_H=key16_16();
break;
case 7: second_L=key16_16();
break;
}
}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01;
EA=1;
ET0=1;
TR0=1;
PT0=0;
}
void Timer0_isr(void) interrupt 1
{
static unsigned int num,i;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
hour_H=hour/10;
hour_L=hour%10;
minute_H=minute/10;
minute_L=minute%10;
second_H=second/10;
second_L=second%10;
i++;
if(i==10)
{
i=0;
UpdateTimeFlag=1;
}
num++;
if(num==500)
{
num=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
hour=0;
}
}
}
TempData[0]=dofly_DuanMa[hour_H];
TempData[1]=dofly_DuanMa[hour_L];
TempData[2]=0x40;
TempData[3]=dofly_DuanMa[minute_H];
TempData[4]=dofly_DuanMa[minute_L];
TempData[5]=0x40;
TempData[6]=dofly_DuanMa[second_H];
TempData[7]=dofly_DuanMa[second_L];
}
void Timer1Init()
{
TMOD|=0X01;
TH0=0Xd8;
TL0=0Xf0;
ET0=1;
EA=1;
}
void Timer1() interrupt 3
{
static u8 i;
TH1=0Xd8;
TL1=0Xf0;
i++;
if(i==50)
{
switch(wei_change)
{
case 0: TempData[0]=0x00;break;
case 1: TempData[1]=0x00;break;
case 2: TempData[2]=0x00;break;
case 3: TempData[3]=0x00;break;
case 4: TempData[4]=0x00;break;
case 5: TempData[5]=0x00;break;
case 6: TempData[6]=0x00;break;
case 7: TempData[7]=0x00;break;
}
}
if(i==100)
{
i=0;
switch(wei_change)
{
case 0: TempData[0]=dofly_DuanMa[hour_H];break;
case 1: TempData[1]=dofly_DuanMa[hour_L];break;
case 2: TempData[2]=0x40;break;
case 3: TempData[3]=dofly_DuanMa[minute_H];break;
case 4: TempData[4]=dofly_DuanMa[minute_L];break;
case 5: TempData[5]=0x40;break;
case 6: TempData[6]=dofly_DuanMa[second_H];break;
case 7: TempData[7]=dofly_DuanMa[second_L];break;
}
}
}
void main (void)
{
Init_Timer0();
Timer1Init();
while (1)
{
DigDisplay();
key16_16();
datapros();
}
}
最后更新完hour/minute/second后返回還是不能保存狀態 希望能再幫看一下 |