圣灵主宰 发表于 2026-4-21 17:09:49

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

<p>//&lt;&lt;AICUBE_USER_HEADER_REMARK_BEGIN&gt;&gt;<br />
////////////////////////////////////////<br />
// 在此添加用户文件头说明信息<br />
// 文件名称: main.c<br />
// 文件描述:<br />
// 文件版本: V1.0<br />
// 修改记录:<br />
//   1. (2026-04-21) 创建文件<br />
////////////////////////////////////////<br />
//&lt;&lt;AICUBE_USER_HEADER_REMARK_END&gt;&gt;</p>
<p>#include &quot;config.h&quot;                     //默认已包含stdio.h、intrins.h等头文件</p>
<p>//&lt;&lt;AICUBE_USER_INCLUDE_BEGIN&gt;&gt;<br />
// 在此添加用户头文件包含<br />
#include &quot;smg.h&quot;<br />
//&lt;&lt;AICUBE_USER_INCLUDE_END&gt;&gt;</p>
<p>//&lt;&lt;AICUBE_USER_GLOBAL_DEFINE_BEGIN&gt;&gt;<br />
// 在此添加用户全局变量定义、用户宏定义以及函数声明<br />
void Smg_X(void);<br />
void F54(void);<br />
void KEY(void);<br />
uint8_t keynum = 0;<br />
//&lt;&lt;AICUBE_USER_GLOBAL_DEFINE_END&gt;&gt;</p>
<p>////////////////////////////////////////<br />
// 项目主函数<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void main(void)<br />
{<br />
//&lt;&lt;AICUBE_USER_MAIN_INITIAL_BEGIN&gt;&gt;<br />
// 在此添加用户主函数初始化代码<br />
uint8_t i = 0;<br />
//&lt;&lt;AICUBE_USER_MAIN_INITIAL_END&gt;&gt;</p>
<pre><code>SYS_Init();

//&lt;&lt;AICUBE_USER_MAIN_CODE_BEGIN&gt;&gt;
// 在此添加主函数中运行一次的用户代码
//&lt;&lt;AICUBE_USER_MAIN_CODE_END&gt;&gt;

while (1)
{
    //&lt;&lt;AICUBE_USER_MAIN_LOOP_BEGIN&gt;&gt;
    // 在此添加主函数中用户主循环代码
    Smg_X();
    P7 = SMG_weishu;
    P6 = SMG_shuzi];
    delay_ms(1);
    i++;
    if(i &gt; 7)
      i = 0;
    keynum++;
    if(keynum &gt; 155)
      keynum = 0;
    KEY();
    //&lt;&lt;AICUBE_USER_MAIN_LOOP_END&gt;&gt;
}
</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 &gt; 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>//&lt;&lt;AICUBE_USER_PREINITIAL_CODE_BEGIN&gt;&gt;
// 在此添加用户预初始化代码
//&lt;&lt;AICUBE_USER_PREINITIAL_CODE_END&gt;&gt;

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);

//&lt;&lt;AICUBE_USER_INITIAL_CODE_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_INITIAL_CODE_END&gt;&gt;

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模拟信号输入功能

//&lt;&lt;AICUBE_USER_PORT1_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT1_INITIAL_END&gt;&gt;
</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数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT3_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT3_INITIAL_END&gt;&gt;
</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数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT4_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT4_INITIAL_END&gt;&gt;
</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数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT5_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT5_INITIAL_END&gt;&gt;
</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数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT6_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT6_INITIAL_END&gt;&gt;
</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数字信号输入功能

//&lt;&lt;AICUBE_USER_PORT7_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_PORT7_INITIAL_END&gt;&gt;
</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主时钟作为高速外设时钟源

//&lt;&lt;AICUBE_USER_CLOCK_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_CLOCK_INITIAL_END&gt;&gt;
</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秒中断

//&lt;&lt;AICUBE_USER_RTC_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_RTC_INITIAL_END&gt;&gt;
</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(&quot;@STCISP#&quot;);         //设置USB不停电下载命令</p>
<pre><code>//&lt;&lt;AICUBE_USER_USBLIB_INITIAL_BEGIN&gt;&gt;
// 在此添加用户初始化代码
//&lt;&lt;AICUBE_USER_USBLIB_INITIAL_END&gt;&gt;
</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 />
//&lt;&lt;AICUBE_USER_USBLIB_ISR_CODE1_BEGIN&gt;&gt;<br />
// 在此添加中断函数用户代码<br />
USB_SendData(UsbOutBuffer, OutNumber); //原路返回, 用于测试<br />
// 在此处添加用户处理接收数据的代码<br />
//&lt;&lt;AICUBE_USER_USBLIB_ISR_CODE1_END&gt;&gt;<br />
}</p>
<p>////////////////////////////////////////<br />
// RTC中断服务程序<br />
// 入口参数: 无<br />
// 函数返回: 无<br />
////////////////////////////////////////<br />
void RTC_ISR(void) interrupt RTC_VECTOR<br />
{<br />
//&lt;&lt;AICUBE_USER_RTC_ISR_CODE1_BEGIN&gt;&gt;<br />
// 在此添加中断函数用户代码<br />
if (RTC_CheckAlarmFlag())         //判断是否是RTC闹钟中断<br />
{<br />
RTC_ClearAlarmFlag();         //清除中断请求标志位<br />
F54();<br />
}</p>
<pre><code>if (RTC_CheckSecondFlag())          //判断是否是RTC秒中断
{
    RTC_ClearSecondFlag();          //清除中断请求标志位

}
//&lt;&lt;AICUBE_USER_RTC_ISR_CODE1_END&gt;&gt;
</code></pre>
<p>}</p>
<p>//&lt;&lt;AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN&gt;&gt;<br />
// 在此添加用户函数实现代码<br />
void F54(void)<br />
{<br />
P54 = 0;<br />
delay_ms(5);<br />
P54 = 1;<br />
}<br />
//&lt;&lt;AICUBE_USER_FUNCTION_IMPLEMENT_END&gt;&gt;</p>

乘风飞扬 发表于 2026-4-21 17:49:49

中途修改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]
查看完整版本: 这个RTC的时分秒有没有办法改变,按键里面的修改不了