//<<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>>