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