/**************************************************************************************
程序功用:根据STM32的多功用数字钟(中文版)
**************************************************************************************
1、时钟的基准用STM32F103RCT6自带的RTC完成。
2、这三个按键的功用分别为:”设置”、”加”、”减”。(WAKEUP KEY0 KEY1)
三个按键作为这三个功用:
键盘上的WAKEUP用作”设置”,KEY0用作”加”,KEY1用作”减”。
设守时刻、日期、星期时,按下设定键,
相应的参数会闪耀,即一亮一灭,提示正的修正的数据,每按一下设置键,
设定的项目就会改变,次序为:
秒–分–时–星期–日–月–年–闹铃分–闹铃时。
次序设定完后,再按一下设定键,就退出设定状况,回到正显现状况。
3、用DS18B20显现温度。准确到小数点后一位。如:33.5℃。
4、添加用红外遥控器的CH CH+ CH- 三个按键进行时刻设置,
功用等同于键盘上的(WAKEUP KEY0 KEY1)”设置”、”加”、”减”。
5、经过串行口设置时刻日期。
如串行口发送t12:30:00 设置时刻;
如串行口发送d2016-08-12 设置日期;
6、经过接触屏进行时刻日期设置
在接触屏上有 “设置”、”加”、”减”三个标志,当用触笔去准时,就会产生同开发板上的
按键相同的作用。
接触按下去和弹起来时,按键的色彩会产生改变。
7、闹铃时刻到,蜂鸣器产生“嘀嘀”声
8、超温报警
TFT屏界面如下:
—————————————–
| –多功用数字钟– |
| 作者:王庐山 16/08/18 |
| 日期:2016年08月18日 |
| 时刻:17时12分 |
| 星期:四 |
| 温度:34.5℃ |
| ___ __ __ |
| |设置| |加 | |减 | |
| —- — — |
——————————————
9、需求完速程序的朋友请QQ我。
**************************************************************************************
硬件:LED0—-GPIOA.8 (LED运转灯)
KEY0—-GPIOC.5 (对时刻日期进行设置)
KEY1—-GPIOA.15
KEY_WAKEUP—-GPIOA.0
TIMER2守时器守时功用。(用于LED运转灯)
TIMER5守时器的守时和捕获功用(红外解析)
TFT液晶屏2。8寸屏带接触功用。(显现界面与接触功用)
TOUCH接触屏。 (接触按键)
DS18B20—PC4; (环境温度)
HS138红外遥控—PA1;(完成红外调时)
串行口USART1; (完成串口调时调时)
RTC实时时钟 (时刻基准)
SD卡 (寄存字库,文件体系运用)
EEPROM 24C02 (寄存接触屏的相关信息)
FLASH W25Q64 (寄存字库的相关信息及文件体系运用)
软件:FATFS(文件体系)
MALLOC(存储办理)
汉字字库
SPI总线协议
IIC总线协议
开发板:正点原子MINI开发板
**************************************************************************************
编程意图:让大赛学生赶快学会STM32的归纳编程。
本程序用到了STM32很多的硬件资源,还用到了存储办理和FATFS,
只需学会了该程序的编程,能够这样说,你的STM32现已入门了。
**************************************************************************************
编程软件:KEIL5
**************************************************************************************
常用的算法:
按键选用状况机完成按键扫描。在守时器中对按键进行处理。
红外部分选用守时器捕获功用完成。
时刻用STM32自带的RTC完成;
**************************************************************************************
时刻:2016.8.18
作者:王庐山
工作室:湖北工业职业技术学院电子立异中心
***************************************************************************************/
#include “stm32f10x_conf.h”
#include “delay.h”
#include “sys.h”
#include “LED.h”
#include “key.h”
#include “timer2.h”
#include “24cxx.h”
#include “lcd.h”
#include “touch.h”
#include “usart.h”
#include “rtc.h”
#include “ds18b20.h”
#include “remote.h”
#include “malloc.h”
#include “flash.h”
#include “spi.h”
#include “mmc_sd.h”
#include “exfuns.h”
#include “fattester.h”
#include “ff.h”
#include “fontupd.h”
#include “diskio.h”
#include “text.h”
//时刻结构体
typedef struct
{
vu8 s_hour;
vu8 s_min;
vu8 s_sec;
//公历日月年周
vu16 s_year;
vu8 s_month;
vu8 s_date;
vu8 s_week;
vu8 s_al_min;
vu8 s_al_sec;
}Timer;
Timer S_timer;
unsigned char flag_20ms=0x0,flag_500ms=0,flag_250ms=0,flag_1s=0;//守时标志
unsigned char flag_key0=0,flag_key1=0,flag_key2=0,flag_tiao=0,key_remot=0;
void Disp_Tiao_Shan(void);
void Load_Drow_Dialog(void);
int main(void)
{
unsigned char temp[12],sec_back=0xff,t=0,len=0;
short temp5;
delay_init();
NVIC_Configuration();
uart_init(9600);
Led_Init();
key_init();
Timer2_config(71,2000); //守时两毫秒
mem_init();
SPI_Flash_Init();
SD_Initialize();
exfuns_init();
DS18B20_Init();
Remote_Init();
AT24CXX_Init();
RTC_Init();
LCD_Init();
LCD_Clear(BLUE);
TP_Init();
POINT_COLOR=RED;
BACK_COLOR=BLUE;
if(!font_init())
printf(“字库OK!、\r\n”);
else
{
if(!update_font(10,30,16))
printf(“字库更新结束!、\r\n”);
}
Show_Str(10,30,220,24,”–多功用数字钟–“,24,0);
Show_Str(30,70,230,24,”作者:王庐山 16/08/18″,16,0);
Show_Str(10,100,220,24,”日期: 年 月 日”,24,0);
Show_Str(10,140,220,24,”时刻: 时 分 秒 “,24,0);
Show_Str(55,260,150,24,”设置 加 减”,24,0);
calendar.al_hour=AT24CXX_ReadOneByte(0x0000);//从24C02中读出闹铃时刻
calendar.al_min=AT24CXX_ReadOneByte(0x0001);
// POINT_COLOR=YELLOW ;
LCD_DrawRectangle(50,250,100,290);
LCD_DrawRectangle(110,250,160,290);
LCD_DrawRectangle(170,250,220,290);
f_mount(fs[0],”0:”,1);
f_mount(fs[1],”1:”,1);
while(1)
{
if(tp_dev.sta&TP_PRES_DOWN)//有接触按下状况。
{//按下时,方框的色彩要产生改变,这样看作用才明显现,
//手松开后,又要康复原画的色彩。
if((tp_dev.x[0]>50)&&(tp_dev.x[0]<100)&&(tp_dev.y[0]>250)&&(tp_dev.y[0]<290))
{LCD_Fill(51,251,99,289,YELLOW);Show_Str(55,260,48,24,”设置”,24,0);}
else if((tp_dev.x[0]>110)&&(tp_dev.x[0]<160)&&(tp_dev.y[0]>250)&&(tp_dev.y[0]<290))
{LCD_Fill(111,251,159,289,YELLOW);Show_Str(120,260,48,24,”加”,24,0);}
else if((tp_dev.x[0]>170)&&(tp_dev.x[0]<220)&&(tp_dev.y[0]>250)&&(tp_dev.y[0]<290))
{LCD_Fill(171,251,219,289,YELLOW);Show_Str(180,260,48,24,”减”,24,0);}
}
if((USART_RX_STA&0x8000))//收到了一帧串行口数据,进行解析。
{
switch(USART_RX_BUF[0])
{
case t:{//time是调时刻
S_timer.s_hour=(USART_RX_BUF[1]-0)*10+(USART_RX_BUF[2]-0);
S_timer.s_min=(USART_RX_BUF[3]-0)*10+(USART_RX_BUF[4]-0);
S_timer.s_sec=(USART_RX_BUF[5]-0)*10+(USART_RX_BUF[6]-0);
USART_RX_STA=0;
printf(“set time:%s”,USART_RX_BUF);
calendar.sec=S_timer.s_sec;
calendar.hour=S_timer.s_hour;
calendar.min=S_timer.s_min;
calendar.w_date=S_timer.s_date;
calendar.w_month=S_timer.s_month;
calendar.w_year=S_timer.s_year;
calendar.week=S_timer.s_week;
RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);
break;
}
case d:{//date是调日期
S_timer.s_year =(USART_RX_BUF[1]-0)*1000+(USART_RX_BUF[2]-0)*100+(USART_RX_BUF[3]-0)*10+(USART_RX_BUF[4]-0);
S_timer.s_month=(USART_RX_BUF[5]-0)*10+(USART_RX_BUF[6]-0);
S_timer.s_date=(USART_RX_BUF[7]-0)*10+(USART_RX_BUF[8]-0);
USART_RX_STA=0;
printf(“set date:%s”,USART_RX_BUF);
calendar.sec=S_timer.s_sec;
calendar.hour=S_timer.s_hour;
calendar.min=S_timer.s_min;
calendar.w_date=S_timer.s_date;
calendar.w_month=S_timer.s_month;
calendar.w_year=S_timer.s_year;
calendar.week=S_timer.s_week;
RTC_Set(calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);
break;
}
default :break;
}
}
if(flag_tiao!=0)//用于调节时闪耀显现
{
switch(flag_tiao)
{
case 1: {
if(flag_250ms==1)
{
LCD_ShowString(10+12*14,140,24,24,24,” “);
break;
}
else goto kk2;
}
case 2: {
if(flag_250ms==1)
{
LCD_ShowString(10+12*10,140,24,24,24,” “);
break;
}
else goto kk2;
}
case 3: {
if(flag_250ms==1)
{
LCD_ShowString(10+12*6,140,24,24,24,” “);
break;
}
else goto kk2;
}
case 4: {
if(flag_250ms==1)
{
LCD_ShowString(10+12*6,180,24,24,24,” “);
break;
}
else goto kk2;
}
case 5: {
if(flag_250ms==1)
{
LCD_ShowString(10+12*16,100,24,24,24,” “);
break;
}
else goto kk2;
}
case 6: {
if(flag_250ms==1)
{
LCD_ShowString(10+12*12,100,24,24,24,” “);
break;
}
else goto kk2;
}
case 7: {
if(flag_250ms==1)
{
LCD_ShowString(10+12*6,100,48,24,24,” “);
break;
}
else goto kk2;
}
case 8: {
if(flag_250ms==1)
{
LCD_ShowString(30+12*8,180,24,24,24,” “);
break;
}
else goto kk2;
}
case 9: {
if(flag_250ms==1)
{
LCD_ShowString(30+12*4,180,24,24,24,” “);
break;
}
else goto kk2;
}
kk2:
{
sprintf(temp,”日期:%04d年%02d月%02d日”,calendar.w_year,calendar.w_month,calendar.w_date);
Show_Str(10,100,220,24,temp,24,0);
sprintf(temp,”时刻:%02d时%02d分%02d秒 “,calendar.hour,calendar.min,calendar.sec);
Show_Str(10,140,220,24,temp,24,0);
if(flag_tiao<=7)
{sprintf(temp,”星期:%01d”,calendar.week);
Show_Str(10,180,100,24,temp,24,0); }
else
{
sprintf(temp,”闹铃:%02d时%02d分 “,calendar.al_hour,calendar.al_min);
Show_Str(10,180,220,24,temp,24,0); }
break;
}
default :break ;
}
}
else//正常显现
{
if(sec_back!=calendar.sec)
{
sprintf(temp,”日期:%04d年%02d月%02d日”,calendar.w_year,calendar.w_month,calendar.w_date);
Show_Str(10,100,220,24,temp,24,0);
sprintf(temp,”时刻:%02d时%02d分%02d秒 “,calendar.hour,calendar.min,calendar.sec);
Show_Str(10,140,220,24,temp,24,0);
sprintf(temp,”星期:%01d “,calendar.week);
Show_Str(10,180,220,24,temp,24,0);
}
}
keyfunction();//按键扫描和功用解析(包含了开发板上的按键、红外遥控按键、接触按键)
if(flag_1s ==1)//每秒读取一次温度
{
flag_1s =0;
//LCD_ShowString(30+5*12,180,210,24,24,” “);
temp5=DS18B20_Get_Temp();
sprintf(temp,”温度:%02d.%01d℃”,temp5/10,temp5%10);
Show_Str(10,220,210,24,temp,24,0);
}
}
}
/*
函数功用:显现画图框
*/
void Load_Drow_Dialog(void)
{
LCD_Clear(RED);//清屏
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(lcddev.width-30,0,200,24,24,”RST”);//显现清屏区域
}