后面代碼字體格式不一樣,重發一下
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
sbit LSA=P2^2;//38譯碼器的接入
sbit LSB=P2^3;//38譯碼器的接入
sbit LSC=P2^4;//38譯碼器的接入
sbit DS1302_CE = P3^5;//DS1302接入
sbit DS1302_CK = P3^6;//DS1302接入
sbit DS1302_IO = P3^4;//DS1302接入
sbit key1= P3^1; //四個獨立按鍵
sbit key2= P3^0; //四個獨立按鍵
sbit key3= P3^2; //四個獨立按鍵
sbit key4= P3^3; //四個獨立按鍵
sbit beep=P1^5; //蜂鳴器接入
uchar xdata smgduan[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f}; //共陰數碼管0-9
bit key1flag; //四個按鍵標志位
bit key2flag; //四個按鍵標志位
bit key3flag; //四個按鍵標志位
bit key4flag; //四個按鍵標志位
bit time5min; //四個按鍵標志位
uchar Display[7]; //數碼管顯示的時鐘數據緩存
uchar xdata FirstTime[7]= {
0x00,0x26,0x08,0x05,0x05,0x05,0x17
};//時鐘初始時間設置
uchar Timesaving[7]; //從DS1302讀得的時鐘數據緩存
uchar naozhong[3]={0x11,0x11,0x11}; //鬧鐘初始時間設定
uchar shiftflag=0; //獨立按鍵功能標志位
bit flag200ms=0; //數碼管刷新標志位
uchar T0RH = 0; //定時器高位重載值
uchar T0RL = 0; //定時器低位重載值
void ConfigTimer0(uint ms);
void keyscan();
void DS1302SingleWrite(uchar add, uchar dat);
void Set_RTC();
void Read_RTC();
void Numpros();
void keyfun();
void DigDisplay();
void NaoLing();
void main()
{
ConfigTimer0(1);
Set_RTC();
Read_RTC();
while (1)
{
keyfun();
if (flag200ms)
{
flag200ms = 0;
Numpros();
DigDisplay();
}
NaoLing();
}
}
void delay(uchar i)
{
while(i--);
}
void Numpros()
{
Read_RTC();
if(shiftflag==0)
{
Display[7] =smgduan[Timesaving[2]/16];
Display[6] =smgduan[Timesaving[2]&0x0f];
Display[5] = 0x40;
Display[4] =smgduan[Timesaving[1]/16];
Display[3] =smgduan[Timesaving[1]&0x0f];
Display[2] = 0x40;
Display[1] =smgduan[Timesaving[0]/16];
Display[0] =smgduan[Timesaving[0]&0x0f];
}
if(shiftflag==1)
{
Display[7] =smgduan[Timesaving[6]/16];
Display[6] =smgduan[Timesaving[6]&0x0f];
Display[5] = 0x40;
Display[4] =smgduan[Timesaving[4]/16];
Display[3] =smgduan[Timesaving[4]&0x0f];
Display[2] = 0x40;
Display[1] =smgduan[Timesaving[3]/16];
Display[0] =smgduan[Timesaving[3]&0x0f];
}
if(shiftflag==2)
{
Display[7] =smgduan[naozhong[2]/16];
Display[6] =smgduan[naozhong[2]&0x0f];
Display[5] = 0x40;
Display[4] =smgduan[naozhong[1]/16];
Display[3] =smgduan[naozhong[1]&0x0f];
Display[2] = 0x40;
Display[1] =smgduan[naozhong[0]/16];
Display[0] =smgduan[naozhong[0]&0x0f];
}
}
void DigDisplay()
{
uchar i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 1:LSA=1;LSB=0;LSC=0;break;
case 2:LSA=0;LSB=1;LSC=0;break;
case 3:LSA=1;LSB=1;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
P0=Display[i];
delay(100);
P0=0x00;
}
}
void keyscan()
{
if(key1==0)
{
delay(200);
if(key1==0)
{
key1flag=1;
while(!key1);
}
}
if(key2==0)
{
delay(200);
if(key2==0)
{
key2flag=1;
while(!key2);
}
}
if(key3==0)
{
delay(200);
if(key3==0)
{
key3flag=1;
while(!key3);
}
}
if(key4==0)
{
delay(200);
if(key4==0)
{
shiftflag++;
if(shiftflag>3)
{
shiftflag=0;
}
while(!key4);
}
}
}
void keyfun()
{
if(shiftflag==0)
{
if(key1flag==1)
{
if ((Timesaving[2]&0x0F) < 0x09)
Timesaving[2] += 0x01;
else
{
Timesaving[2] &= 0xF0;
Timesaving[2] += 0x10;
}
if (((Timesaving[2]&0xF0) >= 0x20)&&((Timesaving[2]&0x0F) > 0x03))
{
Timesaving[2] = 0x00;
}
DS1302SingleWrite(0x8E, 0x00);
DS1302SingleWrite(0x84,Timesaving[2]);
DS1302SingleWrite(0x8E, 0x80);
key1flag=0;
}
else if(key2flag==1)
{
if ((Timesaving[1]&0x0F) < 0x09)
Timesaving[1] += 0x01;
else
{
Timesaving[1] &= 0xF0;
Timesaving[1] += 0x10;
}
if (((Timesaving[1]&0xF0) >0x50)&&((Timesaving[1]&0x0F) >= 0x00))
{
Timesaving[1] = 0x00;
}
DS1302SingleWrite(0x8E, 0x00);
DS1302SingleWrite(0x82,Timesaving[1]);
DS1302SingleWrite(0x8E, 0x80);
key2flag=0;
}
else if(key3flag==1)
{
if ((Timesaving[0]&0x0F) < 0x09)
Timesaving[0] += 0x01;
else
{
Timesaving[0] &= 0xF0;
Timesaving[0] += 0x10;
}
if (((Timesaving[0]&0xF0) > 0x50)&&((Timesaving[0]&0x0F) >= 0x00))
{
Timesaving[0] = 0x00;
}
DS1302SingleWrite(0x8E, 0x00);
DS1302SingleWrite(0x82,Timesaving[0]);
DS1302SingleWrite(0x8E, 0x80);
key3flag=0;
}
}
if(shiftflag==1)
{
if(key1flag==1)
{
if ((Timesaving[6]&0x0F) < 0x09)
Timesaving[6] += 0x01;
else
{
Timesaving[6] &= 0xF0;
Timesaving[6] += 0x10;
}
if (((Timesaving[6]&0xF0) > 0x90)&&((Timesaving[6]&0x0F) >= 0x00))
{
Timesaving[6] = 0x00;
}
DS1302SingleWrite(0x8E, 0x00);
DS1302SingleWrite(0x8c,Timesaving[6]);
DS1302SingleWrite(0x8E, 0x80);
key1flag=0;
}
else if(key2flag==1)
{
if ((Timesaving[4]&0x0F) < 0x09)
Timesaving[4] += 0x01;
else
{
Timesaving[4] &= 0xF0;
Timesaving[4] += 0x10;
}
if (((Timesaving[4]&0xF0) >=0x10)&&((Timesaving[4]&0x0F) > 0x02))
{
Timesaving[4] = 0x01;
}
DS1302SingleWrite(0x8E, 0x00);
DS1302SingleWrite(0x88,Timesaving[4]);
DS1302SingleWrite(0x8E, 0x80);
key2flag=0;
}
else if(key3flag==1)
{
if ((Timesaving[3]&0x0F) < 0x09)
Timesaving[3] += 0x01;
else
{
Timesaving[3] &= 0xF0;
Timesaving[3] += 0x10;
}
if (((Timesaving[3]&0xF0) >= 0x30)&&((Timesaving[3]&0x0F) >0x01))
{
Timesaving[3] = 0x01;
}
DS1302SingleWrite(0x8E, 0x00);
DS1302SingleWrite(0x86,Timesaving[3]);
DS1302SingleWrite(0x8E, 0x80);
key3flag=0;
}
}
if(shiftflag==2)
{
if(key1flag==1)
{
if ((naozhong[2]&0x0F) < 0x09)
naozhong[2] += 0x01;
else
{
naozhong[2] &= 0xF0;
naozhong[2] += 0x10;
}
if (((naozhong[2]&0xF0) >= 0x20)&&((naozhong[2]&0x0F) > 0x03))
{
naozhong[2] = 0x00;
}
key1flag=0;
}
else if(key2flag==1)
{
if ((naozhong[1]&0x0F) < 0x09)
naozhong[1] += 0x01;
else
{
naozhong[1] &= 0xF0;
naozhong[1] += 0x10;
}
if (((naozhong[1]&0xF0) > 0x50)&&((naozhong[1]&0x0F) >=0x00))
{
naozhong[1] = 0x00;
}
key2flag=0;
}
if(time5min==1)
{
time5min=0;
shiftflag=0;
}
}
}
void NaoLing()
{
Read_RTC();
if((naozhong[2]==Timesaving[2])&&(naozhong[1]==Timesaving[1]))
{
while(1)
{
beep=~beep;
delay(20);
if(shiftflag==3)
break;
}
}
}
void DS1302ByteWrite(unsigned char dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS1302_CK = 0;
DS1302_IO=dat&0x01;
DS1302_CK=1;
dat>>=1;
}
}
unsigned char DS1302ByteRead()
{
uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{
DS1302_CK=0;
dat>>=1;
if(DS1302_IO)
{
dat|=0x80;
}
DS1302_CK=1;
}
return dat;
}
void DS1302SingleWrite(unsigned char add, unsigned char dat)
{
DS1302_CE = 0;
DS1302_CK = 0;
DS1302_IO=0;
DS1302_CE = 1;
DS1302ByteWrite(add);
DS1302ByteWrite(dat);
DS1302_CE = 0;
}
unsigned char DS1302SingleRead(unsigned char add)
{
uchar dat=0x00;
DS1302_CE = 0;
DS1302_CK = 0;
DS1302_IO=0;
DS1302_CE = 1;
DS1302ByteWrite(add);
dat = DS1302ByteRead();
DS1302_CK = 1;
DS1302_CE = 0;
return dat;
}
void Read_RTC()
{
Timesaving[0]=DS1302SingleRead(0x81);
Timesaving[1]=DS1302SingleRead(0x83);
Timesaving[2]=DS1302SingleRead(0x85);
Timesaving[3]=DS1302SingleRead(0x87);
Timesaving[4]=DS1302SingleRead(0x89);
Timesaving[5]=DS1302SingleRead(0x8b);
Timesaving[6]=DS1302SingleRead(0x8d);
}
void Set_RTC()
{
DS1302SingleWrite(0x8E, 0x00);
DS1302SingleWrite(0x80,FirstTime[0]);
DS1302SingleWrite(0x82,FirstTime[1]);
DS1302SingleWrite(0x84,FirstTime[2]);
DS1302SingleWrite(0x86,FirstTime[3]);
DS1302SingleWrite(0x88,FirstTime[4]);
DS1302SingleWrite(0x8a,FirstTime[5]);
DS1302SingleWrite(0x8c,FirstTime[6]);
DS1302SingleWrite(0x8E, 0x80);
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 12000000 / 12;
tmp = (tmp * ms) / 1000;
tmp = 65536 - tmp;
tmp = tmp + 25;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void InterruptTimer0() interrupt 1
{
static unsigned char count1 = 0;
static unsigned long count2 = 0;
TH0 = T0RH;
TL0 = T0RL;
keyscan();
count1++;
count2++;
if (count1 >= 20)
{
count1 = 0;
flag200ms = 1;
}
if(count2>=300000)
{
count2 = 0;
time5min=1;
}
} |