中科因仑“3+1”工程特种兵精英论坛
标题:
430也要GUI之一: 多级文本菜单开源
[打印本页]
作者:
XJzy
时间:
2015-10-6 00:37
标题:
430也要GUI之一: 多级文本菜单开源
430也要GUI之一: 多级文本菜单开源
提起GUI,可能有不少朋友选择去移植UCGUI之类的东西,不过在我看来,自己写一个GUI也是一个不错的选择,功能实用就好,只要能很好的完成人机交互的任务就可以了。
多级文本菜单是经常用到的一种功能选择方式,这里给出一个完整的实现源码,显示设备是240×320的彩色TFT液晶,改成其它分辨率的应该也很容易,输入是键盘。这个菜单程序理论上支持无限级菜单,使用的时候写一个菜单资源文件就可以了;支持用户权限控制,也就是说,可以设置不同级别的登录密码,所能看到的菜单项可以按登录级别区分;可以支持动态生成的菜单,比如说查询记录项之类。
GUI要有良好的用户感受,基础条件是要有足够的执行速度和内存容量。不幸的是,这2点对于大多数430单片机来说都是弱项。对于149级别的MCU,用这个程序的话,建议还是用到128×128以下的单色液晶上比较好,如果用到彩色液晶上,那么滚屏显示菜单项绝对会是噩梦级的感受。如果是5x级别的,情况就好的多,240×320的彩色液晶上完全可以跑的很流畅。
多级文本菜单.jpg
(30.02 KB, 下载次数: 0)
下载附件
保存到相册
多级文本菜单
2015-4-6 16:07 上传
MAIN.C
//===========================================================================//
// //
// 文件: MAIN.C //
// 说明: BW-DK5438开发板多级文本菜单应用程序 //
// 编译: IAR Embedded Workbench IDE for MSP430 v4.21 //
// 版本: v1.1 //
// 编写: JASON.ZHANG //
// 版权: 北京拓普博维电子技术有限公司 //
// //
//===========================================================================//
#include "main.h"
#pragma vector=TIMERB1_VECTOR
__interrupt void TIMERB1_ISR(void)
{
VmainMon() ;
Event |= SHOULD_FLICKER ;
TBCTL &= ~TBIFG ;
}
#pragma vector=RTC_VECTOR
__interrupt void RTC_ISR(void)
{
RTCCTL01 &=~(RTCRDYIFG + RTCTEVIFG) ;
Event |= SHOULD_DISPLAY_TIME ;
}
void main(void)
{
WDTCTL = WDTPW+WDTHOLD ;
Init_Func() ;
Init() ;
MAIN_POWER_ON ;
for(;;)
{
LCD_Init() ;
Clear_LCD(Color_BK) ;
_EINT() ;
RunMenu() ;
}
}
//=====================================================================//
// //
//函数:void RunMenu(void) //
//描述:执行菜单调度 //
// //
//=====================================================================//
void RunMenu(void)
{
unsigned char key = 0xFF , menu_index , SubMenuIndex ;
unsigned char First_Item , Active_Item , Active_Item_Index ;
unsigned char CallBackIndex ;
Clear_LCD(STATUS_BK_COLOR) ;
Color_BK = STATUS_BK_COLOR ;
PutStringCN24(10,294,"确认") ; // 底栏
PutStringCN24(185,294,"取消") ;
LoadMenu(MENU_MAIN,PERMISSION) ;
Initial_Menu() ;
DisplayTime() ;
for(;;)
{
key = GetKeyPress() ;
switch(key)
{
case Up: case Down: case Left: case Right:
MenuMessage(key) ;
break ;
case 8:
MenuMessage(Up) ;
break ;
case 0:
MenuMessage(Down) ;
break ;
case Esc:
{
menu_index = GetMenuIndex() ;
if(Menus[menu_index].MasterMenu!=EMPTY)
{
LoadMenu(Menus[menu_index].MasterMenu,PERMISSION) ;
Initial_Menu() ;
}
break ;
}
case OK: case Enter:
{
First_Item = GetFirstItem() ;
Active_Item = GetActiveItem() ;
Active_Item_Index = GetActiveItemIndex() ;
if(MENU_ITEM[Active_Item_Index].CallBackFuncIndex!=EMPTY) // 有操作函数
{
CallBackIndex= MENU_ITEM[Active_Item_Index].CallBackFuncIndex ;
SubMenuIndex = MENU_ITEM[Active_Item_Index].SubMenuIndex ;
if(SubMenuIndex!=EMPTY) // 有操作函数且有动态子菜单
{
SubMenuIndex = MENU_ITEM[Active_Item_Index].SubMenuIndex ;
if(Item_OP[CallBackIndex](0,Active_Item_Index )==0x00) // 生成子菜单成功
Initial_Menu() ; // 初始化动态子菜单
else
Redraw_Menu(First_Item,Active_Item) ; // 未生成子菜单,重画原菜单
}
else
{
Item_OP[CallBackIndex](0,Active_Item_Index ) ; // 无动态子菜单
Redraw_Menu(First_Item,Active_Item) ; // 重画菜单
}
}
else
if(MENU_ITEM[Active_Item_Index].SubMenuIndex!=EMPTY)
{
LoadMenu(MENU_ITEM[Active_Item_Index].SubMenuIndex,PERMISSION) ;
Initial_Menu() ;
}
break ;
}
case Power:
return ;
default:
break ;
}
}
}
//=====================================================================//
// //
//函数:Show_Help(NC1,NC2) //
//描述:显示帮助信息 //
// //
//=====================================================================//
unsigned char Show_Help(unsigned int NC1,unsigned char NC2)
{
unsigned char key ;
DrawRectFill(0,60,240,230,WINDOW_BK_COLOR) ;
DrawRectFill(0,30 ,240,30 ,WINDOW_COLOR) ;
Color = TITLE_COLOR ;
Color_BK = TITLE_BK_COLOR ;
PutStringCN24(70,33,"帮助信息") ;
DrawRectFill(0,290,240,30,STATUS_BK_COLOR) ;
Color = STATUS_COLOR ;
Color_BK = STATUS_BK_COLOR ;
PutStringCN24(185,294,"返回") ;
Color = WINDOW_COLOR ;
Color_BK = WINDOW_BK_COLOR ;
DrawRectFill(0,60,240,230,WINDOW_BK_COLOR) ;
PutString24M(10,70 ,"↑键:[8]") ;
PutString24M(10,100,"↓键:[0]") ;
PutString24M(10,130,"菜单选择:[Enter]") ;
PutString24M(10,160,"菜单返回:[Cancel]") ;
PutString24M(10,190,"上 一 页:[←]") ;
PutString24M(10,220,"下 一 页:[→]") ;
PutString24M(10,250,"输入法切换:
") ;
for(;;)
{
key = ReadKey() ;
if(key==Esc) break ;
}
DrawRectFill(0,290,240,30,STATUS_BK_COLOR) ;
Color_BK = STATUS_BK_COLOR ;
Color = STATUS_COLOR ;
PutStringCN24(10,294,"确认") ; // 底栏
Color = WINDOW_COLOR ;
Color_BK = WINDOW_BK_COLOR ;
return 0x00 ;
}
//=====================================================================//
// //
//函数:Set_Time(NC1,NC2) //
//说明:演示函数,显示时间设置成功 //
// //
//=====================================================================//
unsigned char Set_Time(unsigned int NC1,unsigned char NC2)
{
DrawRectFill(0,60,240,230,WINDOW_BK_COLOR) ;
DrawRectFill(0,30 ,240,30 ,WINDOW_COLOR) ;
Color = TITLE_COLOR ;
Color_BK = TITLE_BK_COLOR ;
PutStringCN24(70,33,"设置时间") ;
DrawRectFill(0,290,240,30,STATUS_BK_COLOR) ;
Color = STATUS_COLOR ;
Color_BK = STATUS_BK_COLOR ;
PutStringCN24(185,294,"返回") ;
Color = WINDOW_COLOR ;
Color_BK = WINDOW_BK_COLOR ;
DrawRectFill(0,60,240,230,WINDOW_BK_COLOR) ;
MessageBox("信息提示","时间已设置成功") ;
return 0x00 ;
}
//=====================================================================//
// //
//函数:Set_Backlight(NC1,NC2) //
//说明:演示函数,显示背光已设置 //
// //
//=====================================================================//
unsigned char Set_Backlight(unsigned int NC1,unsigned char NC2)
{
DrawRectFill(0,60,240,230,WINDOW_BK_COLOR) ;
DrawRectFill(0,30 ,240,30 ,WINDOW_COLOR) ;
Color = TITLE_COLOR ;
Color_BK = TITLE_BK_COLOR ;
PutStringCN24(70,33,"设置背光") ;
DrawRectFill(0,290,240,30,STATUS_BK_COLOR) ;
Color = STATUS_COLOR ;
Color_BK = STATUS_BK_COLOR ;
PutStringCN24(185,294,"返回") ;
Color = WINDOW_COLOR ;
Color_BK = WINDOW_BK_COLOR ;
DrawRectFill(0,60,240,230,WINDOW_BK_COLOR) ;
MessageBox("信息提示","背光已设置成功") ;
return 0x00 ;
}
//=====================================================================//
// //
//函数:View_Board_Info(NC1,NC2) //
//描述:显示帮助信息 //
// //
//=====================================================================//
unsigned char View_Board_Info(unsigned int NC1,unsigned char NC2)
{
DrawRectFill(0,60,240,230,WINDOW_BK_COLOR) ;
DrawRectFill(0,30 ,240,30 ,WINDOW_COLOR) ;
Color = TITLE_COLOR ;
Color_BK = TITLE_BK_COLOR ;
PutStringCN24(70,33,"开发板信息") ;
DrawRectFill(0,290,240,30,STATUS_BK_COLOR) ;
Color = STATUS_COLOR ;
Color_BK = STATUS_BK_COLOR ;
PutStringCN24(185,294,"返回") ;
Color = WINDOW_COLOR ;
Color_BK = WINDOW_BK_COLOR ;
DrawRectFill(0,60,240,230,WINDOW_BK_COLOR) ;
MessageBox("信息提示","BW_DK5438") ;
return 0x00 ;
}
//=====================================================================//
//函数:void VmainMon(void) —主电池电压检测 //
//=====================================================================//
void VmainMon(void)
{
static unsigned char i = 0 ;
static float Vmain = 0 ;
ADC12CTL0 |= ADC12SC ;
while (!(ADC12IFG & BIT0)) ;
Vmain += ADC12MEM0*7.5/4095-0.4 ;
if(++i==10)
{
Vmain /= 10 ;
VmainAvr = Vmain ;
Vmain = 0 ;
i = 0 ;
}
}
//=====================================================================//
//函数:void VmainMon(void) —显示主电源电量 //
//=====================================================================//
void DrawBattery(float voltage)
{
DrawRectFill(213,8,24,12,STATUS_BK_COLOR) ;
DrawRect(213,11,3,6,Green) ;
DrawRect(215,8,20,12,Green) ;
if(voltage>3.2)
DrawRectFill(217,10,4,9,Green) ;
if(voltage>3.0)
DrawRectFill(223,10,4,9,Green) ;
if(voltage>2.8)
DrawRectFill(229,10,4,9,Green) ;
}
//=====================================================================//
//函数:void ReadKey(void) —读取按键 //
//=====================================================================//
unsigned char ReadKey(void)
{
unsigned char column,row,key ;
unsigned char Key ;
ROW_IN_COL_OUT ;
row = KEY_PORT_IN&(KPR0+KPR1+KPR2+KPR3) ;
if(row!=(KPR0+KPR1+KPR2+KPR3))
{
CLO_IN_ROW_OUT ;
column = KEY_PORT_IN&(KPC0+KPC1+KPC2+KPC3) ;
ROW_IN_COL_OUT ;
Key = row + column ;
_NOP();
switch(Key)
{
case 0x7E:
key = Enter ;
break ;
case 0x7D:
key = Cancel ;
break ;
case 0x02FE:
key = Up ;
break ;
case 0x02FD:
key = Down ;
break ;
case 0xEE:
key = Left ;
break ;
case 0xBE:
key = Right ;
break ;
case 0x7B:
key = F1 ;
key = Delete ;
break ;
case 0x77:
key = F3 ;
key = Backspace ;
break ;
case 0xE7:
key = 1 ;
break ;
case 0xD7:
key = 2 ;
break ;
case 0xB7:
key = 3 ;
break ;
case 0xEB:
key = 4 ;
break ;
case 0xDB:
key = 5 ;
break ;
case 0xBB:
key = 6 ;
break ;
case 0xED:
key = 7 ;
break ;
case 0xDD:
key = 8 ;
break ;
case 0xBD:
key = 9 ;
break ;
case 0xDE:
key = 0 ;
break ;
default:
key = 0xFF ;
}
}
else
key = 0xFF ;
KEY_PORT_DIR = 0xFF ;
KEY_PORT_OUT = 0x00 ;
return key ;
}
unsigned char GetKeyPress(void)
{
unsigned char Key ;
static unsigned long power_time = 0 ;
for(;;)
{
Key = ReadKey() ;
if(Key==Power)
{
if(++power_time>300000)
return Key ;
else
continue ;
}
else
power_time = 0x00 ;
if(Key==0xFF)
{
__delay_cycles(560000) ;
Key = ReadKey() ;
if(Key==0xFF) break ;
}
}
Interval = 0 ;
for(;;)
{
if(Event&SHOULD_FLICKER)
{
Event &=~SHOULD_FLICKER ;
DrawBattery(VmainAvr) ;
}
if(Event&SHOULD_DISPLAY_TIME)
{
Event &=~SHOULD_DISPLAY_TIME ;
DisplayTime() ;
}
Key = ReadKey() ;
if(Interval++>MAX_INTERVAL)
Interval =MAX_INTERVAL ;
if(Key!=0xFF)
{
__delay_cycles(560000) ;
if(Key==ReadKey())
{
return Key ;
}
}
}
}
void DisplayTime(void)
{
unsigned char Hour,Minute ;
unsigned int color_temp,bkcolor_temp ;
char string[6] ;
Minute = RTCMIN ;
Hour = RTCHOUR ;
DrawRectFill(160,0,50,29,STATUS_BK_COLOR) ;
sprintf(string,"%02d:%02d",Hour,Minute) ;
color_temp = Color ;
bkcolor_temp = Color_BK ;
Color = STATUS_COLOR ;
Color_BK = STATUS_BK_COLOR ;
PutStringEN16(160,8,(unsigned char *)string) ;
Color = color_temp ;
Color_BK = bkcolor_temp ;
}
//=====================================================================//
//函数:void Init_Func(void) //
//描述:初始化函数列表 //
//=====================================================================//
void Init_Func(void)
{
Item_OP[FUNC_SHOW_HELP] = Show_Help ; // 帮助信息
Item_OP[FUNC_BOARD_INFO] = View_Board_Info ; // 开发板信息
Item_OP[FUNC_SET_TIME] = Set_Time ; // 设置时间
Item_OP[FUNC_SET_BACKLIGHT] = Set_Backlight ; // 设置背光
}
//=====================================================================//
//函数:void MessageBox(char *title,char *string) //
//功能:显示消息框 //
//参数: title —消息框标题 //
// string —消息框内容 //
//=====================================================================//
void MessageBox(char *title,char *string)
{
unsigned char key ;
_DINT() ;
Color = TITLE_COLOR ;
Color_BK = TITLE_BK_COLOR ;
DrawRectFill(20,115,200,30,TITLE_BK_COLOR) ;
PutStringCN24(120-strlen(title)*6,118,
(unsigned char *)title ) ;
DrawRectFill(20,145,200,80,WINDOW_BK_COLOR) ;
DrawRectFill(20,145,200,80,0xFFFF) ;
DrawRect(20,145,200,80,WINDOW_COLOR) ;
Color = WINDOW_COLOR ;
Color_BK = 0xFFFF ;
PutString24M(120-strlen(string)*6,173,
(unsigned char *)string ) ;
Color_BK = WINDOW_BK_COLOR ;
_EINT() ;
for(;;)
{
key = GetKeyPress() ;
if(key==Enter||key==Esc||key==OK)
break ;
}
}
复制代码
main.h
#include "msp430x54x.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Menu.h"
#include "MenuRes.h"
//#include "Edit.h"
#include "TFTDRV430.H"
#include "PIN_DEF.H"
#include "RTC.H"
#define MAX_INTERVAL 150000
#define PERMISSION 0x03 // 菜单权限
#define RETURN_MASTER 0x33 // 函数执行完回到主菜单
#define GOTO_SUB 0x44 // 函数执行完执行子菜单
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//#define Power BIT0
#define VALID 0x11
#define INVALID 0x22
//------------------------------- 事件类型定义----------------------------------//
#define SHOULD_DISPLAY_TIME BIT0 // 应更新时间显示
#define SHOULD_FLICKER BIT1 // 应闪烁光标
#define RX_FRAME_RECEIVED BIT2 // 收到有效数据帧
#define TX_FRAME_WAITING BIT3 // 串口数据等待发送
#define LOWPOWER_DETECTED BIT5 // 电池容量低
#define SHOULD_UPDATE_WDT BIT6 // 更新看门狗定时器
#define RX_PC_RECEIVED BIT7 // 上位机接收到数据
#define CARD_DETECTED BIT8 // 检测到射频卡
#define PRE_EDIT 0xFE // 切换至上一Edit控件
#define NEXT_EDIT 0xFD // 切换至下一Edit控件
#define INP_DIG BIT0 // 输入模式 —数字
#define INP_EN BIT1 // 输入模式 —英文字母
#define INP_CN BIT2 // 输入模式 —汉字
///////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned int OP_MODE ; // 操作模式-系统员级/管理员级/操作员级
MENU Menu ;
unsigned int Event ;
unsigned char INP_MODE = INP_CN ; // 输入模式
unsigned char INP_MODE_LMT = INP_CN+INP_EN+INP_DIG ; // 输入模式限制
unsigned long int Interval = 0xFFFFFFFF ; // 输入键间隔
float VmainAvr = 0 ;
unsigned int Color,Color_BK ;
unsigned char (*Item_OP[ALL_ITEMS])(unsigned int,unsigned char) ;
unsigned char View_Board_Info(unsigned int NC1,unsigned char NC2) ;
unsigned char Set_Time(unsigned int NC1,unsigned char NC2) ;
unsigned char Set_Backlight(unsigned int NC1,unsigned char NC2) ;
void Init_Func(void) ;
void Wait_Key(unsigned char key_waited) ;
void Display_Time(void) ;
void VmainMon(void) ;
extern void Init_MCLK(void) ;
extern void Init_KeyPad(void) ;
extern void Init_RTC(void) ;
extern void Init_timer(void) ;
extern void Init_Port(void) ;
extern void Init_ADC(void) ;
extern void BackLight(void) ;
extern void Init_UART(void) ;
extern void Init_UART_115200(void) ;
extern void Init(void) ;
extern void str_cpy(char* Destination,char* Source,unsigned char Num) ;
//////////////////////////////////////////////////////////////////////////////////////////////////////
extern void Init_SPI(void) ;
void RunMenu(void) ;
unsigned char ReadKey(void) ;
unsigned char Input_CN(char first_key,char* buffer) ;
unsigned char GetKeyPress(void) ;
void DrawBattery(float voltage) ;
void DisplayTime(void) ;
unsigned char Read_Edit_Val(unsigned char Edit_Index,char* string,
unsigned char Renew_Edit_Index ) ;
unsigned char Valve_Mantain_Open(unsigned int NC1,unsigned char NC2) ;
void MessageBox(char *title,char *string)
作者:
XJzy
时间:
2015-10-6 00:37
//===========================================================================//
// //
// 文件: Menu.c //
// 说明: BW-DK5438开发板多级文本菜单操作函数 //
// 编译: IAR Embedded Workbench IDE for MSP430 v4.21 //
// 版本: v1.1 //
// 编写: JASON.ZHANG //
// 版权: 北京拓普博维电子技术有限公司 //
// //
//===========================================================================//
#include "Menu.h"
extern void str_cpy(char* Destination, char* Source,unsigned char Num) ;
extern const ITEM MENU_ITEM[] ;
extern const MENU_RES Menus[] ;
extern unsigned int Color ; // 前景颜色
extern unsigned int Color_BK ; // 背景颜色
extern MENU Menu ;
unsigned char Font_CN = 24 ; // 中文字体
unsigned char Font_EN = 24 ; // 西文字体
unsigned char MenuNum = 0xFF ; // 需上传的菜单数组数量
unsigned char MenuUpdated = 0xFF ; // 菜单更新,需上传当前菜单选项
unsigned char First_Index_old = 0xFF ;
unsigned char y_Index_old = 0xFF ;
unsigned char First_Index = 0x00 ;
unsigned char Active_Index = 0x00 ;
unsigned char Dis_Menu_Num ;
//=====================================================================//
//函数:void UpDate_Menu(UCHAR First_Index,UCHAR Menu_Index,UINT** Menu_List)
//功能:刷新整屏菜单显示函数
//参数:First_Index - 显示的第一条菜单号
// Menu_Index - 处于选择状态的菜单项
// Menu_List - 菜单资源链表指针
//返回:无
//日期: 2010.01.20
//=====================================================================//
void UpDate_Menu(unsigned char First_Index,unsigned char Menu_Index)
{
unsigned int y_Index ;
unsigned char i ;
_DINT() ;
if(Dis_Menu_Num+First_Index> Menu.MenuConfig[0])
Dis_Menu_Num = Menu.MenuConfig[0] - First_Index ;
y_Index = 0 ; //
if(First_Index_old!=First_Index) // window内首条菜单项改变
{
if(y_Index_old==0xFF) // 初始绘制菜单
{
DrawRectFill(0,60,240,230,WINDOW_BK_COLOR) ; // 清空窗口
Color = TITLE_COLOR ; // 显示标题条
Color_BK = TITLE_BK_COLOR ;
DrawRectFill(0,30,240,30,Color_BK) ;
PutString24M(120-25*strlen((char*)Menu.MenuTitle)/4,33,Menu.MenuTitle) ;
y_Index = Y_OFFSET-1 ; // 由上而下显示各菜单项
for(i=First_Index;i<Dis_Menu_Num+First_Index;i++)
{
if(i==Menu_Index)
{
DrawRectFill(0,y_Index-1,Dis_X_MAX,Y_WIDTH_MENU,MENU_SELE_COLOR) ; // 显示选择条
ShowMenu_Item(y_Index,i+1,1) ;
}
else
ShowMenu_Item(y_Index,i+1,0) ; // 显示非被选菜单项
y_Index += Y_WIDTH_MENU ;
}
y_Index_old = 0 ;
First_Index_old = 0 ;
}
else // 首菜单项改变
{
Color_BK = WINDOW_BK_COLOR ;
if(First_Index_old<First_Index) // 菜单向上滚动
{
y_Index = Y_OFFSET-1+Y_WIDTH_MENU*(Dis_Menu_Num-1) ;
DrawRectFill(0,y_Index-1,Dis_X_MAX,Y_WIDTH_MENU,MENU_SELE_COLOR) ; // 清选中菜单项内容
DrawRectFill(0,Y_OFFSET-1,Dis_X_MAX,Y_WIDTH_MENU*(Dis_Menu_Num-1),
WINDOW_BK_COLOR ) ; // 清空被选菜单项上部内容
y_Index = Y_OFFSET-1 + Y_WIDTH_MENU*(Dis_Menu_Num-1) ; // 自下而上显示被选菜单项
for(i=0;i<Dis_Menu_Num;i++)
{
if(i==0)
ShowMenu_Item(y_Index,Menu_Index-i+1,1) ;
else
ShowMenu_Item(y_Index,Menu_Index-i+1,0) ; // 显示非被选菜单项
y_Index -= Y_WIDTH_MENU ;
}
}
else
{
y_Index = Y_OFFSET-1 ;
DrawRectFill(0,Y_WIDTH_MENU+Y_OFFSET-1,Dis_X_MAX,Y_WIDTH_MENU*(Dis_Menu_Num-1),
WINDOW_BK_COLOR ); // 清空被选菜单项下部内容
DrawRectFill(0,y_Index-1,Dis_X_MAX,Y_WIDTH_MENU,MENU_SELE_COLOR) ; // 清选中菜单项内容
for(i=First_Index;i<Dis_Menu_Num+First_Index;i++)
{
if(i==Menu_Index)
ShowMenu_Item(y_Index,i+1,1) ;
else
ShowMenu_Item(y_Index,i+1,0) ; // 显示非被选菜单项
y_Index += Y_WIDTH_MENU ;
}
}
}
First_Index_old = First_Index ;
}
else // 首菜单项无变化
{
y_Index = y_Index_old-First_Index_old ;
y_Index = y_Index*Y_WIDTH_MENU+Y_OFFSET-1 ;
DrawRectFill(0,y_Index-1,Dis_X_MAX,Y_WIDTH_MENU,WINDOW_BK_COLOR) ;
ShowMenu_Item(y_Index,y_Index_old+1,0) ;
y_Index = Menu_Index-First_Index ;
y_Index = y_Index*Y_WIDTH_MENU+Y_OFFSET-1 ;
// DrawRectFill(0,y_Index-1,Dis_X_MAX,Y_WIDTH_MENU,WINDOW_COLOR) ;
DrawRectFill(0,y_Index-1,Dis_X_MAX,Y_WIDTH_MENU,MENU_SELE_COLOR) ;
ShowMenu_Item(y_Index,Menu_Index+1,1) ;
}
y_Index_old = Menu_Index ;
Update_ScrollBar(Dis_X_MAX+2,Y_OFFSET-5,289-Y_OFFSET,Menu_Index,Menu.MenuConfig[0]) ;
_EINT() ;
}
//=====================================================================//
//函数:UCHAR ShowMenu_Item(UCHAR y,UINT* Menu_String,UCHAR Font_Color)
//描述:显示菜单项子函数
//参数:space_front 显示缩进值
// y Y轴坐标
// Menu_String 菜单项链表的首地址指针
//=====================================================================//
void ShowMenu_Item(unsigned int y,unsigned char index,unsigned char Selected)
{
unsigned char id[3] ;
Color_BK = WINDOW_BK_COLOR ;
Color = WINDOW_COLOR ;
DrawRectFill(15,y+3,22,21,Color_BK) ; // 填充背景色
id[2] = 0x00 ;
id[1] = 0x00 ;
id[0] = index-id[1]*10 + 0x30 ;
if(index<10)
{
PutStringEN24(20,y,id) ;
DrawRect(13,y+1,26,24,WINDOW_BK_COLOR) ;
}
else
{
switch(index)
{
case 10:
PutStringCN24(15,y+2,"⒑") ;
break ;
case 11:
PutStringCN24(15,y+2,"⒒") ;
break ;
case 12:
PutStringCN24(15,y+2,"⒓") ;
break ;
case 13:
PutStringCN24(15,y+2,"⒔") ;
break ;
case 14:
PutStringCN24(15,y+2,"⒕") ;
break ;
case 15:
PutStringCN24(15,y+2,"⒖") ;
break ;
case 16:
PutStringCN24(15,y+2,"⒗") ;
break ;
case 17:
PutStringCN24(15,y+2,"⒘") ;
break ;
case 18:
PutStringCN24(15,y+2,"⒙") ;
break ;
case 19:
PutStringCN24(15,y+2,"⒚") ;
break ;
case 20:
PutStringCN24(15,y+2,"⒛") ;
break ;
}
DrawRectFill(35,y+18,3,4,Color_BK) ; // 擦除多余的点
}
DrawRect(14,y+2,24,22,Color) ;
if(Selected)
DrawRectFill(14,y,24,1,MENU_SELE_COLOR) ; // 擦除超出编号框范围的点
if(Selected==0)
{
Color_BK = WINDOW_BK_COLOR ;
Color = WINDOW_COLOR ;
}
else
{
Color_BK = MENU_SELE_COLOR ;
Color = WINDOW_BK_COLOR ;
}
PutString24M(50,y+2,Menu.ItemTitle[index-1]) ;
}
//=====================================================================//
//函数:void Redraw_Menu(UCHAR First_Index,UCHAR Menu_Index,UINT** Menu_List)
//描述:刷新整屏菜单显示函数
//参数:First_Index 当面显示页的第一条菜单号
// Menu_Index 当前处于选用的菜单项
// Menu_List 菜单资源链表指针
//=====================================================================//
void Redraw_Menu(unsigned char First_Index,unsigned char Menu_Index)
{
First_Index_old = 0xFF ;
y_Index_old = 0xFF ;
Dis_Menu_Num = (Dis_Y_MAX+1-Y_OFFSET)/Y_WIDTH_MENU ;
UpDate_Menu(First_Index,Menu_Index) ;
}
//=====================================================================//
//函数:void Initial_Menu(UINT** Menu_List)
//功能:刷新整屏菜单显示函数
//参数:Menu_List - 菜单资源链表指针
//=====================================================================//
void Initial_Menu(void)
{
First_Index_old = 0xFF ;
y_Index_old = 0xFF ;
Dis_Menu_Num = (Dis_Y_MAX+1-Y_OFFSET)/Y_WIDTH_MENU ;
Active_Index = 0x00 ;
First_Index = Active_Index ;
if(First_Index<Dis_Menu_Num)
First_Index = 0x00 ;
while(First_Index>Dis_Menu_Num)
First_Index -= (Dis_Menu_Num-1) ;
UpDate_Menu(First_Index,Active_Index) ;
Color_BK = STATUS_BK_COLOR ;
Color = STATUS_COLOR ;
PutStringCN24(10,294,"确认") ; // 底栏
if(Menu.MenuIndex>0)
PutStringCN24(185,294,"返回") ;
else
DrawRectFill(185,294,54,25,STATUS_BK_COLOR) ;
}
//***************************************************************************************
// *
// void ActiveEditDig(): 设置数字编辑控件活动状态 *
// *
//***************************************************************************************
void MenuMessage(unsigned char Message)
{
_DINT() ;
switch(Message)
{
case Update:
Redraw_Menu(First_Index,Active_Index) ;
break ;
case Up:
if(Active_Index==0)
break ;
else
Active_Index-- ;
if(Active_Index<First_Index)
if(First_Index>0) First_Index -- ;
UpDate_Menu(First_Index,Active_Index) ;
break ;
case Down:
if(Active_Index==Menu.MenuConfig[0]-1)
break ;
else
{
Active_Index++ ;
if(Active_Index>First_Index+6)
First_Index++ ;
UpDate_Menu(First_Index,Active_Index) ;
}
break ;
case Left:
if(First_Index-7>0)
{
First_Index -= 7 ;
Active_Index = First_Index + 6 ;
Redraw_Menu(First_Index,Active_Index) ;
}
else if(First_Index!=0)
{
First_Index = 0 ;
Active_Index = First_Index ;
Redraw_Menu(First_Index,Active_Index) ;
}
break ;
case Right:
if(First_Index+Dis_Menu_Num<Menu.MenuConfig[0])
{
First_Index += Dis_Menu_Num ;
Active_Index = First_Index ;
if(First_Index+7>Menu.MenuConfig[0])
{
Active_Index = Menu.MenuConfig[0]-1 ;
First_Index = Active_Index-6 ;
}
Redraw_Menu(First_Index,Active_Index) ;
}
break ;
}
MenuUpdated = 0x00 ;
_EINT() ;
}
void Update_ScrollBar(unsigned int x,unsigned int y,unsigned char height,
unsigned char position,unsigned char total )
{
unsigned int temp ;
DrawRectFill(x,y,8,height,WINDOW_BK_COLOR) ; // 外框
DrawRect(x,y,8,height,WINDOW_COLOR) ;
temp = y+(unsigned int)(height-44)*position/(total-1) ;
DrawRectFill(x,temp,8,44,WINDOW_COLOR) ; // 滑块
}
void LoadMenu(unsigned char Menu_Index,unsigned char Permission)
{
unsigned char i,j,k ; // 导入菜单配置项
Menu.MenuIndex = Menu_Index ;
str_cpy((char *)Menu.MenuConfig,(char *)Menus[Menu_Index].MenuConfig,10) ; // 拷贝菜单配置项
strcpy((char *)Menu.MenuTitle,(char *)Menus[Menu_Index].MenuTitle) ; // 拷贝菜单标题
Menu.MenuConfig[0] = 0 ; // 菜单项数清0
for(i=1;i< Menus[Menu_Index].MenuConfig[0]+1;i++) // 导入菜单标题字符串
{
if(Permission>=(MENU_ITEM[Menus[Menu_Index].ItemIndex[i-1]].AccessLevel))
{
j = Menu.MenuConfig[0]++ ; // 计算菜单项数目
Menu.ItemIndex[j] = Menus[Menu_Index].ItemIndex[i-1] ; // 记录菜单项索引
for(k=0;k<20;k++)
Menu.ItemTitle[j][k] = 0x00 ;
strcpy((char *)Menu.ItemTitle[j],
(char *)MENU_ITEM[Menus[Menu_Index].ItemIndex[i-1]].ItemTitle) ; // 拷贝菜单项标题
Menu.ItemConfig[j] = MENU_ITEM[Menus[Menu_Index].ItemIndex[i-1]].Config ; // 拷贝菜单项配置字
}
}
}
unsigned char GetFirstItem(void)
{
return First_Index ;
}
unsigned char GetActiveItem(void)
{
return Active_Index ;
}
unsigned char GetActiveItemIndex(void)
{
return Menu.ItemIndex[Active_Index] ;
}
unsigned char GetMenuIndex(void)
{
return Menu.MenuIndex ;
}
作者:
XJzy
时间:
2015-10-6 00:37
//===========================================================================//
// //
// 文件: MAIN.C //
// 说明: BW-DK5438开发板多级文本菜单数据结构定义及函数声明头文件 //
// 编译: IAR Embedded Workbench IDE for MSP430 v4.21 //
// 版本: v1.1 //
// 编写: JASON.ZHANG //
// 版权: 北京拓普博维电子技术有限公司 //
// //
//===========================================================================//
#ifndef _MENU_H
#define _MENU_H
#include "TFTDRV430.H"
#include "string.h"
// 菜单常量定义
#define MAX_ITEM 18
#define ALL_ITEMS 60
#define EMPTY 0xFF // 无效标识
#define DYNAMIC_OP 0xFE // 动态可执行菜单标识
#define DYNAMIC_VIEW 0xFD // 动态视图菜单标识
#define STATIC 0xFC // 静态菜单
#define SINGLE_PAGE 0x00
#define MULTI_PAGE 0x11
#define NEXT_PAGE 0x11
#define PREVIOUS_PAGE 0x22
#define CHECK_RECORD 0x11
#define ITEM_ACCESS_HIDDEN 0x04 // 尚未开放
#define ITEM_ACCESS_SYSTEM 0x03 // 系统级
#define ITEM_ACCESS_MANAGER 0x02 // 管理员级
#define ITEM_ACCESS_OPERATOR 0x01 // 操作员级
typedef struct
{
unsigned char ItemIndex ; // 菜单项目索引
unsigned char SubMenuIndex ; // 子菜单索引
unsigned char CallBackFuncIndex ; // 回调函数索引
unsigned char AccessLevel ; // 菜单项权限
unsigned char Config ; // 菜单项类别
char ItemTitle[20] ; // 菜单项名称
} ITEM ;
typedef struct // 调入内存运行
{
unsigned char MenuIndex ;
unsigned char MenuConfig[40] ; // 菜单配置
unsigned char MenuTitle[20] ; // 菜单标题
unsigned char ItemTitle[25][20] ; // 菜单项
unsigned char ItemIndex[25] ; // 菜单项索引
unsigned char ItemConfig[25] ; // 菜单项配置字
} MENU ;
typedef struct // 菜单资源
{
unsigned char MenuIndex ; // 菜单索引
unsigned char MasterMenu ; // 父菜单索引
unsigned char MasterItem ; // 父菜单项索引
unsigned char MenuTitle[20] ; // 菜单标题
unsigned char MenuConfig[40] ; // 菜单配置
unsigned char ItemIndex[MAX_ITEM] ; // 菜单项索引
} MENU_RES ; // 菜单资源
//***************************MenuConfig 定义**********************************//
// MenuConfig[0] :菜单项数目
// MenuConfig[1] :中文字体大小
// MenuConfig[2] :西文字体大小
// MenuConfig[3] :每一菜单项所占用的Y轴的点数
// MenuConfig[4] :X轴固定偏移
// MenuConfig[5] :分页模式
// MenuConfig[6] :退出菜单调用函数(一般为视图菜单用以保存数据)
// MenuConfig[7] :分页函数索引
// MenuConfig[8] :菜单页数
// MenuConfig[9] :辅助参数,由应用函数定义
// . .
// . .
// . .
// MenuConfig[15]:多页菜单,菜单页数,供返回时使用
//****************************************************************************//
#define MAX_ITEM 18
#define ALL_ITEMS 60
#define EMPTY 0xFF
#define Y_OFFSET 72 // 显示菜单的Y轴偏移量
#define Y_WIDTH_MENU 30 // 菜单项高度
#define X_SPACE_FRONT 15 // 菜单项左缩进
#define SHOULD_FLICKER BIT1 // 应闪烁
#define MENU_LOADED BIT2 // 菜单已下载
//*
// 界面颜色
#define WINDOW_BK_COLOR 0xDFFF // 窗口背景色
#define WINDOW_COLOR 0x11FA // 窗口前景色
#define TITLE_BK_COLOR 0x11FA // 标题栏背景色
#define TITLE_COLOR 0xDFFF // 标题栏前景色
#define STATUS_BK_COLOR 0x0014 // 状态栏背景色
#define STATUS_COLOR 0xDFFF // 状态栏前景色
#define MENU_BACK_COLOR WINDOW_BK_COLOR // 未选择菜单项背景色
#define MENU_FONT_COLOR WINDOW_COLOR // 未选择菜单项文字色
#define MENU_SELE_COLOR WINDOW_COLOR // 选择菜单项背景色
#define MENU_SELF_COLOR WINDOW_BK_COLOR // 选择菜单项文字色
//*/
/*
// 界面颜色
#define WINDOW_BK_COLOR Black // 窗口背景色
#define WINDOW_COLOR White // 窗口前景色
#define TITLE_BK_COLOR Dark_Grey2 // 标题栏背景色
#define TITLE_COLOR White // 标题栏前景色
#define STATUS_BK_COLOR 0x3186 // 状态栏背景色
#define STATUS_COLOR 0xF7BE // 状态栏前景色
#define MENU_BACK_COLOR WINDOW_BK_COLOR // 未选择菜单项背景色
#define MENU_FONT_COLOR WINDOW_COLOR // 未选择菜单项文字色
//#define MENU_SELE_COLOR 0xFD6A // 选择菜单项背景色
#define MENU_SELE_COLOR Yellow // 选择菜单项背景色
#define MENU_SELF_COLOR WINDOW_BK_COLOR // 选择菜单项文字色
*/
/*
#define TITLE_BK_COLOR 0xF800 // 标题栏背景色
#define TITLE_COLOR 0xDFFF // 标题栏前景色
#define STATUS_BK_COLOR 0xF800 // 状态栏背景色
#define STATUS_COLOR 0xDFFF // 状态栏前景色
*/
#define Dis_X_MAX 228
#define Dis_Y_MAX 289
void LoadMenu(unsigned char Menu_Index,unsigned char Permission) ;
void Initial_Menu(void) ;
void ShowMenu_Item(unsigned int y,unsigned char index,
unsigned char Selected ) ;
void Redraw_Menu(unsigned char First_Index,
unsigned char Menu_Index ) ;
void UpDate_Menu(unsigned char First_Index,
unsigned char Menu_Index ) ;
void Update_ScrollBar(unsigned int x,unsigned int y,
unsigned char height,
unsigned char position,
unsigned char total ) ;
void MenuMessage(unsigned char Message) ;
void str_cpy(char* Destination, char* Source,unsigned char Num) ;
unsigned char GetFirstItem(void) ;
unsigned char GetActiveItem(void) ;
unsigned char GetActiveItemIndex(void) ;
unsigned char GetMenuIndex(void) ;
#endif
作者:
XJzy
时间:
2015-10-6 00:38
//===========================================================================//
// //
// 文件: MenuRes.h //
// 说明: BW-DK5438开发板多级文本菜单资源定义 //
// 编译: IAR Embedded Workbench IDE for MSP430 v4.21 //
// 版本: v1.1 //
// 编写: JASON.ZHANG //
// 版权: 北京拓普博维电子技术有限公司 //
// //
//===========================================================================//
#ifndef __MENURES_H
#define __MENURES_H
#include "Menu.h"
// 菜单索引定义
#define MENU_MAIN 0x00 // 主菜单索引
#define MENU_BOARD_SETTINGS 0x01 // 开发板设置菜单索引
// 一级菜单项[0] : 主菜单
#define ITEM_HELP 0x00 // 帮助信息
#define ITEM_BOARD_INFO 0x01 // 开发板信息
#define ITEM_BOARD_SETTINGS 0x02 // 开发板设置
// 二级菜单项[4] : 手持机管理菜单
#define ITEM_SET_TIME 0x03 // 设置手持机时间
#define ITEM_SET_BACKLIGHT 0x04 // 设置手持机背光
// 操作函数定义
#define FUNC_SHOW_HELP 0x00 // 显示帮助信息
#define FUNC_BOARD_INFO 0x01 // 开发板信息
#define FUNC_SET_TIME 0x02 // 设置时间
#define FUNC_SET_BACKLIGHT 0x03 // 设置背光
extern unsigned char (*Item_OP[ALL_ITEMS])(unsigned int,unsigned char) ;
void str_cpy(char* Destination, char* Source,unsigned char Num) ;
//****************************************************************************//
// //
// 菜单项定义 //
// //
//****************************************************************************//
const ITEM MENU_ITEM[] =
{
//--------------------------------- 主菜单[0] --------------------------------//
{ITEM_HELP ,
EMPTY ,
FUNC_SHOW_HELP ,
ITEM_ACCESS_OPERATOR ,
STATIC ,
"帮助信息" } , // [00]帮助
{ITEM_BOARD_INFO ,
EMPTY ,
FUNC_BOARD_INFO ,
ITEM_ACCESS_OPERATOR ,
STATIC ,
"开发板信息" } , // [01]水表管理
{ITEM_BOARD_SETTINGS ,
MENU_BOARD_SETTINGS ,
EMPTY ,
ITEM_ACCESS_OPERATOR ,
STATIC ,
"开发板设置" } , // [02]数据管理
//---------------- 二级菜单项[4] : 开发板设置菜单 -------------------------------//
{ITEM_SET_TIME ,
EMPTY ,
FUNC_SET_TIME ,
ITEM_ACCESS_OPERATOR ,
STATIC ,
"设置时间" } , // [38]设置时间
{ITEM_SET_BACKLIGHT ,
EMPTY ,
FUNC_SET_BACKLIGHT ,
ITEM_ACCESS_OPERATOR ,
STATIC ,
"设置液晶背光" } , // [39]设置液晶背光
};
//****************************************************************************//
// //
// 菜单定义 //
// //
//****************************************************************************//
const MENU_RES Menus[] =
{
//--------------------------- Menus[0]: 主菜单 -----------------------------------//
{
MENU_MAIN , // 菜单索引
EMPTY ,
EMPTY ,
"BW-DK5438" ,
{3,24,24,28,15,SINGLE_PAGE,EMPTY} ,
{
ITEM_HELP , // 水表数据管理
ITEM_BOARD_INFO , // 开发板信息
ITEM_BOARD_SETTINGS , // 开发板设置
}
} ,
//---------------------------Menus[4]: 手持机管理菜单 -------------------------//
{
MENU_BOARD_SETTINGS , // 菜单索引
MENU_MAIN ,
ITEM_BOARD_SETTINGS ,
"开发板设置" ,
{2,24,24,28,15,SINGLE_PAGE,EMPTY} ,
{
ITEM_SET_TIME , // 设置开发板时间
ITEM_SET_BACKLIGHT , // 设置液晶背光
}
} ,
} ;
#endif
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4