📄 main.c
字号:
* 功能: 初始化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 + -