📄 main.c
字号:
/****************************************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 64 //Define the Task0 stack length 定义用户任务0的堆栈长度
OS_STK TaskStk0[TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈
OS_STK TaskStk1[TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈
void Task0(void *pdata); //Task0 任务0 (图形显示)
void Task1(void *pdata); //Task1 任务1 (按键输入)
uint32 ADC_Data;
uint32 bx[100];
/****************************************************************************
* 名称: DrawMainWindow()
* 功能: 在屏幕上显示一个主窗口,大小为128x64。
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void DrawMainWindow(void)
{ WINDOWS mainw;
mainw.x = 0;
mainw.y = 0;
mainw.with = 128;
mainw.hight = 64;
mainw.title = (uint8 *) "guo zhi qiang"; // 窗口标题
mainw.state = NULL; // 状态栏不显示
GUI_WindowsDraw(&mainw); // 显示窗口
}
/****************************************************************************
* 名称: main()
* 功能: 初始化uC/OS-II操作系统,建立第一个任务,建立一个消息邮箱,
* 然后启动系统。
****************************************************************************/
int main(void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 3);
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) // 注意int的作用
{ 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)...
}
/***************************************************************
* 函数 Sent_Num
* 功能 将0~9数字形式转化为字符类型
***************************************************************/
void Sent_Num(uint32 x,uint32 y,uint8 num)
{
switch(num)
{
case 0:
GUI_PutChar(x,y,'0');
break;
case 1:
GUI_PutChar(x,y,'1');
break;
case 2:
GUI_PutChar(x,y,'2');
break;
case 3:
GUI_PutChar(x,y,'3');
break;
case 4:
GUI_PutChar(x,y,'4');
break;
case 5:
GUI_PutChar(x,y,'5');
break;
case 6:
GUI_PutChar(x,y,'6');
break;
case 7:
GUI_PutChar(x,y,'7');
break;
case 8:
GUI_PutChar(x,y,'8');
break;
case 9:
GUI_PutChar(x,y,'9');
break;
default:
break;
}
}
/****************************************************************************/
void GUI_RTC_Data(uint32 x,uint32 y,uint8 RTC_data) // 俩为数转化
{
uint8 i;
i=RTC_data/10; // 十位数
Sent_Num(x,y,i);
x+=6;
i=RTC_data%10; // 个位数
Sent_Num(x,y,i);
return ;
}
/*****************************************************************************/
void Time_change(void) // 刷新时间
{
uint32 datas;
uint32 times;
uint32 bak;
times = CTIME0; // 读取完整的时间寄存器
datas = CTIME1;
bak = (datas>>8)&0x0f; // 显示月
GUI_RTC_Data(63,17,bak);
bak = datas & 0x1f; // 显示日
GUI_RTC_Data(93,17,bak);
bak = (times>>16) & 0x1f; // 显示小时
GUI_RTC_Data(33,31,bak);
bak = (times>>8) & 0x3f; // 显示分钟
GUI_RTC_Data(63,31,bak);
bak = times & 0x3f; // 显示秒
GUI_RTC_Data(93,31,bak);
return ;
}
/*******************************************************************************/
void RTCInit (void)
{
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器
PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
CCR = 0x00; // 禁止时间计数器
YEAR = 2007;
MONTH = 9;
DOM = 22;
DOW = 4;
HOUR = 18;
MIN = 30;
SEC = 59;
CIIR = 0x01; // 设置秒值的增量产生1次中断
CCR = 0x01; // 启动RTC
}
/**************************************************************************************
* 函数 time_play()
* 功能 时钟显示
**************************************************************************************/
void time_play(void)
{
GUI_PutString(21, 17, "2007");
GUI_PutString(51, 31, ":");
GUI_PutString(81, 31, ":");
if(0 != (ILR & 0x01)) // 假如秒钟中断产生,则时间刷新一次
{
ILR = 0x01;
Time_change();
}
}
/**************************************************************************************
* 函数 display()
* 功能 实事时钟显示窗口
**************************************************************************************/
void display_time(void)
{ uint8 select;
uint8 *key;
uint8 err;
WINDOWS message_t;
message_t.x = 2; // 设置窗口位置和大小
message_t.y = 2;
message_t.with = 124;
message_t.hight = 60;
message_t.title = (uint8 *) "real time"; // 窗口标题
message_t.state = (uint8 *) 0;
GUI_WindowsDraw(&message_t); // 显示对话框窗口
select = 0;
while(1)
{
time_play(); // 显示时间
if(select==0)
{ GUI_Button_OK1(10,45); // 选中"OK"按钮
GUI_Button_Cancle(67,45); // 取消"CANSEL"按钮的选中状态
}
else
{ GUI_Button_OK(10,45);
GUI_Button_Cancle1(67,45);
}
key = OSMboxPend(KeyMbox, 0xbf, &err);
if( ((int)key==KEY_LEFT)||
((int)key==KEY_RIGHT) )
{ select = 1- select;
}
if((int)key==KEY_OK) // // 有待改进// //
{
GUI_WindowsHide(&message_t); // 清除窗口显示
return;
}
}
}
/****************************************************************************
* 名称: DemoMessage_0()
* 功能: 显示一个消息框(包含OK和CANCEL两个命令按钮),显示消息
* 为"Hello,ZLG/GUI",然后等待按键输入。
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void DemoMessage_0(void)
{ uint8 select;
uint8 *key;
uint8 err;
WINDOWS message_0;
message_0.x = 5; // 设置窗口位置和大小
message_0.y = 14;
message_0.with = 120;
message_0.hight = 48;
message_0.title = (uint8 *) "real time"; // 窗口标题
message_0.state = (uint8 *) 0;
GUI_WindowsDraw(&message_0); // 显示对话框窗口
GUI_PutString(8, 35, "welcome:"); // 显示对话框的消息"Hello,ZLG/GUI"
GUI_PutString(8, 45, "time !");
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);
GUI_Button_Cancle1(72,45);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -