亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? menufsm.c

?? 一個占用內存極少的菜單系統的實現,很使用的程序代碼
?? C
字號:
/******************************************************************************
 * MenuFSM.C - 菜單框架和FSM代碼
 *

 *
 * DESCRIPTION: -
 *
 * modification history
 * --------------------
 * 01a, 04/sep/2007, 梁炎昌 written
 * --------------------
 ******************************************************************************/

#include "CPU.H"
#include "KeyScan.H"
#include "KS0108.H"
#include "Menu.H"



//FIXME!
//改進想法:如何在菜單中可以接管其它有效按鍵,這里程序僅僅接管了方向按鍵,若能根據1--9這些數字按鍵跳轉也是不錯
//額外的問題是如何在應用程序中得到按鍵而卻不需要在應用程序中做鍵盤檢查循環(搶占CPU時間了,會使得原有可以在背景運行的程序無法執行)
/*
*   A>改進FSM編號的機制,使得維護更簡單,能否自動編號?這樣會使得添加FSM表容易
*   B>
*
*
*/
//-----------------------------------
//MenuTop.C
void DispMenuTop(void);
void DispMenuTopUp(void);
void DispMenuTopDown(void);
void DispMenuTopLeft(void);
void DispMenuTopRight(void);

void DispIcoMenuInit(void);
void DispIcoMenuUp(void);
void DispIcoMenuDown(void);
void DispIcoMenuLeft(void);
void DispIcoMenuRight(void);

//MenuFunc.C
void DispMenuFuncInit(void);
void DispMenuFuncUp(void);
void DispMenuFuncDown(void);
void DispMenuFuncLeft(void);
void DispMenuFuncRight(void);
//MenuPara.C
void DispMenuParaInit(void);
void DispMenuParaUp(void);
void DispMenuParaDown(void);
void DispMenuParaLeft(void);
void DispMenuParaRight(void);
//MenuLanguage.C
void DispMenuLanguageInit(void);
void DispMenuLanguageUp(void);
void DispMenuLanguageDown(void);
void DispMenuLanguageLeft(void);
void DispMenuLanguageRight(void);

//MenuMeasure.C
void DispMenuMeasureInit(void);
void DispMenuMeasureUp(void);
void DispMenuMeasureDown(void);
void DispMenuMeasureLeft(void);
void DispMenuMeasureRight(void);

#ifdef DynamicBar
//MenuFunc.C
void DispMenuDataInit(void);
void DispMenuDataUp(void);
void DispMenuDataDown(void);
void DispMenuDataLeft(void);
void DispMenuDataRight(void);
#endif
//-----------------------------------


void (*KeyFuncPtr)(); //按鍵功能指針

typedef struct{
        U8 KeyStateIndex; //當前狀態索引號
        U8 KeyUpState; //按下"向上"鍵時轉向的狀態索引號
        U8 KeyDnState; //按下"向下"鍵時轉向的狀態索引號
        U8 KeyLState;  //按下"向左"鍵時轉向的狀態索引號
        U8 KeyRState;  //按下"向右"鍵時轉向的狀態索引號
        void (*CurrentOperate)(); //當前狀態應該執行的功能操作
} KbdTabStruct;
//如下是菜單的關鍵代碼
//不清楚具體含義 不能改動
//因為跟編譯器相關
//如下的函數的名稱也不可以輕易修改
/*
********************************************************************************
   FSM菜單實現機制說明:
A.一些約定:只有4個按鍵來做菜單周轉,這四個按鍵Up/Down/Left/Down 對應功能是:確認/回退/向上/向下
B.每一層的bar型菜單需要大概5個狀態(也就是5個函數)來實現,分別是MenuInit/MenuUp/MenuDown/MenuLeft/MenuRight
對應的功能解釋:
MenuInit : 初始化菜單/重新初始化菜單,在進入一個子Bar菜單時,該函數把Bar顯示指針根據語言指向子Bar的資源數組,
獲得需要的參數:該子菜單多少個Bar項(ItemNum)/每個Bar項的字符長度(Size)/指向Bar顯示內容的指針(DispItem).
而后,調用函數BarMenuInit,該函數初始化全部Bar顯示--這就是初始化菜單.
若是是從子菜單返回時,那么在返回前,Pop函數被調用,各種菜單參數被還原,在進入本函數后,本函數根據得到參數顯示Bar項
初始化菜單/重新初始化菜單的不同點在于:
初始化時      高亮顯示的位置是在頂部,對應選中的Item也是在頂部
重新初始化時  由于用戶通過按鍵向上/向下來選擇Bar項,而后通過按鍵確認來進入子菜單,為了在退出子菜單時能得到跟進入
前一致的顯示內容,因此需要備份一些相關數據:高亮的位置/選中的Item/當前FSM的Index號  在退出子菜單時Pop還原這些數據
本函數根據這些還原數據恢復顯示.

MenuUp   : 根據Bar顯示內容執行對應動作函數/或者周轉到某層子菜單
MenuDown : 返回上層菜單 通常是簡單調用Pop函數
MenuLeft : 移至上一個Bar項 通常是調用BarMenuLeft函數--該函數維護Bar的顯示后FSM狀態返回MenunInit,但由于沒有打開Flash/Reflash項,因此沒有執行MenuInit函數
MenuRight: 移至下一個Bar項 通常是調用BarMenuright函數--該函數維護Bar的顯示后FSM狀態返回MenunInit,但由于沒有打開Flash/Reflash項,因此沒有執行MenuInit函數


********************************************************************************
*/
_CONST_ KbdTabStruct KeyTab[]={
//       |-----------> Index
//       |  Up
//       |  |  Down
//       |  |  |  Left
//       |  |  |  |  Right   --->功能函數
//       |  |  |  |  |       |
       { 0, 1, 2, 3, 4,(*DispMenuTop)},// 待機畫面
       { 1, 0, 0, 0, 0,(*DispMenuTopUp)},
       { 2, 0, 0, 0, 0,(*DispMenuTopDown)},
       { 3, 0, 0, 0, 0,(*DispMenuTopLeft)},
       { 4, 0, 0, 0, 0,(*DispMenuTopRight)},

       { 5, 6, 7, 8, 9,(*DispIcoMenuInit)}, //圖標層菜單
       { 6, 0, 0, 0, 0,(*DispIcoMenuUp)},   //
       { 7, 0, 0, 0, 0,(*DispIcoMenuDown)}, //
       { 8, 0, 0, 0, 0,(*DispIcoMenuLeft)}, //
       { 9, 0, 0, 0, 0,(*DispIcoMenuRight)},//

       {10,11,12,13,14,(*DispMenuFuncInit)}, //"功能"
       {11, 0, 0, 0, 0,(*DispMenuFuncUp)},   //
       {12, 0, 0, 0, 0,(*DispMenuFuncDown)}, //
       {13, 0, 0, 0, 0,(*DispMenuFuncLeft)}, //
       {14, 0, 0, 0, 0,(*DispMenuFuncRight)},//

       {15,16,17,18,19,(*DispMenuParaInit)}, //"參數"
       {16, 0, 0, 0, 0,(*DispMenuParaUp)},   //
       {17, 0, 0, 0, 0,(*DispMenuParaDown)}, //
       {18, 0, 0, 0, 0,(*DispMenuParaLeft)}, //
       {19, 0, 0, 0, 0,(*DispMenuParaRight)},//

       {20,21,22,23,24,(*DispMenuLanguageInit)}, //"語言"
       {21, 0, 0, 0, 0,(*DispMenuLanguageUp)},   //
       {22, 0, 0, 0, 0,(*DispMenuLanguageDown)}, //
       {23, 0, 0, 0, 0,(*DispMenuLanguageLeft)}, //
       {24, 0, 0, 0, 0,(*DispMenuLanguageRight)},//


       {25,26,27,28,29,(*DispMenuMeasureInit)}, //"測量"
       {26, 0, 0, 0, 0,(*DispMenuMeasureUp)},   //
       {27, 0, 0, 0, 0,(*DispMenuMeasureDown)}, //
       {28, 0, 0, 0, 0,(*DispMenuMeasureLeft)}, //
       {29, 0, 0, 0, 0,(*DispMenuMeasureRight)},//
#ifdef DynamicBar
       {30,31,32,33,34,(*DispMenuDataInit)}, //"Data"
       {31, 0, 0, 0, 0,(*DispMenuDataUp)},   //
       {32, 0, 0, 0, 0,(*DispMenuDataDown)}, //
       {33, 0, 0, 0, 0,(*DispMenuDataLeft)}, //
       {34, 0, 0, 0, 0,(*DispMenuDataRight)},//
#endif

};

/*
*****************************************************************************
* CheckKey - 菜單鍵盤掃描函數
* DESCRIPTION: -
* 有有效按鍵則執行對應的功能函數
* 同時,若刷新標志有效,也執行相應的功能函數
* @Para void:
* Return :
*
*****************************************************************************
*/
U8 CheckKey(void)
{
    U8 IsKey;
    U8 Key;
    IsKey = 1;
    Key = KeyScan();
    switch(Key){
        case Key_Up:{ //向上鍵,找出新的菜單狀態編號
            KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
            KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
            (*KeyFuncPtr)();//執行當前按鍵的操作
            break;
        }
        case Key_Down:{ //向下鍵,找出新的菜單狀態編號
            KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState;
            KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
            (*KeyFuncPtr)();//執行當前按鍵的操作
            break;
        }
        case Key_Left:{ //向左鍵,找出新的菜單狀態編號
            KeyFuncIndex=KeyTab[KeyFuncIndex].KeyLState;
            KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
            (*KeyFuncPtr)();//執行當前按鍵的操作
            break;
        }
        case Key_Right:{ //向右鍵,找出新的菜單狀態編號
            KeyFuncIndex=KeyTab[KeyFuncIndex].KeyRState;
            KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
            (*KeyFuncPtr)();//執行當前按鍵的操作
            break;
        }
//---------------------------------------------------------------------------
#ifdef DigiKeyLink
/*
2006/09/08
數字鍵做快捷方式輸入
1.判別數字鍵值是否小于ItemNum-1 否則是無效快捷方式
2.有效快捷方式下,把鍵值給Item,調用Key_Up的處理代碼
3.需要添加超時處理,超時了就不能使用?(需要么?不需要么?)
*/
        case Key_1:
        case Key_2:
        case Key_3:
        case Key_4:
        case Key_5:
        case Key_6:
        case Key_7:
        case Key_8:
        case Key_9:
            Key = chang_code(Key);
            if((Key - '1') <= ItemNum-1){
                Item = Key - '1';
                if(ItemNum <= DispMax){//如果需要顯示的項比可以顯示的項少,那么修正Where 否則默認Where為0
                    Where = Item;
                }else{
                    Where = 0;
                }
                //-------------------------------------------------
                KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
                KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
                (*KeyFuncPtr)();//執行當前按鍵的操作
                //-------------------------------------------------
            }else {
                IsKey = 0;
            }
            break;
#endif
//---------------------------------------------------------------------------
        default: //按鍵錯誤的處理
            IsKey = 0;
            break;
    }

    if(Flash){//兩個當中有任意一個不為零,那么執行一次,我們應該不會出現Flash和ReFlash都是1的情況
        KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
        (*KeyFuncPtr)();//執行當前按鍵的操作
        Flash = 0;
       // ReFlash = 0;
     }

    return IsKey;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
4438x亚洲最大成人网| 亚洲国产美女搞黄色| 一本久道中文字幕精品亚洲嫩| 日韩高清在线不卡| 亚洲一区二区三区美女| 亚洲色图一区二区三区| 国产精品美女久久久久aⅴ| 久久久亚洲精品石原莉奈 | 国产精品你懂的在线欣赏| 精品久久久久一区二区国产| 日韩欧美www| 精品国产乱码久久久久久影片| 91精品国产一区二区人妖| 4438x成人网最大色成网站| 欧美一级专区免费大片| 日韩欧美中文字幕公布| www久久精品| 久久精品无码一区二区三区| 国产精品视频你懂的| 亚洲国产成人午夜在线一区| 综合av第一页| 久久超级碰视频| 国产毛片精品视频| www.亚洲人| 欧美日韩一区不卡| 日韩亚洲电影在线| 国产亚洲精品aa午夜观看| 国产精品沙发午睡系列990531| 国产精品国产三级国产aⅴ中文| 亚洲欧美精品午睡沙发| 亚洲成av人片一区二区梦乃| 日本va欧美va欧美va精品| 国产精品中文字幕日韩精品| 成人黄色a**站在线观看| 色哟哟精品一区| 日韩一区二区三| 中文字幕不卡一区| 午夜欧美在线一二页| 国产乱人伦精品一区二区在线观看 | 国产麻豆视频一区| 91亚洲资源网| 欧美一区二区三区免费在线看| 中文字幕欧美日韩一区| 日日摸夜夜添夜夜添精品视频| 国产美女在线观看一区| 在线观看视频一区二区| 久久久国产精品麻豆| 亚洲一区二区三区中文字幕在线| 老司机精品视频线观看86| 成人av免费在线| 日韩欧美成人激情| 亚洲综合在线免费观看| 国产精品乡下勾搭老头1| 欧美色视频在线观看| 日本一区二区三区四区在线视频| 五月天丁香久久| 一本色道亚洲精品aⅴ| 久久网站最新地址| 日本欧美加勒比视频| 91蜜桃婷婷狠狠久久综合9色| 精品国产乱码久久久久久1区2区| 亚洲图片欧美视频| 99九九99九九九视频精品| 精品成人佐山爱一区二区| 亚洲国产aⅴ成人精品无吗| 粉嫩久久99精品久久久久久夜| 日韩一级完整毛片| 婷婷亚洲久悠悠色悠在线播放| 成人少妇影院yyyy| 久久久99精品免费观看不卡| 五月婷婷久久丁香| 欧美日韩国产高清一区| 亚洲日本在线a| 丁香激情综合国产| 国产午夜精品久久久久久免费视 | 欧美在线观看你懂的| 国产精品全国免费观看高清 | 亚洲视频在线一区观看| 国产精品18久久久久久久久久久久| 欧美理论在线播放| 亚洲国产日韩在线一区模特| 一本到三区不卡视频| 亚洲精品乱码久久久久久久久 | 福利电影一区二区| 国产婷婷色一区二区三区四区 | 亚洲成人一二三| 在线观看网站黄不卡| 香港成人在线视频| 91精品国产综合久久久久| 婷婷丁香激情综合| 欧美一级精品在线| 国产一区二区三区不卡在线观看| 26uuu另类欧美亚洲曰本| 国产伦精品一区二区三区视频青涩 | 视频一区视频二区在线观看| 欧美日韩第一区日日骚| 日韩高清不卡在线| 精品久久久三级丝袜| 国产mv日韩mv欧美| 亚洲免费大片在线观看| 在线免费观看一区| 免费成人av在线播放| ww久久中文字幕| 99re热视频这里只精品| 午夜激情综合网| 久久你懂得1024| av不卡一区二区三区| 视频一区在线播放| 久久久久久久久久久久久女国产乱 | 成人爱爱电影网址| 亚洲国产成人tv| 久久先锋资源网| 色综合久久久久综合体桃花网| 日韩电影在线一区二区| 久久久精品tv| 欧美日韩综合在线免费观看| 激情五月播播久久久精品| 亚洲区小说区图片区qvod| 91精品国产高清一区二区三区 | 亚洲另类在线一区| 欧美一卡二卡三卡| 99久久久久久| 九色综合狠狠综合久久| 亚洲靠逼com| 久久久综合视频| 欧美日韩国产中文| av一区二区三区四区| 蜜桃视频免费观看一区| 亚洲欧美日本韩国| 国产午夜精品一区二区三区视频| 欧美猛男男办公室激情| 成人激情午夜影院| 九九热在线视频观看这里只有精品| 亚洲欧美韩国综合色| 久久新电视剧免费观看| 88在线观看91蜜桃国自产| 色激情天天射综合网| 国产91对白在线观看九色| 蜜臀91精品一区二区三区 | 欧美变态tickling挠脚心| 色综合色狠狠天天综合色| 国产一区二区三区视频在线播放| 视频一区国产视频| 亚洲综合精品久久| 亚洲视频一区二区免费在线观看| 久久伊人中文字幕| 宅男噜噜噜66一区二区66| 日本丰满少妇一区二区三区| 99在线视频精品| 成人午夜又粗又硬又大| 国产精品一区二区三区99| 玖玖九九国产精品| 日韩高清不卡一区| 日本美女一区二区| 日韩精品亚洲专区| 偷拍日韩校园综合在线| 午夜久久久久久久久| 亚洲一区二区3| 亚洲国产日韩一区二区| 亚洲成人你懂的| 午夜视频一区在线观看| 亚洲成人一二三| 天堂蜜桃一区二区三区| 日本不卡免费在线视频| 美腿丝袜一区二区三区| 久久精品国产澳门| 精品无人区卡一卡二卡三乱码免费卡| 日韩影视精彩在线| 精品一区二区免费在线观看| 国模少妇一区二区三区| 国产福利91精品| www.亚洲色图| 欧美性猛交xxxx乱大交退制版| 精品视频一区三区九区| 91精品国产aⅴ一区二区| 欧美大片在线观看| 国产欧美日韩综合| 亚洲欧美在线观看| 亚洲综合在线五月| 另类小说图片综合网| 国产成人午夜99999| 99久久久国产精品| 欧美喷水一区二区| 精品国产三级a在线观看| 欧美极品aⅴ影院| 亚洲精品视频在线看| 人人精品人人爱| 国产91精品精华液一区二区三区| 色噜噜偷拍精品综合在线| 欧美人与禽zozo性伦| 久久综合色一综合色88| 亚洲免费三区一区二区| 日本午夜一区二区| 东方aⅴ免费观看久久av| 在线观看av一区| 欧美xxx久久| 亚洲综合视频网| 国产精品一区二区在线观看不卡 | 欧美二区乱c少妇| 久久综合色之久久综合|