回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

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

头像 阿偶 2020.11.26 1701 2

【项目介绍】

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

project-image

【功能介绍】:

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

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

3.时间模式:24小时制

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

5.显示模式:动态扫描

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

步骤1 所需元器件

材料清单

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

步骤2 电路图

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

project-image

步骤3 硬件连接

主控板:

project-image

数码管驱动板正面:

project-image

数码管驱动板背面:

project-image

8个数码管拼装:

project-image
project-image
project-image

上电:

project-image

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

project-image
project-image
project-image

上视频:

代码
/*********************************************************************************************
程序名:	数码管时钟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文件、亚克力加工图

附件

评论

user-avatar
  • rzegkly

    rzegkly2021.01.08

    3D打印和电子结合,好好学习

    0
    • hnqylgq

      hnqylgq2020.12.04

      这是我到目前为止见过焊的最好的洞洞板,厉害!

      0