📄 timer.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 + -