?? main.c
字號(hào):
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#define LCM_LEDCON (1<<22)
/* 按鍵消息郵箱 */
OS_EVENT *KeyMbox = NULL; // 按鍵消息郵箱 (直接使用其msg指針保存為按鍵值)
/* 定義8個(gè)圖標(biāo)結(jié)構(gòu)變量 */
MENUICO mainmenu[8];
/* 按鍵值定義 */
#define KEY_LEFT 1
#define KEY_RIGHT 2
#define KEY_OK 3
#define TaskStkLengh 160 //Define the Task0 stack length 定義用戶任務(wù)0的堆棧長(zhǎng)度
OS_STK TaskStk0[TaskStkLengh]; //Define the Task0 stack 定義用戶任務(wù)0的堆棧
OS_STK TaskStk1[TaskStkLengh]; //Define the Task1 stack 定義用戶任務(wù)1的堆棧
void Task0(void *pdata); //Task0 任務(wù)0 (圖形顯示)
void Task1(void *pdata); //Task1 任務(wù)1 (按鍵輸入)
/****************************************************************************
* 名稱: main()
* 功能: 初始化uC/OS-II操作系統(tǒng),建立第一個(gè)任務(wù),建立一個(gè)消息郵箱,
* 然后啟動(dòng)系統(tǒng)。
****************************************************************************/
int main(void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 3);
KeyMbox = OSMboxCreate(NULL); // 建立一個(gè)郵箱,用于傳遞按鍵消息
OSStart ();
return 0;
}
/* 定義三個(gè)圖標(biāo)菜單的顯示位置 */
#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個(gè)圖標(biāo)菜單,并實(shí)現(xiàn)菜單選擇顯示。
* 入口參數(shù): start 顯示3個(gè)圖標(biāo)菜單的第一個(gè)菜單序號(hào)
* select 當(dāng)前所選中的菜單序號(hào)
* disp_all 全部更新控制(非0值時(shí),3個(gè)圖標(biāo)菜單重新顯示)
* 出口參數(shù): 無(wú)
****************************************************************************/
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;
/* 設(shè)置圖標(biāo)顯示位置 */
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;
/* 設(shè)置選擇的圖標(biāo),然后顯圖標(biāo) */
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]);
}
/* 設(shè)置新的選擇 */
mainmenu[select].state = 1;
GUI_MenuIcoDraw(&mainmenu[select]);
s_select_old = select;
}
}
/****************************************************************************
* 名稱: SelectMenuIco()
* 功能: 選擇圖標(biāo)菜單。在屏幕上同時(shí)顯示三個(gè)圖標(biāo)菜單,然后等待按鍵操作,
* 當(dāng)確定選擇后返回所選的菜單序號(hào)(0--7)。
* 入口參數(shù): 無(wú)
* 出口參數(shù): 返回值即是所選的菜單項(xiàng)(序號(hào))
****************************************************************************/
uint8 SelectMenuIco(void)
{ static uint8 s_menu_start = 0; // 屏幕顯示的第一個(gè)圖標(biāo)菜單序號(hào)
static uint8 s_select = 0; // 當(dāng)前所選擇的圖標(biāo)菜單序號(hào)
uint8 s_disp_sta = 0; // 需要更新顯示標(biāo)志
void *key;
uint8 err;
// 顯示當(dāng)前選擇菜單
DrawSelectMenuIco(s_menu_start, s_select, 1);
while(1)
{ /* 若更新了選擇的菜單項(xiàng),則調(diào)用DrawSelectMenuIco顯示當(dāng)前選擇菜單 */
if(s_disp_sta!=0)
{ DrawSelectMenuIco(s_menu_start, s_select, 0);
s_disp_sta = 0;
}
/* 讀取一按鍵 */
key = OSMboxPend(KeyMbox, 0, &err);
/* 分析按鍵并作相應(yīng)操作 */
switch((int)key)
{ case KEY_LEFT:
if(s_select!=0)
{ s_select--; // 選擇項(xiàng)左移
/* 判斷是否需要更新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++; // 選擇項(xiàng)右移
if((s_select-s_menu_start) > 2)
{ s_menu_start++;
}
s_disp_sta = 1; // 需要更新顯示
}
break;
case KEY_OK:
return(s_select); // 確定,返回所選菜單序號(hào)
default:
break;
} // end of switch(key)...
} // end of while(1)...
}
/****************************************************************************
* 名稱: DemoMessage()
* 功能: 顯示一個(gè)消息框(包含OK和CANCEL兩個(gè)命令按鈕),顯示消息
* 為"Hello,ZLG/GUI",然后等待按鍵輸入。
* 入口參數(shù): 無(wú)
* 出口參數(shù): 無(wú)
****************************************************************************/
void DemoMessage(void)
{ uint8 select;
uint8 *key;
uint8 err;
WINDOWS message;
message.x = 5; // 設(shè)置窗口位置和大小
message.y = 14;
message.with = 120;
message.hight = 48;
message.title = (uint8 *) "Message for Demo"; // 窗口標(biāo)題
message.state = (uint8 *) 0;
GUI_WindowsDraw(&message); // 顯示對(duì)話框窗口
GUI_PutString(8, 35, "Hello,"); // 顯示對(duì)話框的消息"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); // 取消"CANCEL"按鈕的選中狀態(tài)
}
else
{ GUI_Button_OK(72,29);
GUI_Button_Cancle1(72,45);
}
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結(jié)構(gòu)數(shù)組。即初始化各圖標(biāo)變量的成員,如圖標(biāo)
* 圖形點(diǎn)陣數(shù)據(jù)指針,圖標(biāo)標(biāo)題點(diǎn)陣數(shù)據(jù)指針,相應(yīng)的功能函數(shù)等等。
* 入口參數(shù): 無(wú)
* 出口參數(shù): 無(wú)
****************************************************************************/
void MenuIcoInit(void)
{ int i;
extern uint8 *pic_all[][2]; // 圖標(biāo)資源(pic1--pic8)
for(i=0; i<8; i++)
{ /* 初始化為末選中狀態(tài) */
mainmenu[i].state = 0;
/* 連接相應(yīng)的圖標(biāo)數(shù)據(jù) */
mainmenu[i].icodat = (uint8 *) pic_all[i][0];
mainmenu[i].title = (uint8 *) pic_all[i][1];
/* 連接菜單功能函數(shù) */
mainmenu[i].Function = ( void(*) (void) ) DemoMessage;
}
}
/****************************************************************************
* 名稱: DrawMainWindow()
* 功能: 在屏幕上顯示一個(gè)主窗口,大小為128x64。
* 入口參數(shù): 無(wú)
* 出口參數(shù): 無(wú)
****************************************************************************/
void DrawMainWindow(void)
{ WINDOWS mainw;
mainw.x = 0;
mainw.y = 0;
mainw.with = 128;
mainw.hight = 64;
mainw.title = (uint8 *) "MenuIco Demo"; // 窗口標(biāo)題
mainw.state = NULL; // 狀態(tài)欄不顯示
GUI_WindowsDraw(&mainw); // 顯示窗口
}
/*********************************************************************************************************
** Task0 任務(wù)0
** 功能:使用ZLG/GUI實(shí)現(xiàn)圖標(biāo)菜單演示。在LCD屏幕上顯示圖標(biāo)菜單,
** 通過(guò)KEY2、KEY3按鍵選擇菜單,通過(guò)KEY4按鍵確定選擇。
********************************************************************************************************/
void Task0(void *pdata)
{ uint8 select;
pdata = pdata;
TargetInit ();
IO1DIR = LCM_LEDCON;
IO1SET = LCM_LEDCON;
OSTimeDly(50);
// 顯示按鍵的鍵值"Hit 00"
ZLG7290ShowChar(7, 0x11);
ZLG7290ShowChar(6, 0x12);
ZLG7290ShowChar(5, 0x19);
ZLG7290ShowChar(1, 0x00);
ZLG7290ShowChar(0, 0x00);
OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 2);
/* 初始化ZLG/GUI */
GUI_Initialize();
GUI_SetColor(1, 0);
/* 圖標(biāo)菜單初始化 */
MenuIcoInit();
/* 顯示窗口 */
DrawMainWindow();
/* 循環(huán)調(diào)用圖標(biāo)菜單操作,并執(zhí)行相應(yīng)功能 */
while(1)
{ select = SelectMenuIco(); // 選擇菜單
if(select<8)
{ (*mainmenu[select].Function)(); // 執(zhí)行功能
}
OSTimeDly(1);
}
}
/*********************************************************************************************************
** Task1 任務(wù)1
** 功能: 等待一個(gè)按鍵,然后發(fā)送按鍵消息。具有去抖動(dòng)功能和按鍵超時(shí)退出功能。
** 說(shuō)明:按鍵和鍵值的對(duì)應(yīng)關(guān)系如下
** S1 -------- KEY_LEFT
** S2 -------- KEY_RIGHT
** S3 -------- KEY_OK
********************************************************************************************************/
void Task1(void *pdata)
{ uint16 Key;
pdata = pdata;
while(1)
{ Key = ZLG7290GetKey();
if (Key == 0 || Key >= 0x100)
{
OSTimeDly(OS_TICKS_PER_SEC / 100);
continue;
}
OSMboxPost(KeyMbox, (void *)Key); // 發(fā)送按鍵消息
OSTimeDly(OS_TICKS_PER_SEC / 3); // 延時(shí)(防止按鍵連擊)
} // end of while(1)...
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -