📄 main.c
字号:
#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 + -