金子涵778 2024-07-16 17:07 采纳率: 75%
浏览 240

stm32RTC时钟想加入通过按键修改时间的功能

#include "sys.h"       // 包含系统头文件
#include "usart.h"     // 包含串口通信头文件
#include "delay.h"     // 包含延时函数头文件
#include "led.h"       // 包含LED控制头文件
#include "beep.h"      // 包含蜂鸣器控制头文件
#include "lcd.h"       // 包含LCD显示头文件
#include "usmart.h"    // 包含USMART调试头文件
#include "rtc.h"       // 包含RTC实时时钟头文件int main(void)
{
    u8 t = 0;           // 计时变量t,用于定时器
    u8 cnt = 0;         // 计数变量cnt,用于蜂鸣器控制
    char tbuf[40];      // 字符数组,用于存储时间和日期字符串

    RTC_TimeTypeDef RTC_TimeStruct;   // RTC时间结构体变量
    RTC_DateTypeDef RTC_DateStruct;   // RTC日期结构体变量

    HAL_Init();                      // 初始化硬件抽象层HAL
    SystemClock_Config();            // 配置系统时钟
    delay_init(80);                  // 初始化延时函数,时钟频率为80MHz
    uart_init(115200);               // 初始化串口通信,波特率115200
    usmart_dev.init(80);             // 初始化USMART调试功能,时钟频率80MHz

    LED_Init();                      // 初始化LED
    BEEP_Init();                     // 初始化蜂鸣器
    LCD_Init();                      // 初始化LCD
    RTC_Init();                      // 初始化RTC实时时钟
RTC_Set_WakeUp(RTC_WAKEUPCLOCK_CK_SPRE_16BITS, 0);  
// 设置RTC唤醒功能,时钟周期16位定时器

    POINT_COLOR = RED;               // 设置画笔颜色为红色
Display_ALIENTEK_LOGO(0, 0);    
 // 显示ALIENTEK的LOGO图案在LCD上
LCD_ShowString(30, 95, 200, 16, 16, "Pandora STM32L4 IOT"); 
 // 在LCD上显示字符串
LCD_ShowString(30, 115, 200, 16, 16, "RTC TEST");            
 // 在LCD上显示字符串
LCD_ShowString(30, 135, 200, 16, 16, "ATOM@ALIENTEK");       
 // 在LCD上显示字符串
LCD_ShowString(30, 155, 200, 16, 16, "2018/10/27");         
  // 在LCD上显示字符串
    POINT_COLOR = BLUE;              // 设置画笔颜色为蓝色

    while(1)
    {
        t++;                         // 计时器递增

        if((t % 10) == 0)            // 每10个计时单位执行一次
        {
            HAL_RTC_GetTime(&RTC_Handler, &RTC_TimeStruct, RTC_FORMAT_BIN);  // 获取当前RTC时间
            sprintf((char*)tbuf, "Time:%02d:%02d:%02d", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds); 
 // 格式化时间字符串
            LCD_ShowString(30, 175, 210, 16, 16, tbuf);    
// 在LCD上显示时间字符串
            HAL_RTC_GetDate(&RTC_Handler, &RTC_DateStruct, RTC_FORMAT_BIN);  
// 获取当前RTC日期
            sprintf((char*)tbuf, "Date:20%02d-%02d-%02d", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date); 
 // 格式化日期字符串
            LCD_ShowString(30, 195, 210, 16, 16, tbuf);   
 // 在LCD上显示日期字符串
            sprintf((char*)tbuf, "Week:%d", RTC_DateStruct.WeekDay);  
// 格式化星期字符串
            LCD_ShowString(30, 215, 210, 16, 16, tbuf);   
 // 在LCD上显示星期字符串
        }

        if( BEEP_Read )               // 如果蜂鸣器处于开启状态
        {
            cnt++;                    // 计数器递增
            if(cnt >= 100) {            // 如果计数超过或等于100
                BEEP(0);             // 关闭蜂鸣器
                cnt = 0;               // 计数器清零
            }
        }

        if((t % 20) == 0)                // 每20个计时单位执行一次
            LED_R_TogglePin;         // 红色LED翻转状态

        delay_ms(10);                 // 延时10毫秒
    }
}

请加入一段代码使其能通过按键修改时间

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-07-16 17:09
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    好的,为了实现通过按键修改RTC时间的功能,我们需要在代码中加入按键检测和时间修改的逻辑。以下是详细的解决方案:

    1. 按键初始化和检测

    首先,我们需要初始化按键,并在主循环中检测按键是否被按下。假设我们使用一个按键来触发时间修改功能,按键连接到STM32的某个GPIO引脚。

    按键初始化代码

    #include "key.h"  // 包含按键控制头文件
    
    void KEY_Init(void)
    {
        GPIO_InitTypeDef GPIO_Initure;
    
        __HAL_RCC_GPIOA_CLK_ENABLE();  // 使能GPIOA时钟
    
        GPIO_Initure.Pin = GPIO_PIN_0;  // 假设按键连接到PA0
        GPIO_Initure.Mode = GPIO_MODE_INPUT;  // 输入模式
        GPIO_Initure.Pull = GPIO_PULLUP;  // 上拉
        GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;  // 高速
        HAL_GPIO_Init(GPIOA, &GPIO_Initure);
    }
    

    按键检测代码

    在主循环中加入按键检测逻辑:

    #define KEY_PRESS HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET
    
    void CheckKeyPress(void)
    {
        if (KEY_PRESS)
        {
            // 按键被按下,进入时间修改模式
            ModifyRTC();
        }
    }
    

    2. 时间修改功能

    当按键被按下时,调用ModifyRTC函数进入时间修改模式。在这个函数中,我们可以通过LCD显示当前时间,并允许用户通过按键增加或减少时间。

    时间修改函数

    void ModifyRTC(void)
    {
        u8 mode = 0;  // 修改模式:0-小时,1-分钟,2-秒
        u8 modified = 0;  // 是否已修改标志
    
        while (!modified)
        {
            HAL_RTC_GetTime(&RTC_Handler, &RTC_TimeStruct, RTC_FORMAT_BIN);  // 获取当前时间
            sprintf((char*)tbuf, "Modify Time: %02d:%02d:%02d", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
            LCD_ShowString(30, 235, 210, 16, 16, tbuf);  // 显示当前时间
    
            // 检测按键操作
            if (KEY_PRESS)
            {
                delay_ms(20);  // 消抖
                if (KEY_PRESS)
                {
                    // 按键长按逻辑
                    while (KEY_PRESS);  // 等待按键释放
    
                    // 修改时间
                    switch (mode)
                    {
                        case 0:  // 修改小时
                            RTC_TimeStruct.Hours = (RTC_TimeStruct.Hours + 1) % 24;
                            break;
                        case 1:  // 修改分钟
                            RTC_TimeStruct.Minutes = (RTC_TimeStruct.Minutes + 1) % 60;
                            break;
                        case 2:  // 修改秒
                            RTC_TimeStruct.Seconds = (RTC_TimeStruct.Seconds + 1) % 60;
                            break;
                    }
    
                    // 更新RTC时间
                    HAL_RTC_SetTime(&RTC_Handler, &RTC_TimeStruct, RTC_FORMAT_BIN);
    
                    // 切换到下一个修改模式
                    mode = (mode + 1) % 3;
                }
            }
    
            // 检测确认按键
            if (KEY_PRESS)
            {
                delay_ms(20);  // 消抖
                if (KEY_PRESS)
                {
                    // 确认修改
                    modified = 1;
                    while (KEY_PRESS);  // 等待按键释放
                }
            }
    
            delay_ms(10);  // 延时
        }
    }
    

    3. 主函数修改

    在主函数中调用按键初始化和检测函数:

    int main(void)
    {
        // 初始化代码...
    
        KEY_Init();  // 初始化按键
    
        while(1)
        {
            // 主循环代码...
    
            CheckKeyPress();  // 检测按键
    
            delay_ms(10);  // 延时
        }
    }
    

    总结

    通过上述修改,我们实现了通过按键修改RTC时间的功能。用户可以通过按键进入时间修改模式,并通过按键增加或减少小时、分钟和秒。确认按键用于保存修改并退出修改模式。希望这个解决方案能满足您的需求。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    评论

报告相同问题?

问题事件

  • 创建了问题 7月16日