万年历c程序.docx
《万年历c程序.docx》由会员分享,可在线阅读,更多相关《万年历c程序.docx(19页珍藏版)》请在冰豆网上搜索。
![万年历c程序.docx](https://file1.bdocx.com/fileroot1/2023-7/16/99d92330-e209-4bea-a8cb-22041f521e91/99d92330-e209-4bea-a8cb-22041f521e911.gif)
万年历c程序
#include"reg52.h"
#include"absacc.h"
#defineLEDP0
#defineDIGP2
#definekey_ioP1
voiddisplay();
voidkey_scan(void);
voidkey_scan_proc(void);
voiddisplay_one();
unsignedchark=0;
unsignedcharkey_flag;
unsignedcharkey_return;
unsignedchart=0;
unsignedchardisp_flag;
unsignedchardisp_num;
unsignedcharbell_flag;
unsignedcharset[6];
unsignedcharset_time[6];
unsignedchardisp[7];
sbitCLK=P3^4;/*实时时钟时钟线引脚*/
sbitIO=P3^5;/*实时时钟数据线引脚*/
sbitRST=P3^6;/*实时时钟复位线引脚*/
sbitdq=P1^4;/*ds18b20*/
sbitACC0=ACC^0;
sbitACC7=ACC^7;
//sbitkey1=P1^0;
//sbitkey2=P1^1;
//sbitkey3=P1^2;
//sbitkey4=P1^3;
sbitlight=P3^0;
sbitbell=P3^7;
/**********************************************************
延时子函数
**********************************************************/
voiddelay(unsignedchardly)
{
while(dly--);
}
/***********************************************************
向DS1302写入1Byte数据
***********************************************************/
voidInputByte(unsignedcharucDa)
{
unsignedchari;
ACC=ucDa;
for(i=8;i>0;i--)
{
IO=ACC0;
CLK=1;
CLK=0;
ACC>>=1;
}
}
/***********************************************************
从DS1302读取1Byte数据
***********************************************************/
unsignedcharOutputByte(void)
{
unsignedchari;
for(i=8;i>0;i--)
{
ACC>>=1;
ACC7=IO;
CLK=1;
CLK=0;
}
return(ACC);
}
/***********************************************************
向DS1302指定地址写数据
***********************************************************/
voidW_1302(unsignedcharAddr,unsignedcharDa)
{
RST=0;
CLK=0;
RST=1;
InputByte(Addr);//写地址
InputByte(Da);//写1Byte数据
CLK=1;
RST=0;
}
/***********************************************************
读取DS1302某地址的数据
***********************************************************/
unsignedcharR_1302(unsignedcharAddr)
{
unsignedcharDa;
CLK=0;
RST=0;
RST=1;
InputByte(Addr);//地址,命令
Da=OutputByte();//读1Byte数据
RST=0;
CLK=1;
return(Da);
}
/*************************************************************
初始化ds18b20
*************************************************************/
voidrst_18b20(void)
{
dq=1;
delay(8);
dq=0;
delay(80);
dq=1;
delay(35);
}
/*************************************************************
读ds18b20一个byte数据
*************************************************************/
unsignedcharread_18b20(void)
{
unsignedchari,dat=0;
for(i=0;i<=7;i++)
{
dq=0;
dat>>=1;
dq=1;
if(dq==1)
dat|=0x80;
delay(4);
}
return(dat);
}
/*************************************************************
向ds18b20写入一个byte数据
**************************************************************/
voidwrite_18b20(unsignedchardat)
{
unsignedchari;
for(i=0;i<8;i++)
{
dq=0;
dq=dat&0x01;
delay(5);
dq=1;
dat>>=1;
}
}
/**************************************************************
读取温度值ds18b20
**************************************************************/
unsignedintread_T(void)
{
unsignedintt=0;//16bit
unsignedchart0=0,t1=0;
floattemp=0;//32bit
rst_18b20();
write_18b20(0xcc);
write_18b20(0x44);
rst_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
t0=read_18b20();
t1=read_18b20();
t=t1;
t<<=8;
t=t+t0;
t>>=4;
/*t=(t0>>1);
temp=t*0.0625;
t=temp*10+0.5;*/
return(t);
}
voidmain(void)
{
W_1302(0x8e,0x00);//开保护
W_1302(0x8c,0x09);//year
W_1302(0x8a,0x05);//week
W_1302(0x88,0x05);//mouth
W_1302(0x86,0x29);//date
W_1302(0x84,0x15);//hour
W_1302(0x82,0x59);//minute
W_1302(0x80,0x00);//second
W_1302(0x8e,0x80);//写保护
TMOD=0x01;
TH0=0xFa;
TL0=0xFF;
EA=1;
ET0=1;
TR0=1;
bell=1;
disp_flag=0;
disp_num=0;
key_flag=0;
bell_flag=0;
while
(1)
{
while(disp_flag==0)
{
display();
if(light==0)
{
DIG=0X00;
disp_flag=2;
}
}
while(disp_flag==1)
display_one();
if(light==1)
disp_flag=0;
}
}
/*********************************************************
扫描显示函数
*********************************************************/
voiddisplay(void)
{
switch(k)
{
case0:
LED=(disp[0]&0XF0)+(disp[4]>>4);
DIG=0X80;
break;
case1:
LED=(disp[0]<<4)+(disp[4]&0X0F);
DIG=0X40;
break;
case2:
LED=(disp[1]&0X10)+(disp[5]>>4);
DIG=0X20;
break;
case3:
LED=(disp[1]<<4)+(disp[5]&0X0F);
DIG=0X10;
break;
case4:
LED=(disp[2]&0X30)+(disp[6]>>4);
DIG=0X08;
break;
case5:
LED=(disp[2]<<4)+(disp[6]&0X0F);
DIG=0X04;delay(15);
break;
case6:
LED=0xf0+t/10;
DIG=0X02;
break;
case7:
LED=(disp[3]<<4)+t%10;
DIG=0X01;//while
(1);
break;
case8:
DIG=0X00;
if(key_flag==0)
{
t=read_T();
disp[0]=R_1302(0x8d);//year
disp[1]=R_1302(0x89);//month
disp[2]=R_1302(0x87);//data
disp[3]=R_1302(0x8b);//week
disp[4]=R_1302(0x85);//hour
disp[5]=R_1302(0x83);//minte
disp[6]=R_1302(0x81);//second
if((disp[4]==set_time[0])&&(disp[5]==set_time[1]))
{
bell=0;
}
elsebell=1;
}
key_scan();
break;
}
}
voiddisplay_one()
{key_scan();
switch(disp_num)
{
case1:
{
DIG=0x00;
LED=(disp[0]&0XF0)+0x0f;
DIG=0X80;delay(100);DIG=0x00;
LED=(disp[0]<<4)+0x0F;
DIG=0X40;delay(100);
break;
}
case2:
{DIG=0x00;
LED=(disp[1]&0X10)+0x0f;
DIG=0X20;delay(100);DIG=0x00;
LED=(disp[1]<<4)+0x0F;
DIG=0X10;delay(100);
break;
}
case3:
{DIG=0x00;
LED=(disp[2]&0Xf0)+0x0f;
DIG=0X08;delay(100);DIG=0x00;
LED=(disp[2]<<4)+0x0F;
DIG=0X04;delay(100);
break;
}
case4:
{DIG=0x00;
LED=0xff;
DIG=0X00;delay(100);DIG=0x00;
LED=(disp[3]<<4)+0x0F;
DIG=0X01;delay(100);
break;
}
case5:
{DIG=0x00;
LED=(disp[4]>>4)+0xF0;
DIG=0X80;delay(100);DIG=0x00;
LED=(disp[4]&0x0F)+0xF0;
DIG=0X40;delay(100);
break;
}
case6:
{DIG=0x00;
LED=(disp[5]>>4)+0xF0;
DIG=0X20;delay(100);DIG=0x00;
LED=(disp[5]&0x0F)+0xF0;
DIG=0X10;delay(100);
break;
}
}
}
/***********************************************************
按键识别程序
***********************************************************/
voidkey_scan(void)
{
unsignedcharkey_data=0;
key_io=0xff;
key_data=key_io&0x0f;
if(key_data==0xff)
key_flag=0;
else
{
delay(30);
key_io=0xff;
if(((key_io&0x0f)!
=0x0f)&&((key_io&0x0f)==key_data))
{
while(key_io!
=0xff);
switch(key_data)
{
case0x0e:
{key_return=0;key_flag=1;break;}
case0x0d:
{key_return=1;key_flag=1;break;}
case0x0b:
{key_return=2;key_flag=1;break;}
case0x07:
{key_return=3;key_flag=1;break;}
default:
break;
}
}
if(key_flag==1)
{
disp_flag=1;
key_flag=0;
key_scan_proc();
}
}
}
/***************************************************************
按键函数
***************************************************************/
voidkey_scan_proc(void)
{intset;
switch(key_return)
{
case0:
{
disp_num+=1;
if(disp_num==7)
{
W_1302(0x8e,0x00);//开保护
W_1302(0x8c,disp[0]);//year
W_1302(0x8a,disp[3]);//week
W_1302(0x88,disp[1]);//mouth
W_1302(0x86,disp[2]);//date
W_1302(0x84,disp[4]);//hour
W_1302(0x82,disp[5]);//minute
W_1302(0x80,0x00);//second
W_1302(0x8e,0x80);//写保护
disp_flag=0;
disp_num=0;
}
break;
}
case1:
{
set=(disp[disp_num-1]>>4)*10+(disp[disp_num-1]&0x0f)-1;
if(disp_num==1&&set==-1)
set=99;
elseif(disp_num==2&&set==0)
set=12;
elseif(disp_num==3&&set==0)
{
if(disp[1]==2)
set=29;
elseif(disp[1]==1||disp[1]==3||disp[1]==5||disp[1]==7||disp[1]==8||disp[1]==0x10||disp[1]==12)
set=31;
elseif(disp[1]==4||disp[1]==6||disp[1]==9||disp[1]==0x11)
set=30;
}
elseif(disp_num==4&&set==0)
set=7;
elseif(disp_num==5&&set==-1)
set=23;
elseif(disp_num==6&&set==-1)
set=59;
disp[disp_num-1]=((set/10)<<4)+(set%10);
break;
}
case2:
{
set=((disp[disp_num-1]>>4)*10+(disp[disp_num-1]&0x0f))+1;
if(disp_num==1&&set==100)
set=0;
elseif(disp_num==2&&set==13)
set=1;
elseif(disp_num==3)
{
if(set==30&&disp[1]==2)
set=1;
elseif(set==32&&(disp[1]==1||disp[1]==3||disp[1]==5||disp[1]==7||disp[1]==8||disp[1]==0x10||disp[1]==12))
set=1;
elseif(set==31&&(disp[1]==4||disp[1]==6||disp[1]==9||disp[1]==0x11))
set=1;
}
elseif(disp_num==4&&set==8)
set=1;
elseif(disp_num==5&&set==24)
set=0;
elseif(disp_num==6&&set==60)
set=0;
disp[disp_num-1]=((set/10)<<4)+(set%10);
break;
}
case3:
{
disp_flag=1;
bell_flag=1;
switch(disp_num)
{
case0:
{disp_num=5;break;}
case5:
{disp_num=6;break;}
case6:
{
set_time[0]=disp[4];
set_time[1]=disp[5];
disp_flag=0;
bell_flag=0;
disp_num=0;
break;
}
}
break;
}
default:
break;
}
}
/*************************************************************
定时器中断函数
*************************************************************/
voidtimer0()interrupt1
{
TH0=0xFC;
TL0=0xFF;
k++;
if(k==20)
{
k=0;
}
}