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

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

?? menufsm.c

?? 一個占用內存極少的菜單系統的實現 8051菜單系統
?? 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一区二区三区免费野_久草精品视频
综合久久一区二区三区| 国产精品996| 国产高清不卡二三区| 在线亚洲一区观看| 久久久国际精品| 亚洲va欧美va国产va天堂影院| 国产美女在线精品| 欧美一区二区三区四区在线观看| 国产欧美视频在线观看| 视频一区二区中文字幕| 91丨porny丨中文| 久久噜噜亚洲综合| 亚洲成人av在线电影| www.欧美色图| 国产丝袜欧美中文另类| 日本大胆欧美人术艺术动态| 色哟哟国产精品免费观看| 国产亚洲综合av| 激情偷乱视频一区二区三区| 欧美日韩一二三区| 一区二区三区四区五区视频在线观看| 国内精品自线一区二区三区视频| 欧美日韩三级一区二区| 欧美三级午夜理伦三级中视频| 久久综合九色综合欧美亚洲| 肉色丝袜一区二区| 日韩三级在线免费观看| 亚洲123区在线观看| 色综合久久九月婷婷色综合| 欧美日韩视频在线第一区 | 麻豆视频一区二区| 国产亚洲成av人在线观看导航| 色网站国产精品| 国产主播一区二区| 美腿丝袜亚洲色图| 性做久久久久久免费观看欧美| 26uuuu精品一区二区| 日韩免费视频一区| 国产人成一区二区三区影院| 一区二区日韩av| 色综合久久久久综合体| 亚洲啪啪综合av一区二区三区| 国产不卡在线一区| 国产精品乱子久久久久| 91免费看片在线观看| 亚洲欧美日韩一区二区三区在线观看 | 日本一区二区三区四区在线视频| 日本道色综合久久| 一区二区三区丝袜| 欧美欧美欧美欧美首页| 日本成人在线不卡视频| 欧美精品一区二区三区久久久| 国产精品一区二区在线观看网站| 国产视频一区二区在线观看| av一二三不卡影片| 亚洲不卡在线观看| 欧美videossexotv100| 国产99久久精品| 亚洲综合色噜噜狠狠| 欧美一区二区三区四区高清| 高清在线观看日韩| 亚洲国产欧美在线人成| 日韩免费在线观看| 97国产精品videossex| 天天色综合成人网| 久久久久9999亚洲精品| 在线看国产日韩| 国产精品一线二线三线精华| 亚洲天堂a在线| 欧美tickling网站挠脚心| 99久久综合狠狠综合久久| 天天综合色天天综合色h| 久久久久久久久免费| 欧美性一区二区| 国产精品99久久久久久久vr| 亚洲欧美日韩国产综合| 精品国产凹凸成av人网站| 99re亚洲国产精品| 激情文学综合插| 一区二区三区在线免费| 26uuu国产电影一区二区| 91高清在线观看| 国产精品综合一区二区| 午夜精品免费在线| 国产精品乱码人人做人人爱 | 午夜视频一区二区三区| 欧美国产成人精品| 日韩一级免费观看| 色系网站成人免费| 国产精品一卡二卡在线观看| 日韩电影免费在线| 亚洲视频一区二区在线观看| 久久先锋影音av| 欧美日本精品一区二区三区| zzijzzij亚洲日本少妇熟睡| 狠狠久久亚洲欧美| 日韩不卡一区二区三区| 亚洲自拍欧美精品| 国产精品久线在线观看| 久久影院电视剧免费观看| 欧美日韩国产123区| 成人一区在线观看| 国产一区二区三区最好精华液| 日日夜夜一区二区| 亚洲午夜激情av| 亚洲一区二区av在线| 亚洲精品国产无套在线观| 中文字幕一区在线| 国产三级精品三级| 久久精品视频在线看| 日韩精品一区二区三区在线观看| 欧美精品三级日韩久久| 欧美三级视频在线观看| 欧美影院午夜播放| 在线亚洲人成电影网站色www| 播五月开心婷婷综合| 成人深夜在线观看| 99热国产精品| 一本色道久久综合亚洲91| 91在线观看一区二区| 99久久精品免费看| 91精品91久久久中77777| 色www精品视频在线观看| 色欧美片视频在线观看在线视频| 一本大道av伊人久久综合| 在线精品亚洲一区二区不卡| 欧美日韩一卡二卡三卡 | 久久国产三级精品| 久久电影网站中文字幕| 国产一区二区在线视频| 成人看片黄a免费看在线| av亚洲精华国产精华| 欧美亚洲国产怡红院影院| 欧美人妖巨大在线| 日韩久久久久久| 国产婷婷色一区二区三区在线| 国产午夜精品久久久久久免费视 | 国产亚洲美州欧州综合国| 欧美国产日本韩| 亚洲一区av在线| 日本免费新一区视频| 高清国产一区二区| 欧洲一区二区三区免费视频| 91精品久久久久久久91蜜桃| 欧美r级在线观看| 成人免费小视频| 亚洲v精品v日韩v欧美v专区| 国产精品一二三区在线| 91在线视频免费观看| 欧美一区二区三区小说| 亚洲国产高清不卡| 五月天激情综合| 成人短视频下载| 欧美老人xxxx18| 日本一区二区三区久久久久久久久不 | 欧美三日本三级三级在线播放| 在线观看国产日韩| 日韩欧美www| 中文字幕一区av| 秋霞影院一区二区| eeuss鲁一区二区三区| 在线观看网站黄不卡| 精品国产伦一区二区三区免费 | 宅男噜噜噜66一区二区66| 国产欧美1区2区3区| 亚洲国产精品一区二区久久| 国产成人精品影院| 3751色影院一区二区三区| 国产精品国产三级国产aⅴ无密码| 日韩高清不卡一区二区三区| 91视视频在线直接观看在线看网页在线看| 欧美酷刑日本凌虐凌虐| 中文字幕亚洲区| 狠狠狠色丁香婷婷综合激情 | 成人在线视频一区二区| 日韩一区二区不卡| 亚洲国产另类av| 91丨国产丨九色丨pron| 国产日韩欧美高清| 久久国产精品99久久久久久老狼| 91福利在线观看| 中文字幕一区二区在线观看| 国产精品一区二区你懂的| 欧美精品一卡二卡| 亚洲欧美日韩一区二区| www.一区二区| 欧美激情中文字幕一区二区| 美女爽到高潮91| 91精品国产综合久久婷婷香蕉| 亚洲精品亚洲人成人网在线播放| 高清国产午夜精品久久久久久| 精品91自产拍在线观看一区| 日本成人在线不卡视频| 欧美日韩亚洲综合在线 | 亚洲国产高清在线| 福利电影一区二区三区| 久久久久久久久久久久久女国产乱 | 99re成人在线| 亚洲欧美在线观看| 91麻豆123|