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

📄 main.c

📁 课程设计,ARM7以上平台开发多功能系统时钟源程序
💻 C
字号:
#include"..\ucos-ii\includes.h"               /* uC/OS interface */
#include "..\ucos-ii\add\osaddition.h"
#include "..\inc\drv.h"
#include "..\inc\drv\OSFile.h"
#include <string.h>
#include <math.h>
///******************任务定义***************///
OS_STK Main_Stack[STACKSIZE*8]={0, };   //Main_Test_Task堆栈
void Main_Task(void *Id);             //Main_Test_Task
#define Main_Task_Prio     12
#define PI 3.1415926
int cha;///////////
/**************已经定义的OS任务*************
tcp监控任务		11
以太网物理层监控任务	8
触摸屏任务		9
键盘任务		10
lcd刷新任务		59
系统任务		1
*****************************************************/

///*****************事件定义*****************///
OS_EVENT *Nand_Rw_Sem;                   //Nand_Flash读写控制权旗语
//and you can use it as folloeing:
//    Nand_Rw_Sem=OSSemCreate(1);        //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
//    OSSemPend(Nand_Rw_Sem,0,&err);
//    OSSemPost(Nand_Rw_Sem);

OS_EVENT *Uart_Rw_Sem;                   //Uart读写控制权旗语
//and you can use it as folloeing:
//    Uart_Rw_Sem=OSSemCreate(1);        //创建Uart读写控制权旗语,初值为1满足互斥条件//
//    OSSemPend(Uart_Rw_Sem,0,&err);
//    OSSemPost(Uart_Rw_Sem);
//////////////////////////////////////////////////////////

void initOSGUI()	//初始化操作系统的图形界面
{
	initOSMessage();
	initOSList();
	initOSDC();
	initOSCtrl();
	initOSFile();
	InitRtc();
}
///////////////////////////////////////////////////////
void jiemian()
{
	PDC pdc;
	//pdc=CreateDC();
	int i,x1,x2,y1,y2,oldx,oldy,m,n;
	m=240;n=120;
         pdc=CreateDC();
	SetDrawOrg(pdc, m,n, &oldx, & oldy);
	for(i=0;i<=60;i++)
	{ 
		x1=50*cos(PI/30*i);
		y1=50*sin(PI/30*i);
		x2=45*cos(PI/30*i);
		y2=45*sin(PI/30*i);
		MoveTo(pdc,x2,y2);
		LineTo(pdc,x1,y1);
		//OSTimeDly(10);	
	}
	for(i=0;i<=12;i++)
  	{
		x1=50*cos(PI/6*i);
		y1=50*sin(PI/6*i);
		x2=40*cos(PI/6*i);
		y2=40*sin(PI/6*i);
		MoveTo(pdc,x2,y2);
		LineTo(pdc,x1,y1);
		//OSTimeDly(10);
	}
	DestoryDC(pdc);
}
/////////////////////////////////////////////////////
void xianshi()
{	

	int time_s,oldx,oldy,timex,timey;
	PstructTime time;
	PDC pdc;	
	pdc=CreateDC();
			SetDrawOrg(pdc, 240,120, &oldx, & oldy);
			//time=Unicode2Int(strtimeh);
			//InitRtc();
			//Get_Rtc(time);
			time_s=(time->second);
			MoveTo(pdc,0,0);
			timey=35*sin(PI/30*time_s);
			timex=35*cos(PI/30*time_s);
			LineTo(pdc,timex,timey);
}
/////////////////////////////////////////////////////
//                  Main function.                //
////////////////////////////////////////////////////

int Main(int argc, char **argv)
{
	ARMTargetInit(); //开发板初始化
	OSInit(); //操作系统初始化      
	uHALr_ResetMMU();//复位MMU
	LCD_Init();             //初始化LCD模块
	LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据
	LCD_printf("320 x 240  Text Mode\n");
	initOSGUI();//初始化图形界面
	LoadFont();//调Unicode字库
	LoadConfigSys();//使用config.sys文件配置系统设置
	LCD_printf("Create task on uCOS-II...\n");
	OSTaskCreate(Main_Task,  (void *)0,  (OS_STK *)&Main_Stack[STACKSIZE*8-1],  Main_Task_Prio);// 创建系统任务
	OSAddTask_Init();//创建系统附加任务
	LCD_printf("Starting uCOS-II...\n");
	LCD_printf("Entering graph mode...\n");
	LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式
	InitRtc();//初始化系统时钟
	Nand_Rw_Sem=OSSemCreate(1);   //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
	OSStart();//操作系统任务调度开始
	//不会执行到这里
	return 0;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PTextCtrl pTextCtrl;//文本框结构
#define ID_MainTextCtrl 101//文本框ID

U8 SetSysTime()
{
	U16* ptext=pTextCtrl->text;//得到文本框文本指针
	U32 tmp[3],i;
	structClock clock;

	for(i=0;i<3;i++){//从文本中分离出时间,bcd码
		tmp[i]=0;
		while(*ptext && *ptext !=':'){
			tmp[i]<<=4;
			tmp[i]|=(*ptext)-'0';
			ptext++;
		}
		ptext++;
	}

	clock.hour=tmp[0];
	clock.minute=tmp[1];
	clock.second=tmp[2];
	if((clock.hour<=0x24&&clock.hour>=0)&&(clock.minute>=0&&clock.minute<=0x60)&&(clock.second>=0&&clock.second<=0x60))//小时在0~24,分和秒在0~60
	{
		Set_Rtc_Clock(&clock);//设置时间
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}


void CreateText()
{
	static char TimeKeyTable[]={0,0,0,'\b','7','8','9',0,'4','5','6','1','2','3',0,'0',':'};//键值映射表

	structRECT rect;//定义矩形结构
	int i=0;
	U16 str[20];

	SetRect(&rect, 200,210,280,230 );	//设置文本框
	//jiemian();
	pTextCtrl=CreateTextCtrl(ID_MainTextCtrl, &rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME,TimeKeyTable,NULL);//创建文本框

	SetWndCtrlFocus(NULL,ID_MainTextCtrl);//焦点移到文本框中

	DrawTextCtrl(pTextCtrl);//重绘文本框
	
}

U8 onKey(int nkey, int fnkey);

OS_EVENT *Rtc_Updata_Sem;//时钟更新控制权
OS_STK Rtc_Disp_Stack[STACKSIZE]={0, };   //Rtc_Disp_Task堆栈
void Rtc_Disp_Task(void *Id);             //Rtc_Disp_Task
#define Rtc_Disp_Task_Prio      14

void Main_Task(void *Id)             //Main_Test_Task
{
	POSMSG pMsg=0;//消息结构
	
	ClearScreen();//清屏
	//jiemian();
	CreateText(); //创建文本框
	Rtc_Updata_Sem=OSSemCreate(1);
	OSTaskCreate(Rtc_Disp_Task,  (void *)0,  (OS_STK *)&Rtc_Disp_Stack[STACKSIZE-1],  Rtc_Disp_Task_Prio);	//5//创建时钟任务
	//消息循环
	for(;;){
		POS_Ctrl pCtrl;//控件结构
		OSTimeDly(10);
		jiemian();
		//xianshi();
		pMsg=WaitMessage(0);//等待消息
		if(pMsg->pOSCtrl){//发给控件的消息
			if(pMsg->pOSCtrl->CtrlMsgCallBk)
				(*pMsg->pOSCtrl->CtrlMsgCallBk)(pMsg);
		}
		else{
			switch(pMsg->Message){
			case OSM_KEY://键盘消息
				pCtrl=GetCtrlfromID(NULL, GetWndCtrlFocus(NULL));//得到焦点控件指针
				if(pCtrl->CtrlType==CTRLTYPE_WINDOW){
					if((((PWnd)pCtrl)->style&WND_STYLE_MODE)==WND_STYLE_MODE){
						//焦点是有模式窗口,消息直接传递过去
						OSOnSysMessage(pMsg);
						break;
					}
				}
				if(onKey(pMsg->WParam,pMsg->LParam) )
				{
					cha=1;
					break;
				}
			default:
				OSOnSysMessage(pMsg);
				break;
			}
		}
		DeleteMessage(pMsg);//删除消息
	}
}

U8 onKey(int nkey, int fnkey)
{
	PDC pdc;//定义绘图设备上下文结构
	U16 str[20];
	static U8 input=FALSE;//编辑状态标志
	INT8U err;
	char errinformation[]="data flow!";//数据溢出信息
	u8 i=0;

	switch(nkey){
	case 14://OK
		if(!input){//没处于编辑状态
			OSSemPend(Rtc_Updata_Sem, 0,&err);//等待信号量
			pTextCtrl->text[0]=0;  //清空文本框
			SetTextCtrlEdit(pTextCtrl, TRUE);//焦点移到文本框控件
			DrawTextCtrl(pTextCtrl);//重绘文本框控件
			input=TRUE;//置编辑标志为是
		}
		else{
			if(SetSysTime())//输入的数据有效
			{
				SetTextCtrlEdit(pTextCtrl, FALSE);//退出编辑状态
				DrawTextCtrl(pTextCtrl);//重绘文本框控件
				input=FALSE;//置编辑标志为否
				OSSemPost(Rtc_Updata_Sem);//发送信号?
			}
			else
			{
				strChar2Unicode(pTextCtrl->text,errinformation);//数据溢出信息转换成unicode
				DrawTextCtrl(pTextCtrl);//重绘文本框控件
				pTextCtrl->text[0]=0;  //清空文本框
			}
		}
		return TRUE;
	case 7://Cancel
		if(input){
			SetTextCtrlEdit(pTextCtrl, FALSE);//退出编辑状态

			input=FALSE;//编辑状态标志为否

			OSSemPost(Rtc_Updata_Sem);//发送信号量
		}		
		return TRUE;
	}
	return FALSE;
}

////////////////////////////////////////////////////////////////
void Rtc_Disp_Task(void *Id) //时钟显示更新任务
{
	U16 strtime[8],strtimeh[3],strtimem[3],strtimes[3];
	int i,j,time_s,time_m,time_h,oldx,oldy,timex,timey,oldtimex,oldtimey;
	int timexs,timexh,timexm,timeys,timeyh,timeym;
	PDC pdc;
	INT8U err;
	for(;;){
		///////////////////////////////////////////////////////////////////
		////miaozhenhaoshu////////////////////////////////////////////////
		///////////////////////////////////////////////////////////////////
		if(Rtc_IsTimeChange(RTC_SECOND_CHANGE)){//不需要更新显示
			OSSemPend(Rtc_Updata_Sem, 0,&err);//等待信号量
			Rtc_Format("%H:%I:%S",strtime);//格式化时间
			///
			pdc=CreateDC();
			SetDrawOrg(pdc, 240,120, &oldx, & oldy);
			if(cha==1)
			{
				SetPenColor(pdc,0xffffffff);
				SetPenWidth(pdc,1);
				MoveTo(pdc,0,0);
			         LineTo(pdc,timexs,timeys);
				SetPenWidth(pdc,3);
				MoveTo(pdc,0,0);
			         LineTo(pdc,timexm,timeym);
				SetPenWidth(pdc,4);
				MoveTo(pdc,0,0);
			         LineTo(pdc,timexh,timeyh);
				cha=0;
					
			}
			for(i=0;i<2;++i)
			{
				strtimes[i]=strtime[i+6];
				strtimem[i]=strtime[i+3];
				strtimeh[i]=strtime[i];

			}
			strtimeh[2]='\0';
			strtimem[2]='\0';
			strtimes[2]='\0';
			SetTextCtrlText(pTextCtrl, strtime,TRUE);//设置文本框内容
			
			time_s=Unicode2Int(strtimes);
			time_m=Unicode2Int(strtimem);
			time_h=Unicode2Int(strtimeh);
///////////////////////////////////////////////////////////////////////
			SetPenWidth(pdc,1);
			timeys=50*sin(PI/30*time_s-(PI/2));
			timexs=50*cos(PI/30*time_s-(PI/2));
			oldtimey=35*sin(PI/30*(time_s-1)-(PI/2));
			oldtimex=35*cos(PI/30*(time_s-1)-(PI/2));			
			MoveTo(pdc,0,0);
			SetPenColor(pdc,0xffffffff);
			LineTo(pdc,oldtimex,oldtimey);
			MoveTo(pdc,0,0);
			SetPenColor(pdc,0);
			LineTo(pdc,timexs,timeys);
//////////////////////////////////////////////////////////////////////
			SetPenWidth(pdc,3);
			timeym=30*sin(PI/30*time_m-(PI/2));
			timexm=30*cos(PI/30*time_m-(PI/2));
			oldtimey=30*sin(PI/30*(time_m-1)-(PI/2));
			oldtimex=30*cos(PI/30*(time_m-1)-(PI/2));			
			MoveTo(pdc,0,0);
			SetPenColor(pdc,0xffffffff);
			LineTo(pdc,oldtimex,oldtimey);
			MoveTo(pdc,0,0);
			SetPenColor(pdc,0);
			LineTo(pdc,timexm,timeym);
//////////////////////////////////////////////////////////////////////////
                           SetPenWidth(pdc,4);
			timeyh=20*sin(PI/6*time_h-(PI/2));
			timexh=20*cos(PI/6*time_h-(PI/2));
			oldtimey=20*sin(PI/6*(time_h-1)-(PI/2));
			oldtimex=20*cos(PI/6*(time_h-1)-(PI/2));			
			MoveTo(pdc,0,0);
			SetPenColor(pdc,0xffffffff);
			LineTo(pdc,oldtimex,oldtimey);
			MoveTo(pdc,0,0);
			SetPenColor(pdc,0);
			LineTo(pdc,timexh,timeyh);	
			DestoryDC(pdc);
			OSSemPost(Rtc_Updata_Sem);//发送信号量
		}	
		OSTimeDly(50);
	}
}


⌨️ 快捷键说明

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