所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开

【暖冬行动】这个冬天造个5寸数码管时钟Eclock

阿偶 阿偶 2020-11-26 12:38:46
4
2
简单

【项目介绍】

    进入冬季了天气变冷,很多时候躺到床上就不想起来了,看时间不是为了起床,而是看还能睡多久,冷飕飕的空气手机又离床比较远(放近貌似有辐射),实是令人苦恼;现代人看时间,不是看手机,就是看手表,却很少看见另一种记录时间的东西——数码管时钟,这对于一些喜欢数字的人来说,是一种失落和遗憾,不过不用担心,今天我就带着我的数码管时钟Eclock跟大家见面了

projectImage

【功能介绍】:

1.通过8位数码管自动切换显示年月日、时分秒、温度

2.按键总共有四个,从左至右分别为+、-、下一位选择、进入设置时间

3.时间模式:24小时制

4.秒自动归零:调节时或分后秒即自动归零

5.显示模式:动态扫描

6.加入独立看门狗程序,预防死机

步骤1 步骤1
所需元器件
材料清单 材料清单
1x
STM32F103C8T6单片机最小系统板
1x
ULN2803达林顿晶体管
8x
TIP127功率达林顿晶体管
2x
74LS07 缓冲器/线路驱动器
1x
TM1640数码管驱动芯片
1x
转接板 SOP转DIP SO28
4x
TTP223 触摸按键模块
1x
LM75A温度传感器
1x
电源适配器24v1A
1x
转接接板贴片转直插 SOP转DIP SO8
9x
9*15单面镀锡洞洞板
2x
1*16单排座 2.54间距
8x
红白 双头 2.54mm 端子线 长20cm/10P
10x
220欧1/2W(0.5W)电阻
8x
5英寸LED数码管50101BS共阳
1x
DC-DC电源模块 3A大电流降压模块5V
4x
10MM 红发红 圆头红光LED
1x
3脚黑色DC头DC005 DC座子
2x
保险管 夹子 5*20 保险丝夹
1x
保险管0.1A
6x
亚克力透明有机玻璃板
20x
铜柱m3 六角铜柱
20x
带垫片螺丝 M3*6
1x
S8050三极管
步骤2 步骤2
电路图

由于时间原因没有绘出主控电路

projectImage
步骤3 步骤3
硬件连接

主控板:

projectImage

数码管驱动板正面:

projectImage

数码管驱动板背面:

projectImage

8个数码管拼装:

projectImage
projectImage
projectImage

上电:

projectImage
步骤4 步骤4
时分秒分隔支架(3D打印)
projectImage
projectImage
projectImage

上视频:

代码 代码
	                    					/*********************************************************************************************
程序名:	数码管时钟Eclock
编写人:	阿偶	
编写时间:	2020年11月1日
编写软件:      Keil 4
硬件支持:	STM32F103C8   外部晶振8MHz RCC函数设置主频72MHz   							
说明:
本模板加载了STM32F103内部的RCC时钟设置,并加入了利用滴答定时器的延时函数。
可根据自己的需要增加或删减。

*********************************************************************************************/
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "rtc.h"
#include "TM1640.h"
#include "lm75a.h"
#include "touch_key.h"
#include "buzzer.h"
#include "iwdg.h"
#include "led.h"

int main (void){//主程序
	u8 a=0,c=0;
	u8 MENU=0;//菜单值
	u8 buffer[3];//存入温度
	u16 i=0;
	u16 t;
	u16 j;
	u8 rup=0;//调整时间标志位
	u8 sd;//进入调整时间标志位
	delay_ms(200);//延时200毫秒让其它器件准备

	RCC_Configuration(); //系统时钟初始化
	I2C_Configuration();//I2C初始化 
	RTC_Config();  //RTC初始化
	RTC_Calibration();//RTC校准函数
	TM1640_Init(); //TM1640初始化
	TOUCH_KEY_Init();//按键初始化
	LM75A_GetTemp(buffer); //读取LM75A的温度数据
	LED_Init();
	BUZZER_Init();//初始化
	BUZZER_BEEP2();//响一声
	IWDG_Init(); //初始化并启动独立看门狗

	for(j=0;j<10;j++){
		TM1640_display(0,j); //初始显示内容
		TM1640_display(1,j);
		TM1640_display(2,j);
		TM1640_display(3,j);
		TM1640_display(4,j);
		TM1640_display(5,j);
		TM1640_display(6,j);
		TM1640_display(7,j);
		delay_ms(300);
		IWDG_Feed(); //喂狗
	}

//	RTC_Set(2020,11,9,22,58,00); //写入当前时间(1970~2099年有效)
	RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);

	while(1){
		if(rup){
			rup=0;
			RTC_Set(ryear,rmon,rday,rhour,rmin,rsec);
		}
		if(MENU<3 || MENU>8){
			RTC_Get(); //读出RTC时间
			LM75A_GetTemp(buffer); //读取LM75A的温度数据
		}

		t++;//设置切换显示时间
		if(MENU<3){
			if(t==1)MENU=0;
			if(t==3000)MENU=1;//年月日的显示时长
			if(t==15000)MENU=2;//时分秒的显示时长
			if(t==15025)t=0;//温度的显示时长
		}

		if(MENU==0){//显示年月日
				TM1640_display(0,(ryear%100)/10); //年
				TM1640_display(1,(ryear%100)%10);
				TM1640_display(2,21);// -	
				TM1640_display(3,rmon/10);//月
				TM1640_display(4,rmon%10); 
				TM1640_display(5,21);// -
				TM1640_display(6,rday/10);//日
				TM1640_display(7,rday%10);
				TM1640_led(0x00);
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));
				sd=0;
	
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){ //读触摸按键的电平
					MENU=0;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A));
				}
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){ //读触摸按键的电平
					MENU=1;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B));
				}
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读触摸按键的电平
					MENU=2;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C));
				}
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读触摸按键的电平
					MENU=3;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
				}
		}
		if(MENU==1){//显示时分秒			
				TM1640_display(0,20); //无
				TM1640_display(1,20); //无
				TM1640_display(2,rhour/10); //时
				TM1640_display(3,rhour%10+10);
				TM1640_display(4,rmin/10);	//分
				TM1640_display(5,rmin%10+10);
				TM1640_display(6,rsec/10); //秒
				TM1640_display(7,rsec%10);
				TM1640_led(0x00);
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0));
				sd=1;
	
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){ //读触摸按键的电平
					MENU=0;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A));
				}
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){ //读触摸按键的电平
					MENU=1;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B));
				}
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读触摸按键的电平
					MENU=2;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C));
				}
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读触摸按键的电平
					MENU=3;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
				}
		}
		if(MENU==2){//显示温度
				TM1640_display(0,20); //无
				TM1640_display(1,20); //无
				if(buffer[0])
					TM1640_display(2,21); //正负号
				else
					TM1640_display(2,20);
				TM1640_display(3,(buffer[1]%100)/10);//温度
				TM1640_display(4,(buffer[1]%10)+10);
				TM1640_display(5,(buffer[2]%100)/10);
				TM1640_display(6,buffer[2]%10);
				TM1640_display(7,22);//c
				TM1640_led(0x00);
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){ //读触摸按键的电平
					MENU=0;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A));
				}
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){ //读触摸按键的电平
					MENU=1;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B));
				}
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读触摸按键的电平
					MENU=2;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C));
				}
				if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读触摸按键的电平
					MENU=3;
					BUZZER_BEEP1();//响一声
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
				}
				delay_ms(200);//延时200毫秒让温度传感器有时间读取数据
		}

		if(MENU==3){//显示SET
			TM1640_display(0,23); //无
			TM1640_display(1,24); 
			TM1640_display(2,25);
			TM1640_display(3,20);
			TM1640_display(4,20);
			TM1640_display(5,20);
			TM1640_display(6,20);
			TM1640_display(7,20);
			TM1640_led(0x00);
			BUZZER_BEEP3();
			delay_ms(1000);
			switch (sd)
			{
				case 0:
					MENU=4;
					break;
				case 1:
					MENU=7;
					break;
				default:
					break;
			}
		}
		//调时从这里开始
		if(MENU==4){//年设置
			i++;
			if(i>600){
				TM1640_display(0,(ryear%100)/10); //年调时闪烁
				TM1640_display(1,(ryear%100)%10);
			}else{
				TM1640_display(0,20);
				TM1640_display(1,20);
			}
			if(i>1200)i=0;

			TM1640_display(2,21);// -	
			TM1640_display(3,rmon/10);//月
			TM1640_display(4,rmon%10); 
			TM1640_display(5,21);// -
			TM1640_display(6,rday/10);//日
			TM1640_display(7,rday%10);
			TM1640_led(0x00);

			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){
						i=601;
						ryear++;
						if(ryear>2099)ryear=2000;
						TM1640_display(0,(ryear%100)/10); //年
						TM1640_display(1,(ryear%100)%10);
						delay_ms(80);
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
					if(a==0){ //判断单击
						//单击后执行的程序放到此处
							i=601;
							ryear++;
							if(ryear>2099)ryear=2000;
							BUZZER_BEEP1();//响一声						
					}
				}
				a=0;c=0; //参数清0
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){
						i=601;
						ryear--;
						if(ryear<2000)ryear=2099;
						TM1640_display(0,(ryear%100)/10); //年
						TM1640_display(1,(ryear%100)%10);
						delay_ms(80);
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
					if(a==0){ //判断单击
						//单击后执行的程序放到此处
							i=601;
							ryear--;
							if(ryear<2000)ryear=2099;
							BUZZER_BEEP1();//响一声
					}
				}
				a=0;c=0; //参数清0
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读触摸按键的电平
				MENU=5;
				rup=1;//调整完时间写入RTC标志位
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C));
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读触摸按键的电平
				MENU=0;
				rup=1;//调整完时间写入RTC标志位
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
			}	
		}

		if(MENU==5){//月设置
			TM1640_display(0,(ryear%100)/10); //年
			TM1640_display(1,(ryear%100)%10);
			TM1640_display(2,21);// -
			i++;
			if(i>600){
				TM1640_display(3,rmon/10);//月调时闪烁
				TM1640_display(4,rmon%10); 		
			}else{
				TM1640_display(3,20);
				TM1640_display(4,20);
			}
			if(i>1200)i=0;
			TM1640_display(5,21);// -
			TM1640_display(6,rday/10);//日
			TM1640_display(7,rday%10);
			TM1640_led(0x00);
		
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){
						i=601;
						rmon++;
						if(rmon>12)rmon=1;
						TM1640_display(3,rmon/10);//月
						TM1640_display(4,rmon%10); 		
						delay_ms(80);
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
					if(a==0){ //判断单击
						//单击后执行的程序放到此处
							i=601;
							rmon++;
							if(rmon>12)rmon=1;
							BUZZER_BEEP1();//响一声
					}
				}
				a=0;c=0; //参数清0
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){
						i=601;
						rmon--;
						if(rmon<1)rmon=12;
						TM1640_display(3,rmon/10);//月
						TM1640_display(4,rmon%10); 		
						delay_ms(80);
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
					if(a==0){ //判断单击
						//单击后执行的程序放到此处
							i=601;
							rmon--;
							if(rmon<1)rmon=12;
							BUZZER_BEEP1();//响一声
					}
				}
				a=0;c=0; //参数清0
			}

			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读触摸按键的电平
				MENU=6;
				rup=1;
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C));
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读触摸按键的电平
				MENU=0;
				rup=1;
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
			}			
		}
			
		if(MENU==6){//日设置
			TM1640_display(0,(ryear%100)/10); //年
			TM1640_display(1,(ryear%100)%10);
			TM1640_display(2,21);// -
			TM1640_display(3,rmon/10);//月
			TM1640_display(4,rmon%10);
			TM1640_display(5,21);// -
			i++;
			if(i>600){
				TM1640_display(6,rday/10);//日调时闪烁
				TM1640_display(7,rday%10);
			}else{
				TM1640_display(6,20);
				TM1640_display(7,20);
			}
			if(i>1200)i=0;
			TM1640_led(0x00);

			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){
						i=601;
						rday++;
						if(rday>31)rday=1;
						TM1640_display(6,rday/10);//日更新显示
						TM1640_display(7,rday%10);
						delay_ms(80);//长按的速度变慢
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
					if(a==0){ //判断单击
						//单击后执行的程序放到此处
							i=601;
							rday++;
							if(rday>31)rday=1;
							BUZZER_BEEP1();//响一声
					}
				}
				a=0;c=0; //参数清0
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){
						i=601;
						rday--;
						if(rday<1)rday=31;
						TM1640_display(6,rday/10);//日更新显示
						TM1640_display(7,rday%10);
						delay_ms(80);
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
					if(a==0){ //判断单击
						//单击后执行的程序放到此处
							i=601;
							rday--;
							if(rday<1)rday=31;
							BUZZER_BEEP1();//响一声
					}
				}
				a=0;c=0; //参数清0
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读触摸按键的电平
				MENU=4;
				rup=1;
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C));
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读触摸按键的电平
				MENU=0;
				rup=1;
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
			}			
		}

		if(MENU==7){//小时设置
			TM1640_display(0,20); //无
			TM1640_display(1,20); //无
			i++;
			if(i>600){
				TM1640_display(2,rhour/10); //时
				TM1640_display(3,rhour%10+10);
			}else{
				TM1640_display(2,20);
				TM1640_display(3,20);
			}
			if(i>1200)i=0;
			TM1640_display(4,rmin/10);	//分
			TM1640_display(5,rmin%10+10);
			TM1640_display(6,rsec/10); //秒
			TM1640_display(7,rsec%10);
			TM1640_led(0x00);
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){
						i=601;
						rhour++;
						if(rhour>23)rhour=0;
						TM1640_display(2,rhour/10); //时
						TM1640_display(3,rhour%10+10);
						delay_ms(80);
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
						if(a==0){ //判断单击
						i=601;
						rhour++;
						if(rhour>23)rhour=0;
						BUZZER_BEEP1();//响一声
					}
				}
				a=0;c=0; //参数清0
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){
						i=601;
						if(rhour==0)rhour=24;
						rhour--;
						TM1640_display(2,rhour/10); //时
						TM1640_display(3,rhour%10+10);
						delay_ms(80);
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
					if(a==0){ //判断单击
						//单击后执行的程序放到此处
						i=601;
						if(rhour==0)rhour=24;
						rhour--;
						BUZZER_BEEP1();//响一声
					}
				}
				a=0;c=0; //参数清0
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读触摸按键的电平
				MENU=8;
				rup=1;
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C));
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读触摸按键的电平
				MENU=1;
				rup=1;
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
			}			
		}
		if(MENU==8){//分钟设置
			TM1640_display(0,20); //无
			TM1640_display(1,20); //无
			TM1640_display(2,rhour/10); //时
			TM1640_display(3,rhour%10+10);
			i++;
			if(i>600){
				TM1640_display(4,rmin/10);	//分
				TM1640_display(5,rmin%10+10);
			}else{
				TM1640_display(4,20);
				TM1640_display(5,20);
			}
			if(i>1200)i=0;
			TM1640_display(6,rsec/10); //秒
			TM1640_display(7,rsec%10);
			TM1640_led(0x00);

			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){
						i=601;
						rmin++;
						if(rmin>59)rmin=0;
						rsec=0;
						TM1640_display(4,rmin/10);	//分
						TM1640_display(5,rmin%10+10);
						delay_ms(80);
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
					if(a==0){ //判断单击
						//单击后执行的程序放到此处
						i=601;
						rmin++;
						if(rmin>59)rmin=0;
						rsec=0;
						BUZZER_BEEP1();//响一声
					}
				}
				a=0;c=0; //参数清0
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){//判断长短键
				while((GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B))&&c<KEYA_SPEED1){ //循环判断长按,到时跳转
					c++;delay_ms(10); //长按判断的计时
				}
				if(c>=KEYA_SPEED1){ //长键处理
					//长按后执行的程序放到此处
					while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){
						i=601;
						if(rmin==0)rmin=60;
						rmin--;
						rsec=0;
						TM1640_display(4,rmin/10);	//分
						TM1640_display(5,rmin%10+10);
						delay_ms(80);
						BUZZER_BEEP1();//响一声
						IWDG_Feed(); //喂狗							
					}
				}else{ //单击处理
					if(a==0){ //判断单击
						//单击后执行的程序放到此处
						i=601;
						if(rmin==0)rmin=60;
						rmin--;
						rsec=0;
						BUZZER_BEEP1();//响一声
					}
				}
				a=0;c=0; //参数清0
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){ //读触摸按键的电平
				MENU=7;
				rup=1;
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C));
			}
			if(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){ //读触摸按键的电平
				MENU=1;
				rup=1;
				BUZZER_BEEP1();//响一声
				while(GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D));
			}			
		}
		IWDG_Feed(); //喂狗
	}
}

	                    				

【项目总结】

1、后期可以加入闹钟功能

2、时间的修改可以用红外接收模式

【相关资料】

最后分享程序的源文件、支架stl文件、亚克力加工图

附件 附件
Makelog作者原创文章,未经授权禁止转载。
4
2
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
|
[[c.comment_content]]