普中精灵项目电子手表:2切换

按P15键切换日期

main.c

include "led1.h"
#include "system.h"
#include "SysTick.h"
#include "key.h"
#include "smg.h"
#include "beep.h"
#include "rtc.h" 
int main()
{

	//u8 data=0x01;
	u8 i=0;
	//u8 j=0;
	u8 buf[8];
	u8 key=0;
	u8 keynum=0;
	ST_Init(72);
	LED_Init();
 KEY_Matrix_Init();
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //????????2?
	USART1_Init(115200);
	 BEEP_Init();
		RTC_Init();
	SMG_Init();
KEY_Init();
	while(1)
	{
		key=KEY_Matrix_Scan();
		keynum=KEY_Scan(1);
		if(keynum==16)
		{
		buf[0]=gsmg_code[calendar.w_year/10];
		buf[1]=gsmg_code[calendar.w_year%10];
		buf[2]=0x40;
		buf[3]=gsmg_code[calendar.w_month/10];
		buf[4]=gsmg_code[calendar.w_month%10];
		buf[5]=0x40;
		buf[6]=gsmg_code[calendar.w_date/10];
		buf[7]=gsmg_code[calendar.w_date%10];
		
		}
	else
	{		buf[0]=gsmg_code[calendar.hour/10];
		buf[1]=gsmg_code[calendar.hour%10];
		buf[2]=0x40;
		buf[3]=gsmg_code[calendar.min/10];
		buf[4]=gsmg_code[calendar.min%10];
		buf[5]=0x40;
		buf[6]=gsmg_code[calendar.sec/10];
		buf[7]=gsmg_code[calendar.sec%10];
	
	}
	
	
	SMG_Display(buf,1);
		if(i%100==0)
			LED0=!LED0;

		delay_ms(1);
	}
}

rtc.c

#include "rtc.h" 
#include "SysTick.h"
#include "usart.h"

static void RTC_NVIC_Config(void)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;		//RTCÈ«¾ÖÖжÏ
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//ÏÈÕ¼ÓÅÏȼ¶1λ,´ÓÓÅÏȼ¶3λ
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	//ÏÈÕ¼ÓÅÏȼ¶0λ,´ÓÓÅÏȼ¶4λ
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		//ʹÄܸÃͨµÀÖжÏ
	NVIC_Init(&NVIC_InitStructure);		//¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
}


u8 Is_Leap_Year(u16 year)
{			  
	if(year%4==0) //±ØÐëÄܱ»4Õû³ý
	{ 
		if(year%100==0) 
		{ 
			if(year%400==0)return 1;//Èç¹ûÒÔ00½áβ,»¹ÒªÄܱ»400Õû³ý 	   
			else return 0;   
		}else return 1;   
	}else return 0;	
}	 			   


//Ô·ÝÊý¾Ý±í											 
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //ÔÂÐÞÕýÊý¾Ý±í	  
//ƽÄêµÄÔ·ÝÈÕÆÚ±í
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
	u16 t;
	u32 seccount=0;
	if(syear<1970||syear>2099)return 1;	   
	for(t=1970;t<syear;t++)	//°ÑËùÓÐÄê·ÝµÄÃëÖÓÏà¼Ó
	{
		if(Is_Leap_Year(t))seccount+=31622400;//ÈòÄêµÄÃëÖÓÊý
		else seccount+=31536000;			  //ƽÄêµÄÃëÖÓÊý
	}
	smon-=1;
	for(t=0;t<smon;t++)	   //°ÑÇ°ÃæÔ·ݵÄÃëÖÓÊýÏà¼Ó
	{
		seccount+=(u32)mon_table[t]*86400;//Ô·ÝÃëÖÓÊýÏà¼Ó
		if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//ÈòÄê2Ô·ÝÔö¼ÓÒ»ÌìµÄÃëÖÓÊý	   
	}
	seccount+=(u32)(sday-1)*86400;//°ÑÇ°ÃæÈÕÆÚµÄÃëÖÓÊýÏà¼Ó 
	seccount+=(u32)hour*3600;//СʱÃëÖÓÊý
    seccount+=(u32)min*60;	 //·ÖÖÓÃëÖÓÊý
	seccount+=sec;//×îºóµÄÃëÖÓ¼ÓÉÏÈ¥

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//ʹÄÜPWRºÍBKPÍâÉèʱÖÓ  
	PWR_BackupAccessCmd(ENABLE);	//ʹÄÜRTCºÍºó±¸¼Ä´æÆ÷·ÃÎÊ 
	RTC_SetCounter(seccount);	//ÉèÖÃRTC¼ÆÊýÆ÷µÄÖµ

	RTC_WaitForLastTask();	//µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É  	
	return 0;	    
}

//³õʼ»¯ÄÖÖÓ		  
//ÒÔ1970Äê1ÔÂ1ÈÕΪ»ù×¼
//1970~2099ÄêΪºÏ·¨Äê·Ý
//syear,smon,sday,hour,min,sec£ºÄÖÖÓµÄÄêÔÂÈÕʱ·ÖÃë   
//·µ»ØÖµ:0,³É¹¦;ÆäËû:´íÎó´úÂë.
u8 RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
	u16 t;
	u32 seccount=0;
	if(syear<1970||syear>2099)return 1;	   
	for(t=1970;t<syear;t++)	//°ÑËùÓÐÄê·ÝµÄÃëÖÓÏà¼Ó
	{
		if(Is_Leap_Year(t))seccount+=31622400;//ÈòÄêµÄÃëÖÓÊý
		else seccount+=31536000;			  //ƽÄêµÄÃëÖÓÊý
	}
	smon-=1;
	for(t=0;t<smon;t++)	   //°ÑÇ°ÃæÔ·ݵÄÃëÖÓÊýÏà¼Ó
	{
		seccount+=(u32)mon_table[t]*86400;//Ô·ÝÃëÖÓÊýÏà¼Ó
		if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//ÈòÄê2Ô·ÝÔö¼ÓÒ»ÌìµÄÃëÖÓÊý	   
	}
	seccount+=(u32)(sday-1)*86400;//°ÑÇ°ÃæÈÕÆÚµÄÃëÖÓÊýÏà¼Ó 
	seccount+=(u32)hour*3600;//СʱÃëÖÓÊý
    seccount+=(u32)min*60;	 //·ÖÖÓÃëÖÓÊý
	seccount+=sec;//×îºóµÄÃëÖÓ¼ÓÉÏÈ¥ 			    
	//ÉèÖÃʱÖÓ
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//ʹÄÜPWRºÍBKPÍâÉèʱÖÓ   
	PWR_BackupAccessCmd(ENABLE);	//ʹÄܺ󱸼ĴæÆ÷·ÃÎÊ  
	//ÉÏÃæÈý²½ÊDZØÐëµÄ!
	
	RTC_SetAlarm(seccount);
 
	RTC_WaitForLastTask();	//µÈ´ý×î½üÒ»´Î¶ÔRTC¼Ä´æÆ÷µÄд²Ù×÷Íê³É  	
	
	return 0;	    
}

_calendar calendar;

u8 RTC_Get(void)
{
	static u16 daycnt=0;
	u32 timecount=0; 
	u32 temp=0;
	u16 temp1=0;	  
    timecount=RTC_GetCounter();	 
 	temp=timecount/86400;   //µÃµ½ÌìÊý(ÃëÖÓÊý¶ÔÓ¦µÄ)
	if(daycnt!=temp)//³¬¹ýÒ»ÌìÁË
	{	  
		daycnt=temp;
		temp1=1970;	//´Ó1970Ä꿪ʼ
		while(temp>=365)
		{				 
			if(Is_Leap_Year(temp1))//ÊÇÈòÄê
			{
				if(temp>=366)temp-=366;//ÈòÄêµÄÃëÖÓÊý
				else {temp1++;break;}  
			}
			else temp-=365;	  //ƽÄê 
			temp1++;  
		}   
		calendar.w_year=temp1;//µÃµ½Äê·Ý
		temp1=0;
		while(temp>=28)//³¬¹ýÁËÒ»¸öÔÂ
		{
			if(Is_Leap_Year(calendar.w_year)&&temp1==1)//µ±ÄêÊDz»ÊÇÈòÄê/2Ô·Ý
			{
				if(temp>=29)temp-=29;//ÈòÄêµÄÃëÖÓÊý
				else break; 
			}
			else 
			{
				if(temp>=mon_table[temp1])temp-=mon_table[temp1];//ƽÄê
				else break;
			}
			temp1++;  
		}
		calendar.w_month=temp1+1;	//µÃµ½Ô·Ý
		calendar.w_date=temp+1;  	//µÃµ½ÈÕÆÚ 
	}
	temp=timecount%86400;     		//µÃµ½ÃëÖÓÊý   	   
	calendar.hour=temp/3600;     	//Сʱ
	calendar.min=(temp%3600)/60; 	//·ÖÖÓ	
	calendar.sec=(temp%3600)%60; 	//ÃëÖÓ
	calendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//»ñÈ¡ÐÇÆÚ   
	return 0;
}	 
u8 RTC_Init(void)
{
	u8 temp=0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);
	PWR_BackupAccessCmd(ENABLE);
	
	if(BKP_ReadBackupRegister(BKP_DR1)!=0xa0a0)
	{
		BKP_DeInit();
RCC_LSEConfig(RCC_LSE_ON);
	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET&& temp<250)
{
	temp++;
	delay_ms(10);
}
if(temp>=250)return 1;
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);

RTC_WaitForLastTask();
RTC_WaitForSynchro();

RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();

RTC_EnterConfigMode();
RTC_SetPrescaler(32767);
RTC_WaitForLastTask();
RTC_Set(2023,8,18,17,34,55);
RTC_ExitConfigMode();
BKP_WriteBackupRegister(BKP_DR1,0xa0a0);
	}
	else
{
RTC_WaitForSynchro();
	RTC_ITConfig(RTC_IT_SEC,ENABLE);
	RTC_WaitForLastTask();
	
}
		RTC_NVIC_Config();
RTC_Get();
return 0;
}
//²ÌÀÕ¹«Ê½W=[C/4]-2C+y+[y/4]+[26(m+1)/10]+d-1 £¨ÆäÖÐ[ ]ΪȡÕû·ûºÅ£©
//»ñµÃÏÖÔÚÊÇÐÇÆÚ¼¸
//¹¦ÄÜÃèÊö:ÊäÈ빫ÀúÈÕÆڵõ½ÐÇÆÚ(Ö»ÔÊÐí1901-2099Äê)
//ÊäÈë²ÎÊý£º¹«ÀúÄêÔÂÈÕ 
//·µ»ØÖµ£ºÐÇÆÚºÅ
u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{
	u8 yearH,yearL;
	u8 week=0;
	
	yearH=year/100;//»ñÈ¡µ½¹«ÔªÄê·ÝÇ°2λÊý
	yearL=year%100;//»ñÈ¡µ½¹«ÔªÄê·Ýºó2λÊý
	//ËùÇóµÄÔ·ÝÈç¹ûÊÇ1Ô»ò2ÔÂ,ÔòÓ¦ÊÓΪǰһÄêµÄ13Ô»ò14ÔÂ
	if(month<3)
	{
		yearL-=1;
		if(month==1)
			month=13;
		else if(month==2)
			month=14;
	}
	week=yearH/4-2*yearH+yearL+yearL/4+(26*(month+1))/10+day-1;
	return week%7;
}

void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//ÃëÖÓÖжÏ
{
RTC_Get();
	printf("RTC Time:%d-%d-%d %d:%d:%d\r\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//Êä³öÄÖÁåʱ¼ä	
		printf("Week:%d\r\n",calendar.week);		

}
if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//ÄÖÖÓÖжÏ
	{
		RTC_ClearITPendingBit(RTC_IT_ALR);		//ÇåÄÖÖÓÖжÏ	  	
		RTC_Get();				//¸üÐÂʱ¼ä   
		printf("Alarm Time:%d-%d-%d %d:%d:%d\r\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//Êä³öÄÖÁåʱ¼ä	
		
  	} 	
	RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);		//ÇåÄÖÖÓÖжÏ
	RTC_WaitForLastTask();	
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值