📄 main.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 + -