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

📄 tsksystime.c

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -