找回密码
 立即注册
查看: 37|回复: 1

这个RTC的时分秒有没有办法改变,按键里面的修改不了

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-04-25 17:31:15

11

主题

21

回帖

101

积分

注册会员

积分
101
发表于 2026-4-21 17:09:49 | 显示全部楼层 |阅读模式

//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: main.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2026-04-21) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>

#include "config.h" //默认已包含stdio.h、intrins.h等头文件

//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
#include "smg.h"
//<<AICUBE_USER_INCLUDE_END>>

//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
void Smg_X(void);
void F54(void);
void KEY(void);
uint8_t keynum = 0;
//<<AICUBE_USER_GLOBAL_DEFINE_END>>

////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码
uint8_t i = 0;
//<<AICUBE_USER_MAIN_INITIAL_END>>

SYS_Init();

//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码  
//<<AICUBE_USER_MAIN_CODE_END>>

while (1)
{
    //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
    // 在此添加主函数中用户主循环代码  
    Smg_X();
    P7 = SMG_weishu[i];
    P6 = SMG_shuzi[SMG_H[i]];
    delay_ms(1);
    i++;
    if(i > 7)
        i = 0;
    keynum++;
    if(keynum > 155)
        keynum = 0;
    KEY();
    //<<AICUBE_USER_MAIN_LOOP_END>>
}

}

void KEY(void)//非阻塞按键
{
static uint8_t i = 0;
switch(i)
{
case 0:
if((P32 == 0)||(P33 == 0)||(P34 == 0)||(P35 == 0))
{
keynum = 0;
i = 1;
}
break;
case 1:
if(keynum > 9)
if((P32 == 0)||(P33 == 0)||(P34 == 0)||(P35 == 0))
{
i = 2;
}
else
{
i = 0;
}
break;
case 2:
{
if(P32 == 0)
RTCHOUR += 10;
else if(P33 == 0)
RTCHOUR -= 10;
else if(P34 == 0)
RTC_SetHour(RTCHOUR + 10);
else if(P35 == 0)
RTC_SetHour(RTCHOUR - 10);
i = 0;
break;
}
}
}

void Smg_X(void)
{
SMG_H[0] = RTCHOUR/10%10;
SMG_H[1] = RTCHOUR%10;

SMG_H[3] = RTCMIN/10%10;
SMG_H[4] = RTCMIN%10;

SMG_H[6] = RTCSEC/10%10;
SMG_H[7] = RTCSEC%10;

}

////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
AccessCodeFastest(); //设置最快速度访问程序代码
AccessIXramFastest(); //设置最快速度访问内部XDATA
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基

//<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
// 在此添加用户预初始化代码  
//<<AICUBE_USER_PREINITIAL_CODE_END>>

PORT1_Init();                       //P1口初始化
PORT3_Init();                       //P3口初始化
PORT4_Init();                       //P4口初始化
PORT5_Init();                       //P5口初始化
PORT6_Init();                       //P6口初始化
PORT7_Init();                       //P7口初始化
CLK_Init();                         //时钟模块初始化
RTC_Init();                         //RTC初始化
delay_ms(1);
USBLIB_Init();                      //USB库初始化
delay_ms(1);

//<<AICUBE_USER_INITIAL_CODE_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_INITIAL_CODE_END>>

EnableGlobalInt();                  //使能全局中断

}

////////////////////////////////////////
// 微秒延时函数
// 入口参数: us (设置延时的微秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_us(uint16_t us)
{
do
{
NOP(18); //(MAIN_Fosc + 500000) / 1000000 - 6
} while (--us);
}

////////////////////////////////////////
// 毫秒延时函数
// 入口参数: ms (设置延时的毫秒值)
// 函数返回: 无
////////////////////////////////////////
void delay_ms(uint16_t ms)
{
uint16_t i;

do
{
    i = MAIN_Fosc / 6000;
    while (--i);
} while (--ms);

}

////////////////////////////////////////
// P1口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT1_Init(void)
{
SetP1nInitLevelHigh(PIN_ALL); //设置P1初始化电平
SetP1nQuasiMode(PIN_5 | PIN_4 | PIN_3 | PIN_2 | PIN_1 | PIN_0); //设置P1.5,P1.4,P1.3,P1.2,P1.1,P1.0为准双向口模式
SetP1nHighZInputMode(PIN_7 | PIN_6); //设置P1.7,P1.6为高阻输入模式

DisableP1nPullUp(PIN_ALL);          //关闭P1内部上拉电阻
EnableP1nSchmitt(PIN_ALL);          //使能P1施密特触发
SetP1nSlewRateNormal(PIN_ALL);      //设置P1一般翻转速度
SetP1nDrivingNormal(PIN_ALL);       //设置P1一般驱动能力
SetP1nDigitalInput(PIN_5 | PIN_4 | PIN_3 | PIN_2 | PIN_1 | PIN_0); //使能P1.5,P1.4,P1.3,P1.2,P1.1,P1.0数字信号输入功能
SetP1nAnalogInput(PIN_7 | PIN_6);   //使能P1.7,P1.6模拟信号输入功能

//<<AICUBE_USER_PORT1_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT1_INITIAL_END>>

}

////////////////////////////////////////
// P3口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT3_Init(void)
{
SetP3nInitLevelHigh(PIN_ALL); //设置P3初始化电平
SetP3nQuasiMode(PIN_7 | PIN_6 | PIN_5 | PIN_4 | PIN_3 | PIN_2); //设置P3.7,P3.6,P3.5,P3.4,P3.3,P3.2为准双向口模式
SetP3nHighZInputMode(PIN_1 | PIN_0); //设置P3.1,P3.0为高阻输入模式

EnableP3nPullUp(PIN_5 | PIN_4 | PIN_3 | PIN_2); //使能P3.5,P3.4,P3.3,P3.2内部上拉电阻
DisableP3nPullUp(PIN_7 | PIN_6 | PIN_1 | PIN_0); //关闭P3.7,P3.6,P3.1,P3.0内部上拉电阻
EnableP3nSchmitt(PIN_ALL);          //使能P3施密特触发
SetP3nSlewRateNormal(PIN_ALL);      //设置P3一般翻转速度
SetP3nDrivingNormal(PIN_ALL);       //设置P3一般驱动能力
SetP3nDigitalInput(PIN_ALL);        //使能P3数字信号输入功能

//<<AICUBE_USER_PORT3_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT3_INITIAL_END>>

}

////////////////////////////////////////
// P4口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT4_Init(void)
{
SetP4nInitLevelHigh(PIN_ALL); //设置P4初始化电平
SetP4nQuasiMode(PIN_ALL); //设置P4为准双向口模式

DisableP4nPullUp(PIN_ALL);          //关闭P4内部上拉电阻
EnableP4nSchmitt(PIN_ALL);          //使能P4施密特触发
SetP4nSlewRateNormal(PIN_ALL);      //设置P4一般翻转速度
SetP4nDrivingNormal(PIN_ALL);       //设置P4一般驱动能力
SetP4nDigitalInput(PIN_ALL);        //使能P4数字信号输入功能

//<<AICUBE_USER_PORT4_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT4_INITIAL_END>>

}

////////////////////////////////////////
// P5口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT5_Init(void)
{
SetP5nInitLevelHigh(PIN_ALL); //设置P5初始化电平
SetP5nQuasiMode(PIN_ALL); //设置P5为准双向口模式

DisableP5nPullUp(PIN_ALL);          //关闭P5内部上拉电阻
EnableP5nSchmitt(PIN_ALL);          //使能P5施密特触发
SetP5nSlewRateNormal(PIN_ALL);      //设置P5一般翻转速度
SetP5nDrivingNormal(PIN_ALL);       //设置P5一般驱动能力
SetP5nDigitalInput(PIN_ALL);        //使能P5数字信号输入功能

//<<AICUBE_USER_PORT5_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT5_INITIAL_END>>

}

////////////////////////////////////////
// P6口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT6_Init(void)
{
SetP6nInitLevelHigh(PIN_ALL); //设置P6初始化电平
SetP6nQuasiMode(PIN_ALL); //设置P6为准双向口模式

DisableP6nPullUp(PIN_ALL);          //关闭P6内部上拉电阻
EnableP6nSchmitt(PIN_ALL);          //使能P6施密特触发
SetP6nSlewRateNormal(PIN_ALL);      //设置P6一般翻转速度
SetP6nDrivingNormal(PIN_ALL);       //设置P6一般驱动能力
SetP6nDigitalInput(PIN_ALL);        //使能P6数字信号输入功能

//<<AICUBE_USER_PORT6_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT6_INITIAL_END>>

}

////////////////////////////////////////
// P7口初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void PORT7_Init(void)
{
SetP7nInitLevelHigh(PIN_ALL); //设置P7初始化电平
SetP7nQuasiMode(PIN_ALL); //设置P7为准双向口模式

DisableP7nPullUp(PIN_ALL);          //关闭P7内部上拉电阻
EnableP7nSchmitt(PIN_ALL);          //使能P7施密特触发
SetP7nSlewRateNormal(PIN_ALL);      //设置P7一般翻转速度
SetP7nDrivingNormal(PIN_ALL);       //设置P7一般驱动能力
SetP7nDigitalInput(PIN_ALL);        //使能P7数字信号输入功能

//<<AICUBE_USER_PORT7_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_PORT7_INITIAL_END>>

}

////////////////////////////////////////
// 时钟初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CLK_Init(void)
{
CLK_HSIOCK_Divider(1); //设置高速外设时钟预分频系数

CLK_X32K_Enable();                  //启动外部32768晶振
CLK_X32K_FullGain();                //振荡器高增益
CLK_X32K_WaitStable();              //等待振荡器稳定

CLK_SYSCLK_Divider(10);             //切换主时钟前先将系统时钟降频

HIRC_24M();                         //选择内部预置的频率

CLK_MCLK_HIRC();                    //选择内部高精度HIRC作为主时钟
CLK_MCLK2_BYPASS();                 //旁路MCLK2,直接使用MCLK选择

CLK_SYSCLK_Divider(1);              //设置系统时钟分频系数

CLK_HSIOCK_MCLK();                  //选择MCLK主时钟作为高速外设时钟源

//<<AICUBE_USER_CLOCK_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_CLOCK_INITIAL_END>>

}

////////////////////////////////////////
// RTC初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void RTC_Init(void)
{
RTC_CLK_X32K(); //RTC使用外部32768当作时钟源

RTC_SetAlarmHour(16);               //设置RTC闹钟的小时
RTC_SetAlarmMinute(0);              //设置RTC闹钟的分钟
RTC_SetAlarmSecond(5);              //设置RTC闹钟的秒
RTC_SetAlarmSSecond(0);             //初始化RTC闹钟的次秒

RTC_SetYear(26);                    //设置RTC的年
RTC_SetMonth(4);                    //设置RTC的月
RTC_SetDay(21);                     //设置RTC的日
RTC_SetHour(16);                    //设置RTC的小时
RTC_SetMinute(0);                   //设置RTC的分钟
RTC_SetSecond(0);                   //设置RTC的秒
RTC_SetSSecond(0);                  //初始化RTC的次秒

RTC_Run();                          //启动RTC
RTC_SyncInitial();                  //同步RTC的初始值
while (RTC_IsSyncing());            //等待同步完成

RTC_SetIntPriority(0);              //设置中断为最低优先级
RTC_EnableAlarmInt();               //使能RTC闹钟中断
RTC_EnableSecondInt();              //使能RTC秒中断

//<<AICUBE_USER_RTC_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_RTC_INITIAL_END>>

}

////////////////////////////////////////
// USB库初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_Init(void)
{
usb_init(); //初始化USB模块
USB_SetIntPriority(0); //设置中断为最低优先级
set_usb_OUT_callback(USBLIB_OUT_Callback); //设置USB中断回调函数
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令

//<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
// 在此添加用户初始化代码  
//<<AICUBE_USER_USBLIB_INITIAL_END>>

}

////////////////////////////////////////
// 等待USB配置完成函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void USBLIB_WaitConfiged(void)
{
while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置
WDT_Clear(); //清看门狗定时器 (防止硬件自动使能看门狗)
}

////////////////////////////////////////
// USB设备接收数据中断回调程序
// 入口参数: 无
// 函数返回: 无
// OutNumber:USB设备接收到的数据长度
// UsbOutBuffer:保存USB设备接收到的数据
////////////////////////////////////////
void USBLIB_OUT_Callback(void)
{
//<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>>
// 在此添加中断函数用户代码
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试
// 在此处添加用户处理接收数据的代码
//<<AICUBE_USER_USBLIB_ISR_CODE1_END>>
}

////////////////////////////////////////
// RTC中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void RTC_ISR(void) interrupt RTC_VECTOR
{
//<<AICUBE_USER_RTC_ISR_CODE1_BEGIN>>
// 在此添加中断函数用户代码
if (RTC_CheckAlarmFlag()) //判断是否是RTC闹钟中断
{
RTC_ClearAlarmFlag(); //清除中断请求标志位
F54();
}

if (RTC_CheckSecondFlag())          //判断是否是RTC秒中断
{
    RTC_ClearSecondFlag();          //清除中断请求标志位
  
}
//<<AICUBE_USER_RTC_ISR_CODE1_END>>

}

//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
void F54(void)
{
P54 = 0;
delay_ms(5);
P54 = 1;
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-21 17:49:49 | 显示全部楼层
中途修改RTC时钟,可参考实验箱例程包里面的RTC例子,修改完RTC时钟配置寄存器后,要触发RTC寄存器初始化:
  1. void WriteRTC(void)
  2. {
  3.     INIYEAR = RTCYEAR;   //继承当前年月日
  4.     INIMONTH = RTCMONTH;
  5.     INIDAY = RTCDAY;
  6.     INIHOUR = hour;   //修改时分秒
  7.     INIMIN = minute;
  8.     INISEC = 0;
  9.     INISSEC = 0;
  10.     RTCCFG |= 0x01;   //触发RTC寄存器初始化
  11. }
复制代码
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 10:31 , Processed in 0.123274 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表