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

📄 main.c

📁 UCOS-2.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
* 功能: 初始化uC/OS-II操作系统,建立第一个任务,然后启动系统。
****************************************************************************/
int main(void)
{
	OSInit ();																										
	OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 3);	
	KeyMbox=OSMboxCreate(NULL);         //建立一个邮箱,用于传递按键消息	
	OSStart ();
	return 0;															
}
/***定义3个图标菜单的显示位置***/
#define	   ICO1_X      7
#define	   ICO1_Y      14
#define	   ICO2_X      (ICO1_X+41)
#define	   ICO2_Y      ICO1_Y
#define	   ICO3_X      (ICO2_X+41)
#define	   ICO3_Y      ICO1_Y

/****************************************************************************
** 名称: DrawSelectMenuIco()
** 功能: 在屏幕上指定位置上显示3个图标菜单,并实现菜单选择显示
** 入口参数: start        显示3个图标菜单的第一个菜单序号
              select       当前所选中的菜单序号
              disp_all     全部更新控制(非0值时,3个图标菜单重新显示)
** 出口参数: 无    
****************************************************************************/

void  DrawSelectMenuIco(uint8  start,uint8  select,uint8  disp_all)
{ 
    static   uint8    s_start_no=255;
    static   uint8    s_select_old=255;
    
    
    
    /***判断是否要全部更新显示***/
    if((s_start_no!=start)||(disp_all!=0))        //需要全部更新
     {
        s_start_no=start;
        s_select_old=select;
        
        
        /***设置图标的显示位置***/
        mainmenu[start].x=ICO1_X;
        mainmenu[start].y=ICO1_Y;
        mainmenu[start+1].x=ICO2_X;
        mainmenu[start+1].y=ICO2_Y;
        mainmenu[start+2].x=ICO3_X;
        mainmenu[start+2].y=ICO3_Y;
        
        
        
        /***设置选择的图标,然后显示图标***/
        mainmenu[start].state=0;
        mainmenu[start+1].state=0;
        mainmenu[start+2].state=0;
        mainmenu[select].state=1;
        GUI_MenuIcoDraw(&mainmenu[start]);
        GUI_MenuIcoDraw(&mainmenu[start+1]);
        GUI_MenuIcoDraw(&mainmenu[start+2]);
     }
     
    else
     {
       /***清除旧的选择***/
       if(s_select_old<8)
        {
          mainmenu[s_select_old].state=0;
          GUI_MenuIcoDraw(&mainmenu[s_select_old]);
          
        }
        
        
       /***设置新的选择***/
       mainmenu[select].state=1;
       GUI_MenuIcoDraw(&mainmenu[select]);
       s_select_old=select;
     }
}
/****************************************************************************
** 名称:     SelectMenuIco()
** 功能:     选择图标菜单。在屏幕上同时显示三个图标菜单,然后等待按键操作,
             当确定选择后,返回所选的菜单序号(0~7)
** 入口参数:无
** 出口参数:返回值即是所选的菜单(序号)
****************************************************************************/
uint8  SelectMenuIco(void)
{  
   static   uint8    s_menu_start=0;             //屏幕显示的第1个图标菜单序号
   static   uint8    s_select=0;                 //当前所选择的图标菜单序号
   
   
   uint8  s_disp_sta=0;                          //需要更新显示的标志
   void   *key;
   uint8  err;
   
   /*显示当前选择的菜单*/
   DrawSelectMenuIco(s_menu_start,s_select,1);
   while(1)
   {
     /*若更新了选择的菜单项,则调用DrawSelectMenuIco显示当前选择菜单*/
     if(s_disp_sta!=0)
     {
       DrawSelectMenuIco(s_menu_start,s_select,0);
       s_disp_sta=0;
     }
     
     /*读取一个按键*/
     key=OSMboxPend(KeyMbox,0,&err);
     
     /*分析按键并作相应的操作*/
     
     switch((int)key)
     {
       case  KEY_LEFT:
           if(s_select!=0)
             {
                s_select--;                //选择项左移
                
                
                /*判断是否需要更新s_menu_start*/
                if(s_select<s_menu_start)
                {
                   s_menu_start=s_select;
                }
                s_disp_sta=1;              //需要更新显示
             }
             break;
      case  KEY_RIGHT:
           if(s_select<7)
             {
                s_select++;                //选择项右移
                
                
                /*判断是否需要更新s_menu_start*/
                if((s_select-s_menu_start)>2)
                {
                   s_menu_start++;
                }
                s_disp_sta=1;              //需要更新显示
             }
             break;
     case  KEY_OK: 
           return(s_select);               //确定,返回所选菜单序号
     default:
           break;
    }
  }
 }
/****************************************************************************
** 名称:     DemoMessage()
** 功能:     显示一个消息框(包含OK和CANSEL两个命令按纽),显示消息
             为"Hello,ZLG/GUI",然后等待按键输入
** 入口参数:无
** 出口参数:无
****************************************************************************/ 
void   DemoMessage(void)
{
   uint8  select;
   uint8  *key;
   uint8  err;
   
   WINDOWS  message;
   
   message.x=0;                                 //设置窗口的位置和大小
   message.y=0;
   message.with=128;
   message.hight=64;
   message.title=(uint8*)"Message for Demo";    //窗口标题
   message.state=(uint8*)0;
   GUI_WindowsDraw(&message);                   //显示对话框窗口
   GUI_PutString(8,35,"Hello,");                //显示对话框的消息"Hello,ZLG/GUI"           
   GUI_PutString(8,45,"ZLG/GUI!");
   
   select=0;
   while(1)
   {
     if(select==0)
     {
       GUI_Button_OK1(72,29);                   //选中OK按钮
       GUI_Button_Cancle(72,45);                //取消CANSEL按钮的选中状态
     }
     else
     {
       GUI_Button_OK(72,29);                    //取消OK按钮的选中状态
       GUI_Button_Cancle1(72,45);               //选中CANSEL按钮
     }
     
     
     key=OSMboxPend(KeyMbox,0,&err);
     
     
     
     if(((int)key==KEY_LEFT)||((int)key==KEY_RIGHT))
     {
       select=1-select;
     }
     
     
     if((int)key==KEY_OK)
     {
       // GUI_WindowsHide(&message);              //清除窗口显示
        return;
     }
  }
}
/****************************************************************************
** 名称:     MenuIcoInit()
** 功能:     初始化mainmenu结构数组。即初始化各图标变量的成员,如图标
             图形点阵数据指针、图标标题点阵数据指针及相应的功能函数等
** 入口参数:无
** 出口参数:无
****************************************************************************/ 
void   MenuIcoInit(void)
{
   int i;   
   for(i=0;i<8;i++)
   {  /*初始化为未选中的状态*/ 
      mainmenu[i].state=0;
      
      
      /*连接相应的图标数据*/
      mainmenu[i].icodat=(uint8*)pic_all[i][0]; 
      mainmenu[i].title=(uint8*)pic_all[i][1];
      /*连接菜单功能函数*/
      mainmenu[i].Function=(void(*)(void))DemoMessage;
   }
   
}

/****************************************************************************
** 名称:     DrawMainWindow(void)
** 功能:     在屏幕上显示一个主窗口,大小为128X64
** 入口参数:无
** 出口参数:无
****************************************************************************/
void  DrawMainWindow(void)
{

   
    WINDOWS   mainw;
    mainw.x=0;
    mainw.y=0;
    mainw.with=128;
    mainw.hight=64;
    mainw.title=(uint8*)NULL;
    mainw.state=NULL; 
    GUI_WindowsDraw(&mainw);
    
}
/****************************************************************************
** 名称:     Task0任务0
** 功能:     
** 入口参数:无
** 出口参数:无
****************************************************************************/ 

void  Task0(void  *pdata)
{
   uint8   select;
   
   pdata=pdata;
   TargetInit();
   OSTaskCreate(Task1,(void*)0,&TaskStk1[TaskStkLengh-1],2);
   
   GUI_Initialize();
   GUI_SetColor(1,0);
   
   
   MenuIcoInit();
   
   
   DrawMainWindow();
   
   
   while(1)
   {
     
     select=SelectMenuIco();
     
     
     if(select<8)
     {
        (*mainmenu[select].Function)();
         DrawMainWindow();
     }
     OSTimeDly(1);
   }
}


#define    IO_KEY2    (1<<17)
#define    IO_KEY3    (1<<18)
#define    IO_KEY4    (1<<19)
#define    IO_KEYALL  (IO_KEY2|IO_KEY3|IO_KEY4)



void   Task1(void *pdata)
{ 
    uint32  i;
    uint32  io_dat;
    uint8   key;
    
    pdata=pdata;
    PINSEL2= 0x00000000; 
    IO1DIR = 0x00000000;
    while(1)
    {
       if((IO1PIN&IO_KEYALL)!=IO_KEYALL)
       {
         OSTimeDly(2);
         io_dat=IO1PIN;
        if((io_dat&IO_KEYALL)!=IO_KEYALL)
        { 
         if((io_dat&IO_KEY2)==0)key=KEY_LEFT;
         if((io_dat&IO_KEY3)==0)key=KEY_RIGHT; 
         if((io_dat&IO_KEY4)==0)key=KEY_OK;
         
         
         for(i=0;i<10000000;i++)
         {
            if((IO1PIN&IO_KEYALL)==IO_KEYALL) break;
         }
         OSMboxPost(KeyMbox,(void*)key);
        }
       }
       
      OSTimeDly(10); 
    }
}
              
  

⌨️ 快捷键说明

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