?? menu.c.bak
字號:
/****************************************Copyright (c)**************************************************
** 智 能 充 電 器 開 發(fā) 小 組
** OurAVR 論壇
** QQ 群: 26052247
**
** http://www.ouravr.com/bbs
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: SIO.c
**創(chuàng) 建 人: Trinove
**最后修改日期: 2008年01月13日
**描 述: 菜單的底層函數(shù) FOR AVR MCU / Mega16
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: aleyn.wu
** 版 本: V1.0
** 日 期: 2008年01月13日
** 描 述: 原始版本
**
**--------------當(dāng)前版本修訂------------------------------------------------------------------------------
** 修改人: 呂海安
** 日 期: 2008年03月09日
** 描 述: For 智能充電器
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "Config.h"
#include "Menu.h"
#define MENU_LINE 2
/*******************************************************************************************************
** 函數(shù)名稱: MenuNo
** 功能描述: 菜單序號
** 輸入?yún)?shù): INT8U No:
** 輸出參數(shù):
********************************************************************************************************/
INT8U MenuNo(INT8U No)
{
if ((No >= 0) && (No <= 9))
{
return No + '0';
}
else if ((No >= 10) && (No <= 36))
{
return No - 10 + 'A';
}
else
{
return '?';
}
}
/*******************************************************************************************************
** 函數(shù)名稱: ChooseRadioMenu
** 功能描述: 選擇單選菜單
** 輸入?yún)?shù): INT8U ParamCaptionID:
** INT8U MenuDefineID:
** INT8U *Value
** 輸出參數(shù): 無
********************************************************************************************************/
/*
void ChooseRadioMenu(INT8U ParamCaptionID, INT8U MenuDefineID, INT8U *Value)
{
flash INT8U *Caption;
flash INT8U *pDefine;
INT8U Key;
INT8U Pos;
INT16U TopMenuItem;
INT16U CurrentMenuItem;
//INT8U i;
INT8U MenuCount;
delay_ms(10);
LCD_WriteCaption(ParamCaptionID, 0);
Pos = LCD_Position() - 1;
//WriteCGRAM(0x82,1,0);
//WriteCGRAM(0x83,2,0);
//WriteCGRAM(0x84,3,0);
pDefine = SubMenuDefine + (INT16U)2 * (INT16U)MenuDefineID;
MenuCount = pDefine[1];
TopMenuItem = pDefine[0];
CurrentMenuItem = *Value;
if (CurrentMenuItem > MenuCount - 1)
{
CurrentMenuItem=MenuCount - 1;
}
Key = 1;
while (Key != BT_APPLY)
{
if (Key != 0)
{
LCD_Ctrl(LCD_SET_DDRAM | Pos);
Caption = Menu + (CAPTION_LENGTH + 2) * (TopMenuItem + CurrentMenuItem - 1);
if (CurrentMenuItem == 0)
{
LCD_Write(3);
}
else if (CurrentMenuItem == MenuCount - 1)
{
LCD_Write(1);
}
else
{
LCD_Write(2);
}
//LCD_Write(MenuNo(CurrentMenuItem));
LCD_Write(' ');
LCD_Write('=');
LCD_PutStrF(Caption);
}
Key = GetKey();
if (Key != 0)
{
if (Key == BT_UP)
{
if (CurrentMenuItem > 0)
{
CurrentMenuItem --;
}
}
else if (Key == BT_DOWN)
{
if (CurrentMenuItem < MenuCount - 1)
{
CurrentMenuItem ++;
}
}
else if (Key == BT_APPLY)
{
*Value = CurrentMenuItem;
}
else if (Key == BT_LEFT)
{
Key = BT_APPLY;
}
delay_ms(10)
}
}
}
*/
/*******************************************************************************************************
** 函數(shù)名稱: ShowMenu
** 功能描述: 菜單顯示程序,每 100 mS 調(diào)用一次即可
** 輸入?yún)?shù): 無
** 輸出參數(shù): 無
********************************************************************************************************/
void ShowMenu(void)
{
static flash INT8U *pMenu;
static flash INT8U *pDefine;
static flash INT8U *Caption;
static INT16U TopMenuItem = 0;
static INT16U CurrentMenuItem = 0;
static INT8U Stack[3][5] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static INT8U StackIndex = 0;
static INT8U DrawMenuItem[6]={0x80,0xC0,1,0,0,1};
static INT8U MenuCount;
static INT8U FlagMenuInit = 1; // 顯示菜單框架
static INT8U Key = INIT_KEY; // 第一次顯示菜單
INT8U i = 0;
INT8U j = 0;
if(FlagMenuInit)
{
FlagMenuInit = 0; // 清第一次標(biāo)志
lcd_cls(); //清屏
pMenu = Menu;
pDefine = SubMenuDefine;
MenuCount = SubMenuDefine[1];
//WriteCGRAM(0x80,0,0); // 寫入特殊字符
//WriteCGRAM(0x81,1,0); // 寫入特殊字符
}
if (Key != NO_KEY)
{
for (j=0; j<2; j++)
{
lcd_write_byte(DrawMenuItem[0 + j], CMD);
if (DrawMenuItem[(INT8U)(j + 4)] < MenuCount)
{
Caption = Menu + (CAPTION_LENGTH + 2) * (TopMenuItem + DrawMenuItem[(INT8U)(j + 4)]);
if (DrawMenuItem[(INT8U)(j + 2)])
{
lcd_write_byte(0, DATA);
lcd_write_byte(MenuNo(DrawMenuItem[(INT8U)(j + 4)] + 1), DATA);
lcd_write_byte('.', DATA);
lcd_print_stringF(Caption);
}
else
{
lcd_print_stringF(" ");
lcd_write_byte(MenuNo(DrawMenuItem[(INT8U)(j + 4)] + 1), DATA);
lcd_write_byte('.', DATA);
lcd_print_stringF(Caption);
}
}
else
{
for (i=0; i<16; i++)
{
lcd_write_byte(' ', DATA);
}
}
}
}
Key = read_keycode();
if (Key != NO_KEY)
{
if (Key == BT_UP)
{
if (DrawMenuItem[3])
{
DrawMenuItem[2]=1;
DrawMenuItem[3]=0;
}
else if (DrawMenuItem[4]>0)
{
DrawMenuItem[4]--;
DrawMenuItem[5]--;
}
}
else if (Key == BT_DOWN)
{
if (DrawMenuItem[2])
{
DrawMenuItem[2]=0;
DrawMenuItem[3]=1;
}
else if (DrawMenuItem[5]<MenuCount-1)
{
DrawMenuItem[4]++;
DrawMenuItem[5]++;
}
}
else if ((Key == BT_APPLY) || (Key == BT_RIGHT))
{
if (DrawMenuItem[2])
{
CurrentMenuItem = TopMenuItem + DrawMenuItem[4];
}
else
{
CurrentMenuItem = TopMenuItem + DrawMenuItem[5];
}
if (CurrentMenuItem < MENU_COUNT)
{
pMenu = Menu + ((CAPTION_LENGTH + 2) * CurrentMenuItem) + CAPTION_LENGTH + 1;
if (*pMenu > MENU_SUBITEM)
{
Stack[0][StackIndex] = pDefine-SubMenuDefine;
Stack[1][StackIndex] = DrawMenuItem[2];
Stack[2][StackIndex] = DrawMenuItem[4];
StackIndex ++;
pDefine = SubMenuDefine + ((INT16U)(*pMenu - MENU_SUBITEM) * 2);
TopMenuItem =* pDefine - 1;
MenuCount = pDefine[1];
DrawMenuItem[2] = 1;
DrawMenuItem[3] = 0;
DrawMenuItem[4] = 0;
DrawMenuItem[5] = 1;
}
else if (*pMenu <= MENU_SUBITEM)
{
ExecuteMenu(CurrentMenuItem + 1);
}
}
}
else if ((Key == BT_CANCEL) || (Key == BT_LEFT))
{
if (StackIndex > 0)
{
StackIndex --;
pDefine=SubMenuDefine + (INT16U)(Stack[0][StackIndex]);
TopMenuItem=*pDefine - 1;
MenuCount=pDefine[1];
DrawMenuItem[2] = Stack[1][StackIndex];
DrawMenuItem[3] = 1 - Stack[1][StackIndex];
DrawMenuItem[4] = Stack[2][StackIndex];
DrawMenuItem[5] = Stack[2][StackIndex] + 1;
}
}
}
}
/*******************************************************************************************************
** 函數(shù)名稱: ExecuteMenu
** 功能描述: 菜單顯示程序,每 100 mS 調(diào)用一次即可
** 輸入?yún)?shù): 無
** 輸出參數(shù): 無
********************************************************************************************************/
void ExecuteMenu(INT8U MenuID)
{
if (MenuID == MN_STAT_BATTERY0)
{
ReadBatterySTAT(BATTERY0);
}
else if (MenuID == MN_STAT_BATTERY1)
{
ReadBatterySTAT(BATTERY1);
}
else if (MenuID == MN_STAT_BATTERY_BOTH)
{
ReadBatterySTAT(BATTERY_BOTH);
}
}
/********************************************************************************************************
** END OF FILE
********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -