📄 main.c
字号:
break;
case 1:
YEAR += (INT32S)(uiTimedata*100);
break;
case 2:
YEAR += (INT32S)(uiTimedata*10);
break;
case 3:
YEAR += uiTimedata;
break;
case 4:
MONTH += (INT32S)(uiTimedata*10); /* 设置月 */
break;
case 5:
if ((MONTH == 12) && (uiTimedata == 1)) {
MONTH = 1;
} else if ((MONTH ==1) && (uiTimedata ==-1)) {
MONTH = 12;
} else {
MONTH += uiTimedata;
}
break;
case 6: /* 设置日期 */
DOM += (INT32S)(uiTimedata*10);
if (DOM == 0) {
if (uiTimedata == 1) {
DOM = 1;
} else {
DOM = 31;
}
}
break;
case 7:
DOM += uiTimedata;
if (DOM == 0) {
if (uiTimedata == 1) {
DOM = 1;
} else {
DOM = 31;
}
}
break;
case 8:
DOW += uiTimedata;
break;
case 9: /* 设置小时 */
HOUR += (INT32S)(uiTimedata*10);
if (HOUR > 23) {
if (uiTimedata == 1) {
HOUR = 0;
} else {
HOUR = 23;
}
}
break;
case 10:
HOUR += uiTimedata;
if (HOUR > 23) {
if (uiTimedata == 1) {
HOUR = 0;
} else {
HOUR = 23;
}
}
break;
case 11:
MIN += (INT32S)(uiTimedata*10); /* 设置分钟 */
if (MIN > 59) {
if (uiTimedata == 1) {
MIN = 0;
} else {
MIN = 59;
}
}
break;
case 12:
MIN += uiTimedata;
if (MIN > 59) {
if (uiTimedata == 1) {
MIN = 0;
} else {
MIN = 59;
}
}
break;
case 13: /* 设置秒钟 */
SEC += (INT32S)(uiTimedata*10);
if (SEC > 59) {
if (uiTimedata == 1) {
SEC = 0;
} else {
SEC = 59;
}
}
break;
case 14:
SEC += uiTimedata;
if (SEC > 59) {
if (uiTimedata == 1) {
SEC = 0;
} else {
SEC = 59;
}
}
break;
}
}
/*******************************************************************************************
** Function name: weekdayGet
** Descriptions: 根据输入的日期,计算该日期对应的星期数。
** Input parameters: uiYear 年
uiMonth 月
uiDay 日
** Output parameters: 无
** Returned value: 对应的星期数
*******************************************************************************************/
INT32U weekdayGet(INT32U uiYear,INT32U uiMonth,INT32U uiDay)
{
INT32U uiDays[12] = {31,59,90,120,151,181,212,243,273,304,334,365};
INT32U uiNum;
uiNum = (INT32U)((uiYear-1L)*365 + uiDay + (uiYear-1L)/4 - (uiYear-1L)/100 + (uiYear-1L)/400);
if(uiMonth > 1)
uiNum+=uiDays[uiMonth-2];
if((uiMonth > 2)&&(uiYear%4==0&&uiYear%100!=0||uiYear%400==0))
uiNum++;
return uiNum % 7;
}
/*********************************************************************************************************
** Function name : main
** Descriptions : 主函数
** Input parameters: 无
** Output parameters: 无
********************************************************************************************************/
int main (void)
{
OSInit();
OSTaskCreateExt(TaskKey,
(void *)0,
&TASKKEY_STACK[TASKKEY_STACK_SIZE-1],
TASKKEY_PRIO,
TASKKEY_ID,
&TASKKEY_STACK[0],
TASKKEY_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSStart();
}
/*******************************************************************************************
** Function name: TaskKey
** Descriptions: 键盘任务
** Input parameters: 无
** Output parameters: 无
*******************************************************************************************/
void TaskKey (void *pdata)
{
INT32U uiKey,uiKey0,uiKeyMsg,uiModeFlag=0;
INT16U TimeSet[7] = {2007,3,2,5,15,05,30}; /* 用于设定RTC的初始时间 */
pdata = pdata;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
TargetInit();
gpioInit();
SetVICIRQ(13,4,(uint32)rtcException); /* 中断优先级为4 */
uart0Init(); /* 串口0初始化为8位数据位,1位停*/
/* 止位,无奇偶校验,波特率为 */
/* 115200,且初始化了串口0的引脚 */
RtcBox = OSMboxCreate((void *)0);
KeyBox = OSMboxCreate((void *)0);
OSTaskCreateExt(TaskDisp,
(void *)0,
&TASKDISP_STACK[TASKDISP_STACK_SIZE-1],
TASKDISP_PRIO,
TASKDISP_ID,
&TASKDISP_STACK[0],
TASKDISP_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TaskSet,
(void *)0,
&TASKSET_STACK[TASKSET_STACK_SIZE-1],
TASKSET_PRIO,
TASKSET_ID,
&TASKSET_STACK[0],
TASKSET_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
rtcInit(TimeSet); /* 初始化RTC内部的时间值,并且设*/
/* 定为秒值产生增量时,中断产生 */
while(1) {
OSTimeDly(1); /* 延时 */
uiKey = keyIn(); /* 获取按键操作信息 */
if ((uiKey == 0) | (uiKey !=uiKey0)) { /* 未按键或与上次不同 */
uiKey0 =uiKey; /* 记录本次按键 */
continue; /* 再延时 */
} else {
BUZZER_Set();
}
switch(uiKey) { /* 有按键,并已经稳定,则根据按 */
/* 键不同,执行不同的处理。 */
case KEY1:
if ( 0==uiModeFlag ) {
PCONP |= (1<<9);
CCR = 0x10; /* 停止RTC计数 */
uiModeFlag=1;
} else {
CCR = 0x11; /* 启动RTC计数 */
PCONP &= ~(1<<9);
uiModeFlag=0;
}
case KEY2:
case KEY3:
case KEY4:
uiKeyMsg=uiKey;
OSMboxPost(KeyBox,(void *)&uiKeyMsg);
break;
}
while ((uiKey&IO0PIN) == 0) { /* 等待按键释放。 */
OSTimeDly(1);
}
BUZZER_Clr();
}
}
/*******************************************************************************************
** Function name: TaskDisp
** Descriptions: 时间更新时,读取RTC的时间值,并将读出的时分秒值通过串口0送到上位机的EASYARM.exe显示。
** Input parameters: 无
** Output parameters: 无
*******************************************************************************************/
void TaskDisp (void *pdata)
{
INT8U err;
void *pTimeMsg;
pdata = pdata;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
while(1) {
pTimeMsg = OSMboxPend(RtcBox,0,&err); /* 等待消息邮箱Rtcbox有效 */
timeDisp (*(INT32U*)pTimeMsg, /* 将RTC数据发送到PC机的万年 */
*((INT32U*)pTimeMsg+1)); /* 历显示窗口 */
}
}
/*******************************************************************************************
** Function name: TaskSet
** Descriptions: 设置任务
** Input parameters: 无
** Output parameters: 无
*******************************************************************************************/
void TaskSet(void *pdata)
{
INT8U err,n;
INT32U uiDates,uiTimes,uiTimedata,uiLoopCnt;
void *pKeyMsg;
uiLoopCnt = 16;
n = 0;
pdata = pdata;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
while(1) {
pend: pKeyMsg = OSMboxPend(KeyBox,0,&err);
if (*(INT32U*)pKeyMsg!=KEY1) {
continue;
}
while(1) {
pKeyMsg = OSMboxAccept(KeyBox); /* 无等待获取键盘消息 */
if (pKeyMsg != (void *)0) {
switch (*(INT32U*)pKeyMsg) {
case KEY1:
goto pend; /* 返回显示模式 */
case KEY2:
if ((n == 7) | (n == 3)) {
n++;
}
n=(INT8U)((n+1)%15); /* 得到下一选中数据位的对应编号 */
break;
case KEY3: /* 将选中的数据位加一 */
timeSet(n,1);
break;
case KEY4:
timeSet(n,-1); /* 将选中的数据位减一 */
break;
}
DOW = weekdayGet((INT32U)YEAR, /* 由年月日得到对应的星期数 */
(INT32U)MONTH,
(INT32U)DOM);
uiTimes = (INT32U)CTIME0; /* 读取完整的时钟寄存器 */
uiDates = (INT32U)CTIME1;
timeDisp(uiTimes,uiDates);
}
uiLoopCnt--; /* 循环计数减一 */
if (8==uiLoopCnt) {
uiTimedata = timeGet(n);
pcDispChar(n, SHOWTABLE[uiTimedata]);
} else if (0==uiLoopCnt) {
pcDispChar(n,0);
uiLoopCnt=16;
}
OSTimeDly(10);
}
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -