?? main.c.bak
字號:
} 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();
OSTaskCreate(TaskKey,
(void *)0,
&TASKKEY_STACK[TASKKEY_STACK_SIZE-1],
2
);
OSStart();
return 0;
}
/*******************************************************************************************
** 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();
RtcBox = OSMboxCreate((void *)0);
KeyBox = OSMboxCreate((void *)0);
OSTaskCreate(TaskDisp,
(void *)0,
&TASKDISP_STACK[TASKDISP_STACK_SIZE-1],
4
);
OSTaskCreate(TaskSet,
(void *)0,
&TASKSET_STACK[TASKSET_STACK_SIZE-1],
3
);
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 + -