这个RTC的时分秒有没有办法改变,按键里面的修改不了
<p>//<<AICUBE_USER_HEADER_REMARK_BEGIN>><br />////////////////////////////////////////<br />
// 在此添加用户文件头说明信息<br />
// 文件名称: main.c<br />
// 文件描述:<br />
// 文件版本: V1.0<br />
// 修改记录:<br />
// 1. (2026-04-21) 创建文件<br />
////////////////////////////////////////<br />
//<<AICUBE_USER_HEADER_REMARK_END>></p>
<p>#include "config.h" //默认已包含stdio.h、intrins.h等头文件</p>
<p>//<<AICUBE_USER_INCLUDE_BEGIN>><br />
// 在此添加用户头文件包含<br />
#include "smg.h"<br />
//<<AICUBE_USER_INCLUDE_END>></p>
<p>//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>><br />
// 在此添加用户全局变量定义、用户宏定义以及函数声明<br />
void Smg_X(void);<br />
void F54(void);<br />
void KEY(void);<br />
uint8_t keynum = 0;<br />
//<<AICUBE_USER_GLOBAL_DEFINE_END>></p>
<p>////////////////////////////////////////<br />
// 项目主函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void main(void)<br />
{<br />
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>><br />
// 在此添加用户主函数初始化代码<br />
uint8_t i = 0;<br />
//<<AICUBE_USER_MAIN_INITIAL_END>></p>
<pre><code>SYS_Init();
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码
//<<AICUBE_USER_MAIN_CODE_END>>
while (1)
{
//<<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 在此添加主函数中用户主循环代码
Smg_X();
P7 = SMG_weishu;
P6 = SMG_shuzi];
delay_ms(1);
i++;
if(i > 7)
i = 0;
keynum++;
if(keynum > 155)
keynum = 0;
KEY();
//<<AICUBE_USER_MAIN_LOOP_END>>
}
</code></pre>
<p>}</p>
<p>void KEY(void)//非阻塞按键<br />
{<br />
static uint8_t i = 0;<br />
switch(i)<br />
{<br />
case 0:<br />
if((P32 == 0)||(P33 == 0)||(P34 == 0)||(P35 == 0))<br />
{<br />
keynum = 0;<br />
i = 1;<br />
}<br />
break;<br />
case 1:<br />
if(keynum > 9)<br />
if((P32 == 0)||(P33 == 0)||(P34 == 0)||(P35 == 0))<br />
{<br />
i = 2;<br />
}<br />
else<br />
{<br />
i = 0;<br />
}<br />
break;<br />
case 2:<br />
{<br />
if(P32 == 0)<br />
RTCHOUR += 10;<br />
else if(P33 == 0)<br />
RTCHOUR -= 10;<br />
else if(P34 == 0)<br />
RTC_SetHour(RTCHOUR + 10);<br />
else if(P35 == 0)<br />
RTC_SetHour(RTCHOUR - 10);<br />
i = 0;<br />
break;<br />
}<br />
}<br />
}</p>
<p>void Smg_X(void)<br />
{<br />
SMG_H = RTCHOUR/10%10;<br />
SMG_H = RTCHOUR%10;</p>
<pre><code>SMG_H = RTCMIN/10%10;
SMG_H = RTCMIN%10;
SMG_H = RTCSEC/10%10;
SMG_H = RTCSEC%10;
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 系统初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void SYS_Init(void)<br />
{<br />
EnableAccessXFR(); //使能访问扩展XFR<br />
AccessCodeFastest(); //设置最快速度访问程序代码<br />
AccessIXramFastest(); //设置最快速度访问内部XDATA<br />
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基</p>
<pre><code>//<<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(); //使能全局中断
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 微秒延时函数<br />
// 入口参数: us (设置延时的微秒值)<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void delay_us(uint16_t us)<br />
{<br />
do<br />
{<br />
NOP(18); //(MAIN_Fosc + 500000) / 1000000 - 6<br />
} while (--us);<br />
}</p>
<p>////////////////////////////////////////<br />
// 毫秒延时函数<br />
// 入口参数: ms (设置延时的毫秒值)<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void delay_ms(uint16_t ms)<br />
{<br />
uint16_t i;</p>
<pre><code>do
{
i = MAIN_Fosc / 6000;
while (--i);
} while (--ms);
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P1口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT1_Init(void)<br />
{<br />
SetP1nInitLevelHigh(PIN_ALL); //设置P1初始化电平<br />
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为准双向口模式<br />
SetP1nHighZInputMode(PIN_7 | PIN_6); //设置P1.7,P1.6为高阻输入模式</p>
<pre><code>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>>
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P3口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT3_Init(void)<br />
{<br />
SetP3nInitLevelHigh(PIN_ALL); //设置P3初始化电平<br />
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为准双向口模式<br />
SetP3nHighZInputMode(PIN_1 | PIN_0); //设置P3.1,P3.0为高阻输入模式</p>
<pre><code>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>>
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P4口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT4_Init(void)<br />
{<br />
SetP4nInitLevelHigh(PIN_ALL); //设置P4初始化电平<br />
SetP4nQuasiMode(PIN_ALL); //设置P4为准双向口模式</p>
<pre><code>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>>
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P5口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT5_Init(void)<br />
{<br />
SetP5nInitLevelHigh(PIN_ALL); //设置P5初始化电平<br />
SetP5nQuasiMode(PIN_ALL); //设置P5为准双向口模式</p>
<pre><code>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>>
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P6口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT6_Init(void)<br />
{<br />
SetP6nInitLevelHigh(PIN_ALL); //设置P6初始化电平<br />
SetP6nQuasiMode(PIN_ALL); //设置P6为准双向口模式</p>
<pre><code>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>>
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// P7口初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void PORT7_Init(void)<br />
{<br />
SetP7nInitLevelHigh(PIN_ALL); //设置P7初始化电平<br />
SetP7nQuasiMode(PIN_ALL); //设置P7为准双向口模式</p>
<pre><code>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>>
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 时钟初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void CLK_Init(void)<br />
{<br />
CLK_HSIOCK_Divider(1); //设置高速外设时钟预分频系数</p>
<pre><code>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>>
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// RTC初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void RTC_Init(void)<br />
{<br />
RTC_CLK_X32K(); //RTC使用外部32768当作时钟源</p>
<pre><code>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>>
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// USB库初始化函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void USBLIB_Init(void)<br />
{<br />
usb_init(); //初始化USB模块<br />
USB_SetIntPriority(0); //设置中断为最低优先级<br />
set_usb_OUT_callback(USBLIB_OUT_Callback); //设置USB中断回调函数<br />
set_usb_ispcmd("@STCISP#"); //设置USB不停电下载命令</p>
<pre><code>//<<AICUBE_USER_USBLIB_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_USBLIB_INITIAL_END>>
</code></pre>
<p>}</p>
<p>////////////////////////////////////////<br />
// 等待USB配置完成函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void USBLIB_WaitConfiged(void)<br />
{<br />
while (DeviceState != DEVSTATE_CONFIGURED) //等待USB完成配置<br />
WDT_Clear(); //清看门狗定时器 (防止硬件自动使能看门狗)<br />
}</p>
<p>////////////////////////////////////////<br />
// USB设备接收数据中断回调程序<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
// OutNumber:USB设备接收到的数据长度<br />
// UsbOutBuffer:保存USB设备接收到的数据<br />
////////////////////////////////////////<br />
void USBLIB_OUT_Callback(void)<br />
{<br />
//<<AICUBE_USER_USBLIB_ISR_CODE1_BEGIN>><br />
// 在此添加中断函数用户代码<br />
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试<br />
// 在此处添加用户处理接收数据的代码<br />
//<<AICUBE_USER_USBLIB_ISR_CODE1_END>><br />
}</p>
<p>////////////////////////////////////////<br />
// RTC中断服务程序<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void RTC_ISR(void) interrupt RTC_VECTOR<br />
{<br />
//<<AICUBE_USER_RTC_ISR_CODE1_BEGIN>><br />
// 在此添加中断函数用户代码<br />
if (RTC_CheckAlarmFlag()) //判断是否是RTC闹钟中断<br />
{<br />
RTC_ClearAlarmFlag(); //清除中断请求标志位<br />
F54();<br />
}</p>
<pre><code>if (RTC_CheckSecondFlag()) //判断是否是RTC秒中断
{
RTC_ClearSecondFlag(); //清除中断请求标志位
}
//<<AICUBE_USER_RTC_ISR_CODE1_END>>
</code></pre>
<p>}</p>
<p>//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>><br />
// 在此添加用户函数实现代码<br />
void F54(void)<br />
{<br />
P54 = 0;<br />
delay_ms(5);<br />
P54 = 1;<br />
}<br />
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>></p>
中途修改RTC时钟,可参考实验箱例程包里面的RTC例子,修改完RTC时钟配置寄存器后,要触发RTC寄存器初始化:
void WriteRTC(void)
{
INIYEAR = RTCYEAR; //继承当前年月日
INIMONTH = RTCMONTH;
INIDAY = RTCDAY;
INIHOUR = hour; //修改时分秒
INIMIN = minute;
INISEC = 0;
INISSEC = 0;
RTCCFG |= 0x01; //触发RTC寄存器初始化
}
页:
[1]