<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于A(yíng)VR單片機的控制系統設計

基于A(yíng)VR單片機的控制系統設計

作者: 時(shí)間:2014-12-19 來(lái)源:網(wǎng)絡(luò ) 收藏

  對于用戶(hù)按鍵操作切換不同的菜單時(shí),我們只需修改一個(gè)指向對應菜單節點(diǎn)的全局菜單節點(diǎn)指針即可。當用戶(hù)按下“ESC”鍵時(shí),菜單指針指向當前節點(diǎn)的父節點(diǎn),按下“Enter”鍵時(shí),則指針指向對應節點(diǎn)的子節點(diǎn)。

本文引用地址:http://dyxdggzs.com/article/267092.htm

  用于單片機的RAM空間較小,只有4KB,我們需設計一種合理而簡(jiǎn)潔的數據結構,我們將菜單的數據結構定義為(C語(yǔ)言實(shí)現)。

  

 

  圖3 menuselect函數的流程圖

  將菜單分為顯示型菜單和功能性菜單,顯示型菜單項用于切換各級菜單,功能型菜單則執行最底層菜單所對應的操作,total變量為0則表示為功能型菜單,大于0則表示選擇型菜單。通過(guò)菜單的ID,即可以知道當前菜單的顯示位置和內容,將此信息放在對應的displaymenu函數中可以節省數據空間,不用對于功能型菜單建立額外的ID與處理函數間的對應關(guān)系表,從而實(shí)現功能型菜單和顯示型菜單的一致性操作。一個(gè)供參考的執行函數可以寫(xiě)作:

  if(g_pmenu->total>0)

  { g_pmenu=menuselect(g_pmenu,Key);} else {(g_pmenu->displaymenu)(g_pmenu->ID,g_pmenu->cur);}

  其中menuselect函數用于切換對應的菜單子項,按鍵為“UP”鍵和“DOWN”鍵時(shí),只需修改g_pmune->cur即可;按下“ENTER”鍵時(shí),則g_pmenu=g_pmenu->down,再根據cur值,g_pmenu=g_pmenu->right;按下“ESC”鍵,則g_pmenu=g_pmenu->up.

  這種設計使得代碼數據量變得較小,同時(shí)增強了程序的擴展性,需要增加或修改菜單項時(shí),不論是功能型菜單還是執行性菜單,只需要修改對應的菜單結構的數組即可,而不必修改對應的執行代碼。經(jīng)過(guò)這樣的簡(jiǎn)化后,發(fā)現對于菜單數較多的多通道輸入/輸出系統,系統RAM區還是不夠用。對于一個(gè)8輸入通道的系統,每個(gè)通道的參數設置項可能多達40項,總菜單節點(diǎn)大于300個(gè),每個(gè)節點(diǎn)占用14B,則整個(gè)菜單節點(diǎn)所占的RAM已超過(guò)4K,所以這種方式還是需要進(jìn)一步改進(jìn)。

  注意到多通道的參數設置項完全相同,ID為111,112,。,118的菜單分支完全一樣,ID為121和122的菜單分支也完全相同??梢远x一種Sibling菜單,從而刪去ID為112~118以及ID為122的菜單節點(diǎn)和子節點(diǎn)(虛線(xiàn)框所示),其上級菜單(ID為11和ID為12)的項目中的total值均變?yōu)?.為了區別不同的通道分支,有兩種實(shí)現辦法:

  一種處理方法采用全局變量

  增加一個(gè)g_CODER_Channel_Number的全局變量,用于保存當前的通道號。在menuselect函數中,增加一個(gè)針對本系統設計的一個(gè)判斷,當ID為11時(shí),則不修改對應的g_pmenu->cur,而是直接修改變量g_CODER_Channel_Number,進(jìn)入對應的顯示函數后,直接根據g_CODER_Channel_Number判斷通道號,從而輸出對應的值。這種方法不需要改變系統設計的結構,但需要針對不同的系統修改主處理函數menuselect.

  另一種處理方法在菜單結構中增加一個(gè)MenuSibling結構,定義為

  typedef struct _menuSibling{

  signedcharcur;signedchartotal;}SIBLING;同時(shí)對應的菜單結構修改為typedefstructmenu{……

  SIBLINGSibling;}MENU;

  這樣,ID為11的結構項的Sibling.total為8,Sibling.cur為當前的子菜單項。判斷到total>0且Sibling.total>0時(shí),可知其下一級菜單為SIB2LING菜單,此時(shí)以前需修改cur想的操作則修改Sibling.cur即可。這種設計下,每個(gè)節點(diǎn)增加了2B的空間,但是保證的程序的一致性,對于不同的系統其設計基本一致。

  以上菜單項的設計用于系統設置部分,當退出系統設置時(shí),即進(jìn)入系統循環(huán)檢測部分。單片機通過(guò)接口檢測各個(gè)通道是否正常,當正常時(shí)則顯示為綠燈,出現異常則顯示為紅燈,黃燈為中間狀態(tài)。指示燈的流程參見(jiàn)圖4.

  

 

  圖4循環(huán)檢測的指示燈流程

  結束語(yǔ)

  按照本文提供的方法優(yōu)化后的設計,可以滿(mǎn)足大多數的多通道輸入/輸出系統的控制系統的需要,整個(gè)系統的設計主要在于建立一個(gè)菜單樹(shù),將對應的節點(diǎn)編號,再編寫(xiě)對應的節點(diǎn)處理函數即可。這種設計使得程序的開(kāi)發(fā)、維護都很容易,具有較強的可擴展性和可移植性。

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


單片機相關(guān)文章:單片機教程


單片機相關(guān)文章:單片機視頻教程


單片機相關(guān)文章:單片機工作原理


蜂鳴器相關(guān)文章:蜂鳴器原理

上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: AVR ATmega128 RS-485

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>