⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 uCOS电子钟 pc机上模拟ucos实时操作系统上跑电子钟程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	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,"堆栈总量:    ",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,"按上下键选菜单!!",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,"按方向键改参数!!",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键返回!!",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);
	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 + -