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

📄 main.c

📁 想不想自己做一个世界范围的时钟表啊
💻 C
📖 第 1 页 / 共 2 页
字号:
 #include"..\ucos-ii\includes.h"               /* uC/OS interface */
#include "..\ucos-ii\add\osaddition.h"
#include "..\inc\drv.h"

#include "..\inc\OSFile.h"
#include "..\inc\drv\Ustring.h"
#include <string.h>
#include <math.h>
#include "..\inc\exio.h"
unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
int inifisnished;


///******************任务定义***************///

OS_STK Main_Stack[STACKSIZE*8]={0, };   //Main_Test_Task堆栈
void Main_Task(void *Id);             //Main_Test_Task
#define Main_Task_Prio     12

OS_STK Led_Flash_Stack[STACKSIZE]= {0, }; //LED闪烁任务堆栈
void Led_Flash_Task(void *Id);            //LED闪烁任务
#define Led_Flash_Prio           60


OS_STK Rtc_Disp_Stack[STACKSIZE]= {0, }; 
void Rtc_Disp_Task(void *Id);            //LED闪烁任务
#define Rtc_Disp_Prio           57



#define pi 3.14159265357

/**************已经定义的OS任务*************
#define Touch_Screen_Task_Prio		9
#define Main_Task_Prio     12
#define Key_Scan_Task_Prio      58
#define Lcd_Fresh_prio           59
#define Led_Flash_Prio           60
#define Rtc_Disp_Prio           57
***************************************/////////



///*****************事件定义*****************///
OS_EVENT *Rtc_Updata_Sem;
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 Led_Flash_Task(void *Id)//指示RTOS处于正常工作中
{
  unsigned char led_state;
  Uart_Printf(0,"\n10");
  for (;;)
  {
    Led_Display(led_state);
    led_state=~led_state;
    OSTimeDly(250);
  }
}//Led_Flash_Task

void initOSGUI()	//初始化操作系统的图形界面
{
	initOSMessage();
	initOSList();
	initOSDC();
	initOSCtrl();
	initOSFile();
}
/////////////////////////////////////////////////////
//                  Main function.                //
////////////////////////////////////////////////////

int Main(int argc, char **argv)
{

	ARMTargetInit();        // do target (uHAL based ARM system) initialisation //

	OSInit();               // needed by uC/OS-II //
	uHALr_ResetMMU();

	LCD_Init();             //初始化LCD模块
	LCD_printf("LCD initialization is OK\n");
	LCD_printf("320 x 240  Text Mode\n");

	LoadFont();
	LoadConfigSys();
	
  // create the tasks in uC/OS and assign increasing //
  // priorities to them so that Task3 at the end of  //
  // the pipeline has the highest priority.          //
	LCD_printf("Create task on uCOS-II...\n");
	OSTaskCreate(Main_Task,  (void *)0,  (OS_STK *)&Main_Stack[STACKSIZE*8-1],  Main_Task_Prio);// 1
	OSTaskCreate(Led_Flash_Task,  (void *)0,  (OS_STK *)&Led_Flash_Stack[STACKSIZE-1],  Led_Flash_Prio  );// 10
         OSTaskCreate(Rtc_Disp_Task, (void *)0,(OS_STK*)&Rtc_Disp_Stack[STACKSIZE-1],Rtc_Disp_Prio);	//5
 EXIO_8255A_CTRL=0x80;//初始化LED
		      EXIO_8255A_PORTC=0xff;
	             

	OSAddTask_Init();
  
	LCD_printf("Starting uCOS-II...\n");
	LCD_printf("Entering graph mode...\n");
	LCD_ChangeMode(DspGraMode);

	initOSGUI();
	InitRtc();
	
	Nand_Rw_Sem=OSSemCreate(1);   //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//

	
	ARMTargetStart();       //Start the (uHAL based ARM system) system running //

	OSStart();              // start the game //

	// never reached //
	return 0;
}//main


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PListCtrl pMainListCtrl;//列表框控件指针
char FileExName[]={'B','M','P',0};//文件扩展名
char BmpFile[100][12];//文件名数组
int listnumber=0;


#define ID_MainListBox	100//列表框控件ID
//
PTextCtrl pTextCtrl;//文本框结构
#define ID_MainTextCtrl 101//文本框ID


void CreateFileList()
{   
	structRECT rect;//定义矩形结构
	static char filename[9][10]={"Beijing","Newyork","Tehela","Paris","Tokyo"};
	U32 filepos=0;
	U16 Ufilename[9];
	int i=0;

	SetRect(&rect, 0,5,120,200);	//创建列表框控件
	pMainListCtrl=CreateListCtrl(ID_MainListBox, &rect, 100,FONTSIZE_MIDDLE,CTRL_STYLE_DBFRAME,NULL);//创建列表框
	SetWndCtrlFocus(NULL, ID_MainListBox);//焦点移到列表框控件
       //ReLoadListCtrl(pMainListCtrl, *city[0], 1);
	//while(ListNextFileName(&filepos, FileExName, filename[i])){
       for(i=0;i<=4;){
	    strChar2Unicode(Ufilename,filename[i]);//将文件名转换为Unicode
		AddStringListCtrl(pMainListCtrl, Ufilename);//向列表框中添加表项
		strcpy(BmpFile[i],filename[i]);//将文件名存入文件名数组
		strncat(BmpFile[i++],FileExName,3);
	   }
	ReDrawOSCtrl();//重画控件
}
//

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[]={'1','2','3',0,'4','5','6',0,'7','8','9',0,':','0','\b',0};//键值映射表

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

	SetRect(&rect, 165,120,230,140);	//设置文本框
	pTextCtrl=CreateTextCtrl(ID_MainTextCtrl, &rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME,TimeKeyTable,NULL);//创建文本框

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

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









U8 onKey(int nkey, int fnkey);


void Main_Task(void *Id)             //Main_Test_Task
{
	POSMSG pMsg=0;//定义消息结构
         char bmpnamelogo[12]={'1','4','5','_','5','9',' ',' ','B','M','P',0}; 
	PDC pdc;
	pdc = CreateDC();
	ClearScreen();//清屏
	ShowBmp(pdc,bmpnamelogo, 1, 1);
	inifisnished=0;
	OSTimeDly(2000);
	ClearScreen();

	ClearScreen();//清屏
	
	CreateFileList(); //创建文件列表框
	CreateText();
	Rtc_Updata_Sem=OSSemCreate(1);
        	//OSTaskCreate(Rtc_Disp_Task,  (void *)0,  (OS_STK *)&Rtc_Disp_Stack[STACKSIZE-1],  Rtc_Disp_Task_Prio);	//5//创建时钟任务


	inifisnished=1;

	//消息循环
	for(;;){
		POS_Ctrl pCtrl;//定义控件结构指针
		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))
					break;
			default:
				OSOnSysMessage(pMsg);
				break;
			}
		}
		DeleteMessage(pMsg);//删除消息
	OSTimeDly(200);
	}
}


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 11://1
		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 15://Cancel
		if(input){
			SetTextCtrlEdit(pTextCtrl, FALSE);//退出编辑状态

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

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

	case 14://OK
		ClearScreen();

		pdc=CreateDC();//创建绘图设备上下文
		//ShowBmp(pdc, BmpFile[pMainListCtrl->CurrentSel], 140, 150);//显示图片
                  
                  
  		//Circle(pdc,200,60,40);
    		//MoveTo(pdc,200,60);
                  //LineTo(pdc,200,20);
  		
		ReDrawOSCtrl();//重画控件

		DestoryDC(pdc);

     		
		return TRUE;
	}
	return FALSE;

}


///////
void Rtc_Disp_Task(void *ID)
{	double i=0;
	int second,minute,hour,clock;
	int j=0,k=0,second_1=0,second_2=0,minute_1=0,minute_2=0,hour_1=0,hour_2=0,carry_number=0;
    //U16 pi=3.14159265357;
	//int a,b,c;
	int x1=0,y1=0;
	char Beijing[12]={'1','2','8','_','5','0',' ',' ','B','M','P',0};
	char Newyork[12]={'1','2','8','_','5','1',' ',' ','B','M','P',0};
	char Tehela[12]={'1','2','8','_','5','2',' ',' ','B','M','P',0};
	char Paris[12]={'1','2','8','_','5','3',' ',' ','B','M','P',0};
	char Tokyo[12]={'1','2','8','_','5','4',' ',' ','B','M','P',0};
	char Nju[12]={'1','2','8','_','5','5',' ',' ','B','M','P',0};
	//
	U16 strtime[10];
	U16 strtime2[10],Temp_second_1[1],Temp_second_2[1],Temp_minute_1[1],Temp_minute_2[1];
 	U16 Temp_hour_1[1],Temp_hour_2[1],Temp_hour_unicode1[1],Temp_hour_unicode2[1];
	U16 Temp_minute_unicode1[1],Temp_second_unicode[1],Temp_minute_unicode2[1];
	INT8U err;
         int nowclock;
   structTime *PstructTime;
        


	//
	PDC pdc;
         pdc=CreateDC();
 	if(inifisnished==0){OSTimeDly(2000);}

    	      
       for(;;){  j=pMainListCtrl->CurrentSel+1;






		
		//ShowBmp(pdc,BmpFile[j], 120, 120);

		listnumber=pMainListCtrl->CurrentSel+1;

	      Circle(pdc,200,60,55);
 	MoveTo(pdc,200,6);
	      SetPenColor(pdc,0);
	      SetPenWidth(pdc,3);
	      LineTo(pdc,200,8);

	      MoveTo(pdc,254,60);
	        SetPenColor(pdc,0);
	        SetPenWidth(pdc,3);
	        LineTo(pdc,252,60);

	     MoveTo(pdc,200,114);
	        SetPenColor(pdc,0);
	        SetPenWidth(pdc,3);
	        LineTo(pdc,200,113);

  	     MoveTo(pdc,146,60);
	        SetPenColor(pdc,0);
	        SetPenWidth(pdc,3);
	        LineTo(pdc,148,60);
	    

		if(Rtc_IsTimeChange(RTC_SECOND_CHANGE)){//不需要更新显示
			OSSemPend(Rtc_Updata_Sem, 0,&err);//等待信号量
			Rtc_Format("%H:%I:%S",strtime);//格式化时间

			Temp_hour_1[0]=strtime[0];
				    Temp_hour_2[0]=strtime[1];
                  hour_1=Unicode2Int(Temp_hour_1);
                  hour_2=Unicode2Int(Temp_hour_2);
				    Temp_minute_1[0]=strtime[3];
				    Temp_minute_2[0]=strtime[4];
                  minute_1=Unicode2Int(Temp_minute_1);
                  minute_2=Unicode2Int(Temp_minute_2);
				  k=(hour_1*10+hour_2)*60+minute_1*10+minute_2;
			switch(j)
                          ////
	        { case 1: //北京
				 		ShowBmp(pdc,Beijing, 120, 120);

⌨️ 快捷键说明

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