参考程序:
以下是基于Proteus+Keil+STM32CubeMX的嵌入式闹钟实验的参考程序,供参考学习:
1. main.c
```c
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "OLED.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Private variables ---------------------------------------------------------*/
RTC_HandleTypeDef hrtc;
TIM_HandleTypeDef htim3;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM3_Init(void);
static void MX_RTC_Init(void);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
void get_time(uint8_t time[]);
void update_time(void);
void update_alarm(void);
void alarm(void);
void RTC_IRQHandler(void);
/* Private variables ---------------------------------------------------------*/
char buffer[20];
uint8_t time_now[6] = {0};
uint8_t time_set[6] = {0};
uint8_t i = 0, j = 0;
uint8_t curr_val = 0, prev_val = 0;
/* Private function definitions ----------------------------------------------*/
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* MCU Configuration--------------------------------------------------------*/
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM3_Init();
MX_RTC_Init();
OLED_Init();
/* Start the TIM3 timer */
HAL_TIM_Base_Start_IT(&htim3);
/* Infinite loop */
while (1)
{
get_time(time_now); // 获取当前时间
update_time(); // 更新显示时间
update_alarm(); // 更新闹钟时间
curr_val = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
if(curr_val == GPIO_PIN_RESET && prev_val == GPIO_PIN_SET) { // PA1键按下
HAL_Delay(10);
curr_val = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
if(curr_val == GPIO_PIN_RESET) {
i = (i + 1) % 6; // 逐个修改时分秒
time_now[i] = (time_now[i] + 1) % ((i == 0 ? 24 : 60));
}
}
prev_val = curr_val;
curr_val = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2);
if(curr_val == GPIO_PIN_RESET && prev_val == GPIO_PIN_SET) { // PA2键按下
memcpy(time_set, time_now, sizeof(time_set)); // 闹钟时间设为当前时间
}
prev_val = curr_val;
curr_val = HAL_GPIO_ReadPin