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

📄 main.c

📁 stm32 红外万年历
💻 C
字号:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "pwm.h"
#include "lcd.h"
#include "rtc.h"
#include "remote.h"
#include "flash.h"
#include "spi.h"
#include "text.h"	  
#include "fontupd.h"
#include "ff.h"
#include "diskio.h"
 	
const u8 *COMPILED_DATE=__DATE__;//获得编译日期
const u8 *COMPILED_TIME=__TIME__;//获得编译时间


const u8* Week[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
u16 hongwai_key,nian=0,yue=0,ri=0,shi=0,fen=0,miao=0,jishu[6]={0};

void menu()
{

	Show_Str(80,20,"操作菜单",16,0);
	POINT_COLOR=BLUE;//设置字体为蓝色

	Show_Str(40,60,"设置时间    C ",16,0);

		

}
void every_menu()
{
   	POINT_COLOR=RED;//设置字体为红色
	LCD_ShowString(0,0, "KEYVAL:");						
	LCD_ShowString(140,300,"    -  -  ");	  //显示时间 
	LCD_ShowString(150,282,"  :  :  ");	
}
 int main(void)
 {
 	u8 key,key1[2],key2=1;
	u8 t=0,i;
	u8 temp=0;

	FATFS fs;
	
		
	SystemInit();
	delay_init(72);	     //延时初始化
	NVIC_Configuration();
 	uart_init(9600);
 	LED_Init();
 	KEY_Init();
	LCD_Init();
 	SPI_Flash_Init();	//SPI FLASH初始化
	f_mount(0, &fs); //初始化必须mount	

	timer1.w_year1=2012;
	timer1.w_month1=10;
	timer1.w_date1=13;
	timer1.hour1=23;
	timer1.min1=55;
	timer1.sec1=50;
	RTC_Init();
	Remote_Init();	    //初始化红外接收

	POINT_COLOR=RED;//设置字体为红色 
//	LCD_ShowString(0,0, "KEYVAL:");						
//	LCD_ShowString(140,300,"    -  -  ");	  //显示时间 
//	LCD_ShowString(150,282,"  :  :  ");	
	   
	
	while(font_init())
	{
		POINT_COLOR=RED; 
     	POINT_COLOR=RED;
		LCD_Clear(WHITE);
		LCD_ShowString(60,50,"Mini STM32");	
		LCD_ShowString(60,70,"Font Updating..."); 
			 
 		while(update_font())//从SD卡更新
	    {   
	       	LCD_ShowString(60,90,"FAT SYS ERROR.      ");	 
			delay_ms(200);     
			LED0=!LED0;	
		}

	}
	
//由于是汉字显示 所以必须要在初始化字库之后才能显示
	 menu();
	 every_menu();

	while(1)
	{	

		
		if(Remote_Rdy)
		{
			key=Remote_Process();
			LCD_ShowNum(56,0,key,3,16);//显示键值



/*********************************设置时间***************************************************/							
			if(key==226)	 
			{
				key1[0]=key;
				LCD_Clear(WHITE);
				every_menu();
				POINT_COLOR=RED;
				Show_Str(20,40,"当前日期:",16,0);
				Show_Str(20,60,"星    期:",16,0);
				LCD_ShowString(100,40,"    -  -  "); 
				Show_Str(20,80,"进入时间:",16,0);
				LCD_ShowString(100,80,"  :  :  ");
				Show_Str(20,100,"设置时间:",16,0);
				Show_Str(110,100,"设置指示:",16,0);
				Show_Str(30,120,"年:",16,0);
				Show_Str(100,120,"月:",16,0);
				Show_Str(150,120,"日:",16,0);
				Show_Str(30,140,"时:",16,0);
				Show_Str(100,140,"分:",16,0);
				Show_Str(150,140,"秒:",16,0);
				Show_Str(60,180,"不设置直接退出",16,0);
				POINT_COLOR=BLUE;

				switch(timer.week)
				{
					case 0:
						Show_Str(100,60,"星期日",16,0);
						break;
					case 1:
						Show_Str(100,60,"星期一",16,0);
						break;
					case 2:
						Show_Str(100,60,"星期二",16,0);
						break;
					case 3:
						Show_Str(100,60,"星期三",16,0);
						break;
					case 4:
						Show_Str(100,60,"星期四",16,0);
						break;
					case 5:
						Show_Str(100,60,"星期五",16,0);
						break;
					case 6:
						Show_Str(100,60,"星期六",16,0);
						break;  
				}


				LCD_ShowNum(100,40,timer.w_year,4,16);
				LCD_ShowNum(140,40,timer.w_month,2,16);
				LCD_ShowNum(164,40,timer.w_date,2,16);
				LCD_ShowNum(100,80,timer.hour,2,16);
				LCD_ShowNum(124,80,timer.min,2,16);	
				LCD_ShowNum(148,80,timer.sec,2,16);
			}
			if(key1[0]==226)
			{
				if(key==56||key==104||key==152||key==176||key==48||key==24||key==122||key==16||key==90||key==66)
				{
					switch(key)
					{
						case 56:
							hongwai_key=8;
							break;
						case 104:
							hongwai_key=1;
							break;
						case 152:
							hongwai_key=2;
							break;
						case 176:
							hongwai_key=3;
							break;
						case 48:
							hongwai_key=4;
							break;
						case 24:
							hongwai_key=5;
							break;
						case 122:
							hongwai_key=6;
							break;
						case 16:
							hongwai_key=7;
							break;
						case 90:
							hongwai_key=9;
							break;
						case 66:
							hongwai_key=0;

							break;
					}
				} 
			/**************************年*********************************/
				
				if(key2==1)
				{ 
					Show_Str(190,100,"年",16,0);

					if(jishu[0]<4)
					{
						if(key==56||key==104||key==152||key==176||key==48||key==24||key==122||key==16||key==90||key==66)
						{
							if(jishu[0]==0)
							{
								nian=hongwai_key;
							}
							else
							{
								nian=nian*10+hongwai_key;
							}

							LCD_ShowNum(60,120,nian,4,16);
						
							jishu[0]++;
							
						}
						if(key==168)			 /**************  ^相反 *************/
						{
							jishu[0]=4;
						}
					}
				}
			/*****************************月***********************************/

				if(jishu[0]==4)
				{
					key2=2;
					Show_Str(190,100,"月",16,0);
					jishu[0]=1;
					key=1;	
				}
				if(key2==2)
				{	
					if(jishu[1]<2)
					{
						if(key==56||key==104||key==152||key==176||key==48||key==24||key==122||key==16||key==90||key==66)
			   		 	{
							if(jishu[1]==0)
							{
								yue=hongwai_key;
							}
							else
							{
								yue=yue*10+hongwai_key;
							}
							LCD_ShowNum(130,120,yue,2,16);
							jishu[1]++;
							if(yue>12)				   //0~12月设置
							{
								jishu[1]=0;
							}
							
						}
						if(key==168)				 //进入日的设置
						{
							jishu[1]=2;
						}
					}
			 	}
				
			/*****************************日*******************************/

				if(jishu[1]==2)
				{
					key2=3;
					Show_Str(190,100,"日",16,0);
					jishu[1]=1;
					key=1;	
				}				
				if(key2==3)
				{
					if(jishu[2]<2)
					{
						if(key==56||key==104||key==152||key==176||key==48||key==24||key==122||key==16||key==90||key==66)
			   		 	{
							if(jishu[2]==0)
							{
								ri=hongwai_key;
							}
							else
							{
								ri=ri*10+hongwai_key;
							}
							LCD_ShowNum(180,120,ri,2,16);
							jishu[2]++;
							if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
							{
								if(ri>31)
								{
										jishu[2]=0;
								}
							}
							else if(yue==4||yue==6||yue==9||yue==11)
							{
								if(ri>30)
								{
									jishu[2]=0;
								}
							}
							if(nian%4==0&&nian%100!=0||nian%400==0)
							{
								 if(yue==2)
								 {
								 	if(ri>29)
									{
										jishu[2]=0;
									}
								 }
							}
							else
							{
								 if(yue==2)
								 {
								 	if(ri>28)
									{
										jishu[2]=0;
									}
								 }
								
							}


						}
						if(key==168)
						{
							jishu[2]=2;
						}
					}
			 	}					 
			/*****************************时*********************************/

				if(jishu[2]==2)
				{
					key2=4;
					Show_Str(190,100,"时",16,0);
					jishu[2]=1;
					key=1;	
				}				
				if(key2==4)
				{


					if(jishu[3]<2)
					{
						if(key==56||key==104||key==152||key==176||key==48||key==24||key==122||key==16||key==90||key==66)
			   		 	{
							if(jishu[3]==0)
							{
								shi=hongwai_key;
							}
							else
							{
								shi=shi*10+hongwai_key;
							}
							LCD_ShowNum(60,140,shi,2,16);
							jishu[3]++;
							if(shi>23)
							{
								jishu[3]=0;
							}
						}
						if(key==168)
						{
							jishu[3]=2;
						}
					}
			 	}
		/****************************分*******************************/				
				if(jishu[3]==2)
				{
					key2=5;
					Show_Str(190,100,"分",16,0);
					jishu[3]=1;
					key=1;	
				}
				if(key2==5)
				{
					

					if(jishu[4]<2)
					{
						if(key==56||key==104||key==152||key==176||key==48||key==24||key==122||key==16||key==90||key==66)
			   		 	{
							if(jishu[4]==0)
							{
								fen=hongwai_key;
							}
							else
							{
								fen=fen*10+hongwai_key;
							}
							LCD_ShowNum(130,140,fen,2,16);
							jishu[4]++;
							if(fen>59)
							{
								jishu[4]=0;
							}
						}
						if(key==168)
						{
							jishu[4]=2;
						}
					}
			 	}
			/********************秒************************/
				if(jishu[4]==2)
				{
					key2=6;
					Show_Str(190,100,"秒",16,0);
					jishu[4]=1;
					key=1;	
				}
				if(key2==6)
				{
					if(jishu[5]<2)
					{
						if(key==56||key==104||key==152||key==176||key==48||key==24||key==122||key==16||key==90||key==66)
			   		 	{
							if(jishu[5]==0)
							{
								miao=hongwai_key;
							}
							else
							{
								miao=miao*10+hongwai_key;
							}
							LCD_ShowNum(180,140,miao,2,16);
							jishu[5]++;
							if(miao>59)
							{
								jishu[5]=0;
							}
						}
					}
			 	}
			/*****************************确认设置*********   >||  *************************/
			if(key==2)
			{
				if(jishu[0]==0)
					nian=timer.w_year;
				if(jishu[1]==0)
					yue=timer.w_month;
				if(jishu[2]==0)
					ri=timer.w_date;
				if(jishu[3]==0)
					shi=timer.hour;
				if(jishu[4]==0)
					fen=timer.min;					
				if(jishu[5]==0)
					miao=timer.sec;


				timer1.w_year1=nian;
				timer1.w_month1=yue;
				timer1.w_date1=ri;
				timer1.hour1=shi;
				timer1.min1=fen;
				timer1.sec1=miao;
				RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//使能PWR和BKP外设时钟   
				PWR_BackupAccessCmd(ENABLE);	//使能RTC和后备寄存器访问 
				BKP_DeInit();	//将外设BKP的全部寄存器重设为缺省值 	
				RCC_LSEConfig(RCC_LSE_ON);	//设置外部低速晶振(LSE),使用外设低速晶振
				while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)	//检查指定的RCC标志位设置与否,等待低速晶振就绪
				{
					temp++;
					delay_ms(10);
				}
				if(temp>=250)return 1;//初始化时钟失败,晶振有问题	    
				RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
				RCC_RTCCLKCmd(ENABLE);	//使能RTC时钟  
				RTC_WaitForSynchro();		//等待最近一次对RTC寄存器的写操作完成
				RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
				RTC_ITConfig(RTC_IT_SEC, ENABLE);		//使能RTC秒中断
				RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
				RTC_SetPrescaler(32767); //设置RTC预分频的值
				RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
				BKP_WriteBackupRegister(BKP_DR1, 0X5051);
				RTC_Init();

				key=1;
				key2=1;
				key1[0]=1;
				for(i=0;i<6;i++)
				{
					jishu[i]=0;
				}
				LCD_Clear(WHITE);
				every_menu();
				menu();	
	
			}
/*************************重新设置* |<<   ***********************************/					
				if(key==34)
				{
					key2=1;
				 	nian=0;
				   	yue=0;
				    ri=0;
				    shi=0;
				    fen=0;
				    miao=0;
					LCD_ShowString(60,120,"    ");
					LCD_ShowString(130,120,"  "); 
					LCD_ShowString(180,120,"  ");
					LCD_ShowString(60,140,"    ");
					LCD_ShowString(130,140,"  ");
					LCD_ShowString(180,140,"  ");
					Show_Str(190,100,"年",16,0);
					for(i=0;i<6;i++)
					{
						jishu[i]=0;
					}


				}
		/************************不保存直接退出*************************************/				
				if(key==82)
				{
					key2=1;
					key1[0]=1;
					key=1;
				 	nian=0;
				   	yue=0;
				    ri=0;
				    shi=0;
				    fen=0;
				    miao=0;
					for(i=0;i<6;i++)
					{
						jishu[i]=0;
					}
					LCD_Clear(WHITE);
					every_menu();
					menu();
	

				}
											  
			}
		}

/**************************显示当前时间*********************************/
								    
		if(t!=timer.sec)
		{
			t=timer.sec;
			POINT_COLOR=BLUE;//设置字体为蓝色
			LCD_ShowNum(140,300,timer.w_year,4,16);									  
			LCD_ShowNum(180,300,timer.w_month,2,16);									  
			LCD_ShowNum(204,300,timer.w_date,2,16);
			LCD_ShowNum(150,282,timer.hour,2,16);									  
			LCD_ShowNum(174,282,timer.min,2,16);									  
			LCD_ShowNum(198,282,timer.sec,2,16);
			LED0=!LED0;
		}									  
	}  

 }

⌨️ 快捷键说明

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