tsksystime.c

来自「本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单」· C语言 代码 · 共 134 行

C
134
字号
#include "includes.h"
#include "funclcd.h"
#include "file.h"
#define	SYS_TIMER_ID	0x8001

extern OS_MEM			*pMemSml;
extern OS_MEM			*pMemLge;
extern OS_EVENT	*rom peventDEBUG;
extern OS_EVENT	*rom peventWICResp;
extern OS_EVENT	*rom peventHardware;
extern OS_EVENT	*rom peventDVS;
extern OS_EVENT	*rom peventMCNM;
extern OS_EVENT	*rom peventTone;
extern OS_EVENT *rom peventSysTime;
extern OS_EVENT *rom peventTimer;
extern OS_EVENT *rom DisplaySem;
extern OS_EVENT	*rom peventWICCmd;

extern INT8U rom MainWndType;

extern INT8U rom Mod_Rdy;

extern void Func_Clear_Msg(INT8U rom * pMsg);

extern void Display_Date(unsigned char YearH,
				  unsigned char YearL,
				  unsigned char MonthH,
				  unsigned char MonthL,
				  unsigned char DateH,
				  unsigned char DateL);
extern void Display_Time(unsigned char HourH,
				  unsigned char HourL,
				  unsigned char MinuteH,
				  unsigned char MinuteL,
				  unsigned char CTL);
extern void OSTrap(INT8U taskid);

void Func_Enable_Time_Display(void);
void Func_Disable_Time_Display(void);
INT8U Func_DisplaySysTime(INT8U oddeven);

INT24U SysSecond;


#pragma romdata EXTRAM
INT8U rom SysYear,SysMonth,SysDate;
//INT8U rom TimeDisplayEnable;
#pragma code MYCODE
void tskSysTime(void * data){
	void rom * pMsg;
	INT8U err;
	INT8U oddeven;
	
	SysYear=0;
	SysMonth=1;
	SysDate=1;
	SysSecond=0;
	oddeven=0;

	
	pMsg=OSMemGet(pMemSml,&err);

	((MSG_HEAD *)pMsg)->Msg_ID=MSG_TIMER_START;
	((MSG_HEAD *)pMsg)->Origin=peventSysTime;		//should be changed to peventTimer
	((MSG_HEAD *)pMsg)->pmemME=pMemSml;
	((MSG_HEAD *)pMsg)->Attached=FALSE;
	((MSG_HEAD *)pMsg)->LenOfBody=4;
	((TIMER_MESSAGE *)pMsg)->TID=SYS_TIMER_ID;
	((TIMER_MESSAGE *)pMsg)->Val=OS_TICKS_PER_SEC;

    OSQPost(peventTimer,pMsg);
	
	for(;;){
		pMsg = OSQPend(peventSysTime, 0, &err);
		if(err==OS_NO_ERR){
			if((INT24U)pMsg < PTR_MAX){
				switch (((MSG_HEAD *)pMsg)->Msg_ID){
					case MSG_TIME_CORRECTION:
						OS_ENTER_CRITICAL();
						SysYear   = ((MSG_TIMERPT *)pMsg) -> Year;
						SysMonth  = ((MSG_TIMERPT *)pMsg) -> Month;
						SysDate   = ((MSG_TIMERPT *)pMsg) -> Date;
						SysSecond = ((MSG_TIMERPT *)pMsg) -> Second;
						OS_EXIT_CRITICAL();
						break;
					case MSG_TIMER_EXPIRE:
						OS_ENTER_CRITICAL();
						SysSecond++;
						if(SysSecond>=86400){
							SysSecond=0;	SysDate++;
							if(SysDate>31){
								SysDate=1;	SysMonth++;
								if(SysMonth>12){
									SysMonth=1;	SysYear++;
									if(SysYear>=100) SysYear=0;
								}
							}
						}
						OS_EXIT_CRITICAL();
						if((SysSecond % 60) == 30) OSQPost(peventWICCmd, (OS_EVENT *)MSG_TIME_QUERY);
						if(SysYear == 0 && Mod_Rdy == TRUE) OSQPost(peventWICCmd, (OS_EVENT *)MSG_TIME_QUERY);
						if(SysYear != 0){
							OSQPost(peventDVS, (OS_EVENT *)MSG_SECOND_TICK);
						}
					break;
					default:
						OSTrap(TASK_SYSTIME_PRIO+96);
					break;
				}
				Func_Clear_Msg(pMsg);
			}
		}
	}
}

void Func_GetSysTime(NM_TIME * ptrTime){
	ptrTime->chrYear = SysYear;
	ptrTime->chrMonth = SysMonth;
	ptrTime->chrDate = SysDate;
	ptrTime->chrHour = SysSecond/3600;
	ptrTime->chrMinute = (SysSecond%3600)/60;
	ptrTime->chrSecond = SysSecond%60;
}


INT8U Func_DisplaySysTime(INT8U oddeven){
	INT8U err;
	Display_Date(SysYear/10+0x30,SysYear%10+0x30,SysMonth/10+0x30,SysMonth%10+0x30,
				SysDate/10+0x30,SysDate%10+0x30);
	Display_Time(SysSecond/36000+0x30,(SysSecond/3600)%10+0x30,
				(SysSecond%3600)/600+0x30,((SysSecond%3600)/60)%10+0x30,oddeven);
	return((oddeven == 0)? 1:0);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?