<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                【119.1 一個完整的人機界面的程序框架的脈絡。】 前面兩節例子告訴我們,一個完整的人機界面的程序框架包含兩個要素,分別是“支點”與“更新”。“支點”包括“窗口選擇”和“局部選擇”,“更新”包括“整屏更新”和“局部更新”。 “支點”的作用是把顯示函數與按鍵函數完美無縫的關聯起來,兩個函數同樣的“支點”促使同樣的“話語體系”,讓“所見即所得”實時同步,確保按鍵操作的數據就是當前顯示被選中的數據。 “靜態數據”與“動態數據”的概念。被窗口顯示的數據通常有兩種:一種是靜態數據,比如裝飾門面的數據,只能顯示不能更改的數據,以及圖片圖標這類數據;另外一種是動態數據,這種數據在窗口顯示上是活動的可編輯的,是需要經常修改的,往往也是系統核心的數據,需要保存或者需要跟某些關鍵運動密切相關的數據。比如,在前面章節中,數碼管要顯示三個窗口“1-XX”,“2-YY”,“3-ZZ”,其中“1-”、“2-”、“3-”是屬于靜態數據,它們是起“裝飾”作用的。而“XX”、“YY”、“ZZ”則是動態數據,它們是可編輯的,也是單片機系統內部核心的數據。 “整屏更新”與“局部更新”的分工。“整屏更新”主要負責在切換新窗口時,把“靜態數據”一次性顯示到當前窗口。而“局部更新”主要負責在當前窗口下顯示“動態數據”。 下面,我把一個完整的人機界面的程序框架的脈絡勾勒出來,讓大家有一個整體的觀感,這種人機界面的程序框架放之四海而皆準,我已把它應用在各種數碼管,單色液晶屏,彩屏,電腦上位機等項目上。假設某個項目中只有兩個”窗口”只有兩個“局部”,程序框架的脈絡如下: 顯示部分: void DisplayTask(void) //數碼管顯示的上層任務函數 { switch(Gu8Wd) //以“窗口選擇”Gu8Wd為支點 { case 1: Wd1(); //窗口1顯示函數 break; case 2: Wd2(); //窗口2顯示函數 break; } } void Wd1(void) //窗口1顯示函數 { if(1==Gu8WdUpdate) //整屏更新 { Gu8WdUpdate=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 ...... //此處省略N行代碼,用來顯示靜態的數據,比如圖片圖標,或者裝飾的數據 //以下,“整屏更新”必然是要把所有的“局部更新”都觸發一次 Gu8PartUpdate\_1=1; //局部1更新顯示 Gu8PartUpdate\_2=1 ;//局部2更新顯示 } if(1==Gu8PartUpdate\_1) //局部1更新顯示 { Gu8PartUpdate\_1=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 ...... //此處省略N行代碼,用來顯示動態的數據。比如可編輯的數據,實時變化的數據 } if(1==Gu8PartUpdate\_2) //局部2更新顯示 { Gu8PartUpdate\_2=0; //及時清零,只更新一次顯示即可,避免一直進來更新顯示 ...... //此處省略N行代碼,用來顯示動態的數據。比如可編輯的數據,實時變化的數據 } if(0==vGu16BlinkTimerCnt) //跳動的光標,或者動態閃爍的某位被選中的數據 { vGu8BlinkTimerFlag=0; vGu16BlinkTimerCnt=BLINK\_TIME; //重設定時器的定時時間 vGu8BlinkTimerFlag=1; ...... //此處省略N行代碼,用來制作跳動的光標或者某位被選中而閃爍的數據 } } void Wd2(void) //窗口2顯示函數 { ...... //此處省略N行代碼,窗口2顯示函數的代碼跟窗口1類似 } 按鍵部分: void KeyTask(void) //按鍵的任務函數 { if(0==vGu8KeySec) { return; } switch(vGu8KeySec) { case 1: //1號按鍵 switch(Gu8Wd) //以“窗口選擇”Gu8Wd為支點 { case 1: //在窗口1下 switch(Gu8Part) //以“局部選擇”Gu8Part為支點 { case 1: ...... //此處省略N行代碼 break; case 2: //局部2被選中 ...... //此處省略N行代碼 break; } break; case 2: //在窗口2下 switch(Gu8Part) //以“局部選擇”Gu8Part為支點 { case 1: ...... //此處省略N行代碼 break; case 2: //局部2被選中 ...... //此處省略N行代碼 break; } break; } vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; case 2: //2號按鍵 ...... //此處省略N行代碼,跟1號按鍵的代碼類似 vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=VOICE\_TIME; //蜂鳴器發出“滴”一聲 vGu8BeepTimerFlag=1; vGu8KeySec=0; break; } }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看