📄 新建 文本文档.txt
字号:
/****************************************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"
/* 按键消息邮箱 */
OS_EVENT *KeyMbox = NULL; // 按键消息邮箱 (直接使用其msg指针保存为按键值)
/* 定义8个图标结构变量 */
MENUICO mainmenu[8];
/* 按键值定义 */
#define KEY_LEFT 1
#define KEY_RIGHT 2
#define KEY_OK 4
#define TaskStkLengh 32 //Define the Task0 stack length 定义用户任务0的堆栈长度
OS_STK TaskStk0[TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈
OS_STK TaskStk1[TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈
OS_STK TaskStk2[TaskStkLengh];
OS_STK TaskStk3[TaskStkLengh];
void Task0(void *pdata); //Task0 任务0 (图形显示)
void Task1(void *pdata); //Task1 任务1 (按键输入)
void Task2(void *pdata);
void Task3(void *pdata);
/****************************************************************************
* 名称: main()
* 功能: 初始化uC/OS-II操作系统,建立第一个任务,建立一个消息邮箱,
* 然后启动系统。
****************************************************************************/
int main(void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 3);
OSTaskCreate(Task2,(void *)0,&TaskStk2[TaskStkLengh-1],4) ;
OSTaskCreate(Task3,(void *)0,&TaskStk3[TaskStkLengh-1],5) ;
KeyMbox = OSMboxCreate(NULL); // 建立一个邮箱,用于传递按键消息
OSStart ();
return 0;
}
/* 定义三个图标菜单的显示位置 */
#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; // 屏幕显示的第一个图标菜单序号
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++; // 选择项右移
if((s_select-s_menu_start) > 2)
{ s_menu_start++;
}
s_disp_sta = 1; // 需要更新显示
}
break;
case KEY_OK:
return(s_select); // 确定,返回所选菜单序号
default:
break;
} // end of switch(key)...
} // end of while(1)...
}
/****************************************************************************
* 名称: DemoMessage()
* 功能: 显示一个消息框(包含OK和CANCEL两个命令按钮),显示消息
* 为"Hello,ZLG/GUI",然后等待按键输入。
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void DemoMessage(void)
{ uint8 select;
uint8 *key;
uint8 err;
WINDOWS message;
message.x = 4; // 设置窗口位置和大小
message.y = 4;
message.with = 80;
message.hight = 40;
message.title = (uint8 *) "Demo"; // 窗口标题
message.state = (uint8 *) 0;
GUI_WindowsDraw(&message); // 显示对话框窗口
GUI_PutString(8, 15, "Hello,"); // 显示对话框的消息"Hello,ZLG/GUI"
GUI_PutString(8, 30, "ZLG/GUI!");
select = 0;
while(1)
{ if(select==0)
{
GUI_Button_OK1(30,15); // 选中"OK"按钮
GUI_Button_Cancle(30,30); // 取消"CANSEL"按钮的选中状态
}
else
{
GUI_Button_OK(30,15);
GUI_Button_Cancle1(30,30);
}
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;
extern uint8 *pic_all[][2]; // 图标资源(pic1--pic8)
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()
* 功能: 在屏幕上显示一个主窗口,大小为128x64。
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void DrawMainWindow(void)
{ WINDOWS mainw;
mainw.x = 0;
mainw.y = 0;
mainw.with = 84;
mainw.hight = 48;
mainw.title = (uint8 *) "HELLO"; // 窗口标题
mainw.state = NULL; // 状态栏不显示
GUI_WindowsDraw(&mainw); // 显示窗口
}
/*********************************************************************************************************
** Task0 任务0
** 功能:使用ZLG/GUI实现图标菜单演示。在LCD屏幕上显示图标菜单,
** 通过KEY2、KEY3按键选择菜单,通过KEY4按键确定选择。
** 说明:请将EasyARM2131开发板上的P0.17、P0.18、P0.19跳线器短
** 接到"KEY2"、"KEY3"、"KEY4"端。
********************************************************************************************************/
void Task0(void *pdata)
{ uint8 select;
RTCTime Time;
char Display[9];
pdata = pdata;
TargetInit ();
OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 2);
/* 初始化ZLG/GUI */
GUI_Initialize();
GUI_SetColor(1, 0) ;
/* 图标菜单初始化 */
MenuIcoInit();
/* 显示窗口 */
DrawMainWindow();
/* 循环调用图标菜单操作,并执行相应功能 */
while(1)
{ select = SelectMenuIco(); // 选择菜单
if(select<8)
{ (*mainmenu[select].Function)(); // 执行功能
}
OSTimeDly(1);
}
Time.RTC_Sec = 0; /* 秒 - [0,59] */
Time.RTC_Min = 0; /* 分 - [0,59] */
Time.RTC_Hour = 0; /* 小时 - [0,23] */
Time.RTC_Mday = 25; /* 当月天数- [1,31] */
Time.RTC_Mon = 4; /* 月 - [1,12] */
Time.RTC_Year = 2007; /* 年 - [0,4095] */
Time.RTC_Wday = 2; /* 星期- [0,6] */
Time.RTC_Yday = 156; /* 当年天数 - [1,365] */
RTCInit(); /**/
RTCSetTime(Time);
RTCStart();
while(1)
{
Time = RTCGetTime();
Display[0] = ((uint8)Time.RTC_Hour/10)+48;
Display[1] = ((uint8)Time.RTC_Hour%10)+48;
Display[2] = ':';
Display[3] = ((uint8)Time.RTC_Min/10)+48;
Display[4] = ((uint8)Time.RTC_Min%10)+48;
Display[5] = ':';
Display[6] = ((uint8)Time.RTC_Sec/10)+48;
Display[7] = ((uint8)Time.RTC_Sec%10)+48;
Display[8] = '\0';
GUI_PutString(8, 30, Display);
OSTimeDly(100);
}
}
/* 按键对应的I/O定义(P0口) */
#define IO_KEY2 (1<<17)
#define IO_KEY3 (1<<18)
#define IO_KEY4 (1<<19)
#define IO_KEYALL (IO_KEY2 | IO_KEY3 | IO_KEY4)
/*********************************************************************************************************
** Task1 任务1
** 功能: 等待一个按键,然后发送按键消息。具有去抖动功能和按键超时退出功能。
** 说明:按键和键值的对应关系如下
** KEY2 -------- KEY_LEFT
** KEY3 -------- KEY_RIGHT
** KEY3 -------- KEY_OK
********************************************************************************************************/
void Task1(void *pdata)
{ uint32 i;
uint32 io_dat;
uint8 key;
pdata = pdata;
while(1)
{ if((IO0PIN&IO_KEYALL) != IO_KEYALL) // 判断是否有按键
{ OSTimeDly(2); // 检测到有按键,延时去抖动
io_dat = IO0PIN;
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((IO0PIN&IO_KEYALL) == IO_KEYALL) break;
}
OSMboxPost(KeyMbox, (void *)key); // 发送按键消息
}// end of if((io_dat&IO_KEYALL) != IO_KEYALL)...
} // end of if((IO0PIN&IO_KEYALL) != IO_KEYALL)...
/* 无按键,短延时 */
OSTimeDly(100);
IO1CLR=(1<<18);
} // end of while(1)...
}
/*********************************************************************************************************
** Task1 任务1
** 功能: 等待一个按键,然后发送按键消息。具有去抖动功能和按键超时退出功能。
** 说明:按键和键值的对应关系如下
** KEY2 -------- KEY_LEFT
** KEY3 -------- KEY_RIGHT
** KEY3 -------- KEY_OK
********************************************************************************************************/
void Task2(void *pdata)
{
pdata = pdata;
while(1)
{
IO1SET=(1<<18);
OSTimeDly(10);
}
}
void Task3(void *pdata)
{
pdata = pdata;
while(1)
{
IO1CLR=(1<<18);
OSTimeDly(20);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -