⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 数码万年历
💻 C
字号:
#include<reg52.h>
#include<absacc.h>
#include<math.h>

#define YEAR_IN_RTC 6
#define MONTH_IN_RTC 5
#define DAY_IN_RTC 4
#define WEEK_IN_RTC 3
#define HOUR_IN_RTC 2
#define MINUTE_IN_RTC 1
#define SECOND_IN_RTC 0
#define SECOND_ALARM_IN_RTC 7
#define MINUTE_ALARM_IN_RTC 8
#define HOUR_ALARM_IN_RTC 9
#define RTC_SECONDS 1//XBYTE[0x7f00]
#define RTC_SECONDS_ALARM 2//XBYTE[0x7f01]
#define RTC_MINUTES 3//XBYTE[0x7f02]
#define RTC_MINUTES_ALARM 4//XBYTE[0x7f03]
#define RTC_HOURS 5//XBYTE[0x7f04]
#define RTC_HOURS_ALARM 6//XBYTE[0x7f05]
#define RTC_WEEKS 7//XBYTE[0x7f06]
#define RTC_DAYS 8//XBYTE[0x7f07]
#define RTC_MONTHS 9//XBYTE[0x7f08]
#define RTC_YEARS 10//XBYTE[0x7f09]
#define DSA 11//XBYTE[0x7f0a] //DS12887 register A
#define DSB 12//XBYTE[0x7f0b]
#define DSC 13//XBYTE[0x7f0c]
#define DSD 14//XBYTE[0x7f0d]

sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;
sbit LED9=P2^0;
sbit LED10=P2^1;
sbit LED11=P2^2;
sbit LED12=P2^3;
sbit LED13=P2^4;
sbit LED14=P2^5;
sbit LED15=P2^6;
sbit LED16=P3^4;
sbit LED17=P3^5;

sbit DS12887CS= P2^7;
sbit KEY_ADJ=P3^2;
sbit KEY_SET=P3^3;
sbit BEEF=P3^0;

#define MAXPAGE 17
unsigned char data page;//0-14
unsigned int data SecondTimer,msTimer,msTime_Loop;
unsigned char data RTCtime[7];//Second;Minute;Hour;Week;Day;Month;Year;
unsigned char data Disp_RTCtime[40];
unsigned char data Hour1;
int data Hour2;                 //0,   1   ,2   ,3   ,4   ,5   ,6   ,7  ,8    ,9
unsigned char code LEDCode[10]= {0x60,0xf2,0xa4,0xd0,0x3a,0x31,0x21,0xf8,0x20,0xc7};

unsigned char data SetPoint;
void SelectPage(char Page);
void Write_RTC(unsigned char option,unsigned char j);
bit Init_RTC(void);
unsigned char Read_RTC(unsigned char option);

void main()
{
 unsigned char i,MaxNumber,MinNumber;
 bit Key_Adj,Key_Set;
 bit OnSetTime;
        TMOD = 0x01;
TH0 = 0xDC;
TL0 = 0x00;//10ms
        ET0=1;
        EA=1;
        TR0=1;
        page=0;
        msTimer=0;
        SecondTimer=0;
        msTime_Loop=0;
        Init_RTC();
        Hour1=0xf1;
        BEEF=1;
        RTCtime[0]= Read_RTC(YEAR_IN_RTC);//year
        RTCtime[1]= Read_RTC(MONTH_IN_RTC);//month
        RTCtime[2]= Read_RTC(DAY_IN_RTC);//day
        RTCtime[3]= Read_RTC(WEEK_IN_RTC);//week
        RTCtime[4]= Read_RTC(HOUR_IN_RTC);//hour
        RTCtime[5]= Read_RTC(MINUTE_IN_RTC);//minute
        RTCtime[6]= Read_RTC(SECOND_IN_RTC);//second
        Key_Adj= KEY_ADJ;
        Key_Set= KEY_SET;
        OnSetTime=0;
        while(1)
        {       if(SecondTimer>=500)
                {//500ms read RTC
                    SecondTimer=0;
                    if(!OnSetTime)
                    {
	                    RTCtime[0]= Read_RTC(YEAR_IN_RTC);//year
	                    RTCtime[1]= Read_RTC(MONTH_IN_RTC);//month
	                    RTCtime[2]= Read_RTC(DAY_IN_RTC);//day
	                    RTCtime[3]= Read_RTC(WEEK_IN_RTC);//week
	                    RTCtime[4]= Read_RTC(HOUR_IN_RTC);//hour
	                    RTCtime[5]= Read_RTC(MINUTE_IN_RTC);//minute
	                    RTCtime[6]= Read_RTC(SECOND_IN_RTC);//second
	                    for(i=0;i<3;i++)
	                    {
	                        Disp_RTCtime[i*2]= (RTCtime[i]>>4);
	                        Disp_RTCtime[i*2+1]= (RTCtime[i]&0x0f);
	                    }
	                    Disp_RTCtime[6]=RTCtime[3];//week
	                    for(i=4;i<7;i++)
	                    {
	                        Disp_RTCtime[i*2-1]= (RTCtime[i]>>4);
	                        Disp_RTCtime[i*2]= (RTCtime[i]&0x0f);
	                    }
	                    if((Hour1!= RTCtime[2]) &&(RTCtime[1]==0)&& (Hour1!=(RTCtime[2]+1)))
	                    {
	                        Hour1= RTCtime[2]+1;
	                        Hour2= (RTCtime[2]>>4)*10+(RTCtime[2]%0x0f);
	                        if(Hour2==0)Hour2=24;
	                        if(Hour2>12)Hour2-=12;
	                    }
	                    if(Hour1==RTCtime[2]+1)
	                    {
	                        if(BEEF)
	                        {
	                            BEEF=0;
	                            Hour2--;
	                        }
	                        else
	                        {
	                            BEEF=1;
	                            if(Hour2<=0)
	                                Hour1=RTCtime[2];
	                        }
	                    }
                    }
                    Key_Adj= KEY_ADJ;
                    Key_Set= KEY_SET;
                }
                if(!OnSetTime)
                {
                    if(!Key_Adj)
                    {
                         for(i=1;i<MAXPAGE;i++)Disp_RTCtime[i]= 0xbf;
                         OnSetTime=1;
                         SetPoint=0;
                    }
                }
                else
                {
                    if(!Key_Adj)
                    {
                        MinNumber=0;
                        MaxNumber=9;
                        //if(SetPoint==0||SetPoint==1)
                        //{//year
                        //    MaxNumber=9;
                        //}
                        if(SetPoint==2)
                        {//month
                            MaxNumber=1;
                        }
                        if(SetPoint==3)
                        {//month
                            MaxNumber=2;
                            if(Disp_RTCtime[2]==0)
                              MaxNumber=9;
                        }
                        if(SetPoint==4)
                        {//day
                            MaxNumber=3;
                        }
                        if(SetPoint==5)
                        {//day
                            MaxNumber=9;
                            if(Disp_RTCtime[4]==3)
                              MaxNumber=1;
                        }
                        if(SetPoint==6)
                        {//week
                            MaxNumber=7;
                            MinNumber=1;
                        }
                        if(SetPoint==7)
                        {//hour
                            MaxNumber=2;
                        }
                        if(SetPoint==8)
                        {//hour
                            MaxNumber=9;
                            if(Disp_RTCtime[7]==2)
                              MaxNumber=3;
                        }
                        if(SetPoint==9)
                        {//minute
                            MaxNumber=5;
                        }
                        //if(SetPoint==10)
                        //{//minute
                        //    MaxNumber=9;
                        //}
                        if(SetPoint==11)
                        {//second
                            MaxNumber=5;
                        }
                        //if(SetPoint==12)
                        //{//second
                        //    MaxNumber=9;
                        //}
                        Disp_RTCtime[SetPoint]++;
                        if(Disp_RTCtime[SetPoint]>MaxNumber)Disp_RTCtime[SetPoint]=MinNumber;
                    }
                    if(!Key_Set)
                    {
                        SetPoint++;
                    }
                    if(SetPoint>12)
                    {
                        Write_RTC(YEAR_IN_RTC,(Disp_RTCtime[1]<<4)+Disp_RTCtime[0]);
                        Write_RTC(MONTH_IN_RTC,(Disp_RTCtime[3]<<4)+Disp_RTCtime[2]);
                        Write_RTC(DAY_IN_RTC,(Disp_RTCtime[5]<<4)+Disp_RTCtime[4]);
                        Write_RTC(WEEK_IN_RTC,Disp_RTCtime[6]);
                        Write_RTC(HOUR_IN_RTC,(Disp_RTCtime[8]<<4)+Disp_RTCtime[7]);
                        Write_RTC(MINUTE_IN_RTC,(Disp_RTCtime[10]<<4)+Disp_RTCtime[9]);
                        Write_RTC(SECOND_IN_RTC,(Disp_RTCtime[12]<<4)+Disp_RTCtime[11]);
                        OnSetTime=0;
                    }
                }
                if(msTimer!=msTime_Loop)
                {
                        msTime_Loop= msTimer;
                        SelectPage(page);
                        P0= LEDCode[Disp_RTCtime[page]];
                        page++;
                        if(page>=MAXPAGE)page=0;
                }
        }
}
//10ms定时器中断
void  intT0(void) interrupt 1 using 1
{
        TH0 = 0xDC;
	TL0 = 0x00;//10ms
        //page++;
        //if(page>MAXPAGE)page=0;
        msTimer++;
        SecondTimer++;
}

void SelectPage(char Page)
{
    LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;
    LED9=1;LED10=1;LED11=1;LED12=1;LED13=1;LED14=1;LED15=1;LED16=1;LED17=1;
        switch(Page)
        {
        case 0:LED1=0;
             break;
        case 1:LED2=0;
             break;
        case 2:LED3=0;
             break;
        case 3:LED4=0;
             break;
        case 4:LED5=0;
             break;
        case 5:LED6=0;
             break;
        case 6:LED7=0;
             break;
        case 7:LED8=0;
             break;
        case 8:LED9=0;
             break;
        case 9:LED10=0;
             break;
        case 10:LED11=0;
             break;
        case 11:LED12=0;
             break;
        case 12:LED13=0;
             break;
        case 13:LED14=0;
             break;
        case 14:LED15=0;
             break;
        case 15:LED16=0;
             break;
        case 16:LED17=0;
             break;
        default:break;
        }
}

void Write_RTC(unsigned char option,unsigned char j)
{
  switch(option)
  {
  case YEAR_IN_RTC:RTC_YEARS=j;break;
  case MONTH_IN_RTC:RTC_MONTHS=j;break;
  case DAY_IN_RTC:RTC_DAYS=j;break;
  case HOUR_IN_RTC:RTC_HOURS=j;break;
  case MINUTE_IN_RTC:RTC_MINUTES=j;break;
  case SECOND_IN_RTC:RTC_SECONDS=j;break;
  case SECOND_ALARM_IN_RTC:RTC_SECONDS_ALARM=j;break;
  case MINUTE_ALARM_IN_RTC:RTC_MINUTES_ALARM=j;break;
  case HOUR_ALARM_IN_RTC:RTC_HOURS_ALARM=j;break;
  }
}

bit Init_RTC(void)
{
DSA=0x20;
DSB=0x72; //SET=0,*IE=disenable,SQW=disenable ,BCD,NO DSE
DSC=0x00;

//every second interrupt
Write_RTC(HOUR_ALARM_IN_RTC,0xff);
Write_RTC(MINUTE_ALARM_IN_RTC,0xff);
Write_RTC(SECOND_ALARM_IN_RTC,0xff);

return(1);
}

unsigned char Read_RTC(unsigned char option)
{
if((DSA&0x80)==0)return;
switch(option)
{
case YEAR_IN_RTC:return(RTC_YEARS);break;
case MONTH_IN_RTC:return(RTC_MONTHS);break;
case DAY_IN_RTC:return(RTC_DAYS);break;
case HOUR_IN_RTC:return(RTC_HOURS);break;
case WEEK_IN_RTC:return(RTC_WEEKS);break;
case MINUTE_IN_RTC:return(RTC_MINUTES);break;
case SECOND_IN_RTC:return(RTC_SECONDS);break;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -