From 5f46bfa7ba00832c92eab1317645ce9efc437131 Mon Sep 17 00:00:00 2001 From: phej4ytm7 <2933004278@qq.com> Date: Sun, 22 Dec 2024 23:17:05 +0800 Subject: [PATCH] ADD file via upload --- main.c | 380 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) create mode 100644 main.c diff --git a/main.c b/main.c new file mode 100644 index 0000000..90057eb --- /dev/null +++ b/main.c @@ -0,0 +1,380 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "tim.h" +#include "gpio.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include "OLED.h" +#include "rtc.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +uint8_t show; +uint8_t key; +uint8_t a_hour = 7,a_min = 0,a_sec = 0; +uint8_t alarm_flag = 0; +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ +void main_sc(void) //主界面 +{ + OLED_Clear(); + OLED_ShowString(2,4," - -"); + OLED_ShowString(3,5," : :"); +} + +uint8_t key_scan(void) //检测按键 +{ + uint8_t keynum = 0; + if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)) + { + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); + HAL_Delay(20); + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); + while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)); + HAL_Delay(10); + keynum = 1; + } + else if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)) + { + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); + HAL_Delay(20); + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); + while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13)); + HAL_Delay(10); + keynum = 2; + } + else if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)) + { + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); + HAL_Delay(20); + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); + while(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)); + HAL_Delay(10); + keynum = 3; + } + return keynum; +} + +void set_time(void) //设置时间 +{ + uint8_t set_s = 0; + OLED_Clear(); + OLED_ShowString(1,1," Set Time"); + OLED_ShowString(2,4," - -"); + OLED_ShowString(3,5," : :"); + while(1) + { + if(show) + { + switch(set_s) + { + case 0:OLED_ShowString(2,4," ");break; + case 1:OLED_ShowString(2,9," ");break; + case 2:OLED_ShowString(2,12," ");break; + case 3:OLED_ShowString(3,5," ");break; + case 4:OLED_ShowString(3,8," ");break; + case 5:OLED_ShowString(3,11," ");break; + } + } + else + { + OLED_ShowLengthNum(2,4,calendar.year,4); + OLED_ShowLengthNum(2,9,calendar.month,2); + OLED_ShowLengthNum(2,12,calendar.date,2); + OLED_ShowLengthNum(3,5,calendar.hour,2); + OLED_ShowLengthNum(3,8,calendar.min,2); + OLED_ShowLengthNum(3,11,calendar.sec,2); + } + key = key_scan(); + if(key == 1) + { + set_s++; + if(set_s > 5) + { + rtc_set_time(calendar.year,calendar.month,calendar.date,calendar.hour,calendar.min,calendar.sec); + break; + } + } + else if(key == 2) + { + switch(set_s) + { + case 0:calendar.year--;break; + case 1:if(calendar.month > 1) calendar.month--;break; + case 2:if(calendar.date > 1) calendar.date--;break; + case 3:if(calendar.hour > 0) calendar.hour--;break; + case 4:if(calendar.min > 0) calendar.min--;break; + case 5:if(calendar.sec > 0) calendar.sec--;break; + } + } + else if(key == 3) + { + switch(set_s) + { + case 0:calendar.year++;break; + case 1:if(calendar.month < 12) calendar.month++;break; + case 2:if(calendar.date < 31) calendar.date++;break; + case 3:if(calendar.hour < 23) calendar.hour++;break; + case 4:if(calendar.min < 59) calendar.min++;break; + case 5:if(calendar.sec < 59) calendar.sec++;break; + } + } + } +} + +void set_alarm(void) //设置闹钟 +{ + uint8_t set_s = 0; + OLED_Clear(); + OLED_ShowString(1,1," Set Alarm"); + OLED_ShowString(3,5," : :"); + while(1) + { + if(show) + { + switch(set_s) + { + case 0:OLED_ShowString(3,5," ");break; + case 1:OLED_ShowString(3,8," ");break; + case 2:OLED_ShowString(3,11," ");break; + } + } + else + { + OLED_ShowLengthNum(3,5,a_hour,2); + OLED_ShowLengthNum(3,8,a_min,2); + OLED_ShowLengthNum(3,11,a_sec,2); + } + key = key_scan(); + if(key == 1) + { + set_s++; + if(set_s > 2) break; + } + else if(key == 2) + { + switch(set_s) + { + case 0:if(a_hour > 0) a_hour--;break; + case 1:if(a_min > 0) a_min--;break; + case 2:if(a_sec > 0) a_sec--;break; + } + } + else if(key == 3) + { + switch(set_s) + { + case 0:if(a_hour < 23) a_hour++;break; + case 1:if(a_min < 59) a_min++;break; + case 2:if(a_sec < 59) a_sec++;break; + } + } + } +} + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_TIM2_Init(); + /* USER CODE BEGIN 2 */ + OLED_Init(); + rtc_init(); + rtc_set_time(2024, 12, 20, 12, 0, 0); //初始时间 + main_sc(); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + //读取和显示时间 + rtc_get_time(); + OLED_ShowLengthNum(2,4,calendar.year,4); + OLED_ShowLengthNum(2,9,calendar.month,2); + OLED_ShowLengthNum(2,12,calendar.date,2); + OLED_ShowLengthNum(3,5,calendar.hour,2); + OLED_ShowLengthNum(3,8,calendar.min,2); + OLED_ShowLengthNum(3,11,calendar.sec,2); + key = key_scan(); + if(key == 1) //设置时间 + { + set_time(); + main_sc(); + } + else if(key == 2) //设置闹钟 + { + set_alarm(); + main_sc(); + } + else if(key == 3) //关闭闹钟响声 + { + alarm_flag = 0; + HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); + } + //闹钟时间到 + if(calendar.hour == a_hour && calendar.min == a_min && calendar.sec == a_sec) + alarm_flag = 1; + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + +/* USER CODE BEGIN 4 */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + static uint16_t cnt = 0; + if(htim->Instance == TIM2) + { + cnt++; + if(cnt >= 500) + { + cnt = 0; + show = !show; + if(alarm_flag) HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0); + } + } +} +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */