?? test.c
字號:
PC_DOSSaveReturn(); /* Save environment to return to DOS */
PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */
OpenHZK("HZK16JF.LIB");
InitScr();
DispChineseLine(0,0," 本程序用來演示",0);
DispChineseLine(0,16,"多任務內核環境下",0);
DispChineseLine(0,32,"的一個電子時鐘。",0);
DispChineseLine(0,48,"請多提寶貴意見!",0);
DispChineseLine(0,80,"按任意鍵繼續...",0);
getch();
getdate(&da);
gettime(&ti);
Time.Year = da.da_year;
Time.Month = da.da_mon;
Time.Day = da.da_day;
Time.Week = 1;
Time.Hour = ti.ti_hour;
Time.Minute = ti.ti_min;
Time.Second = ti.ti_sec;
Time.Week = GetWeek(da.da_year,da.da_mon,da.da_day);
OSInit(); /* Initialize uC/OS-II */
TimeKey = OSQCreate(TimeKeyMsg,10); /* Random number semaphore */
OSTaskCreateExt(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 0,
MY_TASK_START_PRIO + 0,TaskStartStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSStart(); /* Start multitasking */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void TaskStart(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_STK_DATA data; /* Storage for task stack data */
INT16S key;
INT32U TotalSTK;
pdata = pdata; /* Prevent compiler warning */
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */
PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
OS_EXIT_CRITICAL();
OSStatInit(); /* Initialize uC/OS-II's statistics */
DispChineseLine(144,0,"按F8檢測一次堆棧",0);
DispChineseLine(144,16,"開始任務: ",0);
DispChineseLine(144,32,"1秒定時: ",0);
DispChineseLine(144,48,"顯示時間: ",0);
DispChineseLine(144,64," 主菜單: ",0);
DispChineseLine(144,80,"設置日期: ",0);
DispChineseLine(144,96,"設置時間: ",0);
DispChineseLine(144,112,"設置鬧鐘: ",0);
DispChineseLine(144,128,"堆??偭浚骸 ?quot;,0);
TotalSTK = 0;
key = OSTaskStkChk(MY_TASK_START_PRIO + 0, &data);
TotalSTK += data.OSUsed;
DispData(224,16,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 2, &data);
TotalSTK += data.OSUsed;
DispData(224,32,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 3, &data);
TotalSTK += data.OSUsed;
DispData(224,48,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 4, &data);
TotalSTK += data.OSUsed;
DispData(224,64,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 5, &data);
TotalSTK += data.OSUsed;
DispData(224,80,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 6, &data);
TotalSTK += data.OSUsed;
DispData(224,96,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 7, &data);
TotalSTK += data.OSUsed;
DispData(224,112,(INT16U)data.OSUsed,4);
DispData(224,128,(INT16U)TotalSTK,4);
OSTaskCreateExt(TaskDisp, (void *)0, &TaskDispStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 3,MY_TASK_START_PRIO + 3,TaskDispStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TaskClock, (void *)0, &TaskClockStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 2,MY_TASK_START_PRIO + 2,TaskClockStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
for (;;)
{
if (PC_GetKey(&key) == TRUE)
{ /* See if key has been pressed */
if (key == 0x1B)
{ /* Yes, see if it's the ESCAPE key */
CloseScr();
fclose(Fr);
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */
PC_DOSReturn(); /* Return to DOS */
}
else if (key == 0x1042)
{
TotalSTK = 0;
key = OSTaskStkChk(MY_TASK_START_PRIO + 0, &data);
TotalSTK += data.OSUsed;
DispData(224,16,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 2, &data);
TotalSTK += data.OSUsed;
DispData(224,32,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 3, &data);
TotalSTK += data.OSUsed;
DispData(224,48,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 4, &data);
TotalSTK += data.OSUsed;
DispData(224,64,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 5, &data);
TotalSTK += data.OSUsed;
DispData(224,80,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 6, &data);
TotalSTK += data.OSUsed;
DispData(224,96,(INT16U)data.OSUsed,4);
key = OSTaskStkChk(MY_TASK_START_PRIO + 7, &data);
TotalSTK += data.OSUsed;
DispData(224,112,(INT16U)data.OSUsed,4);
DispData(224,128,(INT16U)TotalSTK,4);
}
else
OSQPost(TimeKey, (void *)&key); /* Send message to Task*/
}
OSTimeDlyHMSM(0, 0, 0, 250); /* Wait one second */
}
}
/*
*********************************************************************************************************
* TASKS
*********************************************************************************************************
*/
void TaskDisp(void *pdata)
{
INT8U err;
INT16S *key;
pdata = pdata;
ResumeLCD();
DispChineseLine(0,80,"按ESC鍵退出??!",0);
Update(1);
Status |= 1;
for (;;)
{
key = OSQPend(TimeKey,0,&err);
if (*key == 0x10FF)
Update(0);
else if (*key == 0x0D)
{
OSTaskCreateExt(TaskMenu, (void *)0, &TaskMenuStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 4,
MY_TASK_START_PRIO + 4,TaskMenuStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
Status &= 0xFE;
OSTaskDel(MY_TASK_START_PRIO + 3);
}
}
}
void TaskMenu(void *pdata)
{
INT8U err;
static INT8U a = 1;
INT16S *key;
pdata = pdata;
DispChineseLine(0,96,"按F10鍵返回??!",0);
DispChineseLine(0,112,"按上下鍵選菜單?。?quot;,0);
DispChineseLine(0,128,"按回車鍵確認?。?!",0);
for (;;)
{
DispChineseLine(0,0,"__設置參數__",0);
DispChineseLine(0,16," 設定日期 ",a == 1);
DispChineseLine(0,32," 設定時間 ",a == 2);
DispChineseLine(0,48," 設定鬧鐘 ",a == 3);
key = OSQPend(TimeKey,0,&err);
if (*key == 0x1050)
{
if (++a > 3) a = 1;
}
else if (*key == 0x1048)
{
if (--a < 1) a = 3;
}
else if (*key == 0x1044)
{
OSTaskCreateExt(TaskDisp, (void *)0, &TaskDispStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 3,
MY_TASK_START_PRIO + 3,TaskDispStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskDel(MY_TASK_START_PRIO + 4);
}
else if (*key == 0x0D)
{
if (a == 1)
{
OSTaskCreateExt(TaskSetDate, (void *)0, &TaskSetDateStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 5,
MY_TASK_START_PRIO + 5,TaskSetDateStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskDel(MY_TASK_START_PRIO + 4);
}
else if (a == 2)
{
OSTaskCreateExt(TaskSetTime, (void *)0, &TaskSetTimeStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 6,
MY_TASK_START_PRIO + 6,TaskSetTimeStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskDel(MY_TASK_START_PRIO + 4);
}
else
{
OSTaskCreateExt(TaskSetAlert, (void *)0, &TaskSetAlertStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 7,
MY_TASK_START_PRIO + 7,TaskSetAlertStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskDel(MY_TASK_START_PRIO + 4);
}
}
}
}
void TaskClock(void *pdata)
{
INT16S rtn = 0x10FF;
pdata = pdata;
for (;;)
{
OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */
if (++Time.Second >= 60)
{
Time.Second = 0;
if (++Time.Minute >= 60)
{
Time.Minute = 0;
if (++Time.Hour >= 24)
{
Time.Hour = 0;
Time.Day++;
switch (Time.Month)
{
case 4:
case 6:
case 9:
case 11:
if (Time.Day > 30)
Time.Day = 1;
Time.Month++;
break;
case 2:
if (!(Time.Year % 4) && Time.Year % 100 || !(Time.Year % 400))
{
if (Time.Day > 29)
{
Time.Day =1;
Time.Month++;
}
}
else
{
if (Time.Day > 28)
{
Time.Day =1;
Time.Month++;
}
}
break;
default:
if (Time.Day > 31)
{
Time.Day = 1;
if (++Time.Month > 12)
{
Time.Month = 1;
Time.Year++;
}
}
}
}
}
}
if (Status & 0x01)
OSQPost(TimeKey,(void *)&rtn); /* Release semaphore */
}
}
void TaskSetDate(void *pdata)
{
INT8U err;
INT8U a = 1;
INT16U year;
INT16U month;
INT16U day;
INT8U rtn = 0;
pdata = pdata;
DispChineseLine(0,96,"按F10鍵返回!!",0);
DispChineseLine(0,112,"按方向鍵改參數?。?quot;,0);
DispChineseLine(0,128,"按回車鍵確認!??!",0);
DispChineseLine(0,0,"__設定日期__",0);
DispChineseLine(0,16," 年 ",0);
DispChineseLine(0,32," 月 日 ",0);
DispChineseLine(0,48," ",0);
year = Time.Year;
month = Time.Month;
day = Time.Day;
DispData(16,32,month,2);
DispData(64,32,day,2);
for (;;)
{
if (a == 1)
{
if (rtn == 2) rtn = 0x0C;
else rtn = 0x24;
rtn = EditData(16,16,&year,rtn,2008,2050);
DispData(16,16,year,4);
}
else if (a == 2)
{
if (rtn == 2) rtn = 0x0A;
else rtn = 0x12;
rtn = EditData(16,32,&month,rtn,1,12);
DispData(16,32,month,2);
}
else
{
if (rtn == 2) rtn = 0x0A;
else rtn = 0x12;
switch(month)
{
case 4:
case 6:
case 9:
case 11:
err = 30;
break;
case 2:
if (year % 4) err =28;
else err = 29;
break;
default:
err = 31;
}
rtn = EditData(64,32,&day,rtn,1,err);
DispData(64,32,day,2);
}
if (rtn < 2)
{
if (!rtn)
{
Time.Year = year;
Time.Month = month;
Time.Day = day;
Time.Week = GetWeek(year,month,day);
}
OSTaskCreateExt(TaskMenu, (void *)0, &TaskMenuStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 4,
MY_TASK_START_PRIO + 4,TaskMenuStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskDel(MY_TASK_START_PRIO + 5);
}
if (rtn == 2)
{
if (--a < 1)
a = 3;
}
else
{
if (++a > 3)
a = 1;
}
}
}
void TaskSetTime(void *pdata)
{
INT8U a = 1;
INT16U hour;
INT16U minute;
INT8U rtn = 0;
pdata = pdata;
DispChineseLine(0,96,"按F10鍵返回?。?quot;,0);
DispChineseLine(0,112,"按方向鍵改參數??!",0);
DispChineseLine(0,128,"按回車鍵確認?。。?quot;,0);
DispChineseLine(0,0,"__設定時間__",0);
DispChineseLine(0,16," ",0);
DispChineseLine(0,32," 時 分 ",0);
DispChineseLine(0,48," ",0);
hour = Time.Hour;
minute = Time.Minute;
DispData(64,32,minute,2);
for (;;)
{
if (a == 1)
{
if (rtn == 2) rtn = 0x0A;
else rtn = 0x12;
rtn = EditData(16,32,&hour,rtn,0,23);
DispData(16,32,hour,2);
}
else
{
if (rtn == 2) rtn = 0x0A;
else rtn = 0x12;
rtn = EditData(64,32,&minute,rtn,0,59);
DispData(64,32,minute,2);
}
if (rtn < 2)
{
if (!rtn)
{
Time.Hour = hour;
Time.Minute = minute;
}
OSTaskCreateExt(TaskMenu, (void *)0, &TaskMenuStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 4,
MY_TASK_START_PRIO + 4,TaskMenuStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskDel(MY_TASK_START_PRIO + 6);
}
if (rtn == 2)
{
if (--a < 1)
a = 2;
}
else
{
if (++a > 2)
a = 1;
}
}
}
void TaskSetAlert(void *pdata)
{
INT8U a = 1;
INT16U hour = 0;
INT16U minute = 0;
INT8U rtn = 0;
pdata = pdata;
DispChineseLine(0,96,"按F10鍵返回??!",0);
DispChineseLine(0,112,"按方向鍵改參數!!",0);
DispChineseLine(0,128,"按回車鍵確認?。?!",0);
DispChineseLine(0,0,"__設定鬧鐘__",0);
DispChineseLine(0,16," ",0);
DispChineseLine(0,32," 時 分 ",0);
DispChineseLine(0,48," ",0);
DispData(64,32,minute,2);
for (;;)
{
if (a == 1)
{
if (rtn == 2) rtn = 0x0A;
else rtn = 0x12;
rtn = EditData(16,32,&hour,rtn,0,23);
DispData(16,32,hour,2);
}
else
{
if (rtn == 2) rtn = 0x0A;
else rtn = 0x12;
rtn = EditData(64,32,&minute,rtn,0,59);
DispData(64,32,minute,2);
}
if (rtn < 2)
{
OSTaskCreateExt(TaskMenu, (void *)0, &TaskMenuStk[TASK_STK_SIZE - 1], MY_TASK_START_PRIO + 4,
MY_TASK_START_PRIO + 4,TaskMenuStk,TASK_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskDel(MY_TASK_START_PRIO + 7);
}
if (rtn == 2)
{
if (--a < 1)
a = 2;
}
else
{
if (++a > 2)
a = 1;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -