|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
匯編程序設(shè)計思路出現(xiàn)問題,請教大家 |
| 作者:wenteng 欄目:單片機(jī) |
有些疑問,向大家請教: 單片機(jī)系統(tǒng)中采用LCD顯示、修改數(shù)據(jù),采用鍵盤輸入,有翻頁(PAGE)鍵,設(shè)置鍵等。共9個畫面,每畫面為單獨一個子程序,每畫面顯示3-4行參數(shù),鍵盤采用中斷處理,如按下翻頁鍵,中斷把其對應(yīng)寄存器加1。問題如下: 當(dāng)PAGE=8,操作第8個畫面的第二行時,如果再次按下page鍵,應(yīng)跳轉(zhuǎn)到畫面9,我在畫面8中的每一行操作完成后查詢PAGE鍵對應(yīng)的寄存器是否等9,等于則跳轉(zhuǎn)。這樣就導(dǎo)致了當(dāng)前畫面沒有執(zhí)行完就跳轉(zhuǎn)到其他畫面了,若從第一個畫面算起,指針將在各個子程序中跳來跳去,每個子程序都沒有執(zhí)行完,即沒有執(zhí)行ret.這樣的思路我認(rèn)為有問題,可是又沒有別的思路。請教大家。 |
| 2樓: | >>參與討論 |
| 作者: kanprin 于 2006/1/13 15:34:00 發(fā)布:
用匯編最好把流程圖先寫好。 思路清晰了再動手寫代碼。 沒看出來你問的是什么意思。 抱歉。 |
|
| 3樓: | >>參與討論 |
| 作者: wenteng 于 2006/1/13 15:40:00 發(fā)布:
主要是程序"指針"在各個子程序間跳來跳去. 主要是程序"指針"在各個子程序間跳來跳去. |
|
| 4樓: | >>參與討論 |
| 作者: 楊工 于 2006/1/13 17:44:00 發(fā)布:
互相切磋 我寫過幾次菜單,總覺得不是太滿意,F(xiàn)在寫出來和大家交流。 首先說明和C或者匯編沒什么關(guān)系,當(dāng)然C清楚一些,我的菜單設(shè)計思路是: 1. 在大循環(huán)里調(diào)用菜單程序。 2. 采用狀態(tài)機(jī)的概念,每個畫面都是一個狀態(tài)。對應(yīng)一個子程序。 每次調(diào)用時根據(jù)當(dāng)前菜單號調(diào)用不同的子程序。 3. 每個子程序執(zhí)行時間都很短,不能長期占著不出來。比如不能等待用戶輸入,應(yīng)該立即返回,為用戶輸入設(shè)置計數(shù)器,實際是子狀態(tài)。 4. 我在處理鍵盤輸入采用了類似PC機(jī)的做法,設(shè)置一個鍵盤輸入緩沖區(qū),其實只存1個鍵碼就夠了。硬件中斷負(fù)責(zé)存鍵盤,再寫個子程序負(fù)責(zé)取鍵盤。 |
|
| 5樓: | >>參與討論 |
| 作者: water2005 于 2006/1/13 20:20:00 發(fā)布:
re 沒太看明白樓主的思路,可以設(shè)置兩個鍵 一個pagedown,一個“確定”鍵 進(jìn)入一個畫面,通過pagedown來選擇某行要執(zhí)行的功能,按“確定”執(zhí)行。每個畫面有兩行是:“上一畫面”和“下一畫面” 一個寄存器用來記錄pagedown的按下次數(shù),進(jìn)入新畫面清空 |
|
| 6樓: | >>參與討論 |
| 作者: guorock 于 2006/1/14 10:14:00 發(fā)布:
我這些天也在做這方面的事,有幾種方法。 等我調(diào)好了,總結(jié)下然后貼出來! |
|
| 7樓: | >>參與討論 |
| 作者: computer00 于 2006/1/14 11:53:00 發(fā)布:
我以前也做過簡單的菜單,就是等待按鍵按下,一個while語句。 |
|
| 8樓: | >>參與討論 |
| 作者: wenteng 于 2006/1/14 14:03:00 發(fā)布:
程序 看了大家的帖子,我正在考慮。 每個畫面對應(yīng)一個子程序,主要畫面間的切換問題。 PICTURE8: LCALL FIRST;調(diào)用第一行顯示程序 MOV A,PAGE;采樣鍵盤中斷,查詢寄存器 CJNE A,#01H,KL LCALL PICTURE9; KL: LCALL CHANGE;調(diào)用第一行參數(shù)修改程序 . . . . . RET PICTURE9: 結(jié)構(gòu)同上PICTURE 當(dāng)有翻頁鍵按下時,“指針”將直接跳到PICTURE9.而PICTURE8并沒有返回,我感覺這個思路有問題。 |
|
| 9樓: | >>參與討論 |
| 作者: xwj 于 2006/1/14 18:21:00 發(fā)布:
暈,樓主的思路有問題,哪有這樣編菜單的 |
|
| 10樓: | >>參與討論 |
| 作者: 楊工 于 2006/1/14 20:18:00 發(fā)布:
和wenteng商榷 我的意思是,當(dāng)條件滿足,應(yīng)該改變狀態(tài),進(jìn)入PICTURE8時 { call disp_PICTURE8(); //顯示PICTURE8 state = 8; //狀態(tài)=8 return; } 再次進(jìn)入菜單時, 根據(jù)state,調(diào)用in_PICTURE8() in_PICTURE8() { key=ReadKey(); //讀按鍵 if(key == xx1) { //相應(yīng)處理, 包括可能改變state } if(key == xx2) { //相應(yīng)處理, 包括可能改變state } ... } |
|
| 11樓: | >>參與討論 |
| 作者: wenteng 于 2006/1/14 20:52:00 發(fā)布:
致楊工: 楊工,您的思路我是這樣理解的 MAIN: LCALL MAINPICRURE;這是需要不斷檢測系統(tǒng)參數(shù)的程序 . . . MOV A,PAGE CJNE A,#01H,PAGE2 LCALL PICTURE1 PAGE2: CJNE A,#02H,PAGE3 LCALL PICTURE2 PAGE3: CJNE A,#03H,PAGE LCALL PICTURE3 . . . LJMP MAIN PICTURE1: . ;顯示并進(jìn)行數(shù)據(jù)修改,用到增加,減少鍵,確認(rèn)鍵 . . . RET PICTURE2: . . . . RET 在各個子程序中沒有循環(huán)等待,執(zhí)行完即返回。系統(tǒng)中還有增加鍵,減少鍵,設(shè)置鍵,確認(rèn)鍵。對應(yīng)每個畫面的某一行進(jìn)行按鍵操作時,我正在考慮如何處理?不能在子程序中等待。也請大家給些建議。 |
|
| 12樓: | >>參與討論 |
| 作者: blliao 于 2006/1/15 8:08:00 發(fā)布:
通常做法 中斷僅處理標(biāo)志加1的事件flag++;立即返回 主循環(huán)根據(jù)flag的值顯示畫面 |
|
| 13樓: | >>參與討論 |
| 作者: wenteng 于 2006/1/15 13:07:00 發(fā)布:
程序太長了 楊工的思路我考慮是有道理的,F(xiàn)在問題是子程序太長了,有100多行。需要對畫面的每一行進(jìn)行操作。一般子程序長度有什么合理顯示嗎? |
|
| 14樓: | >>參與討論 |
| 作者: zljzlj 于 2006/1/15 23:02:00 發(fā)布:
我的看法! |
|
| 15樓: | >>參與討論 |
| 作者: zljzlj 于 2006/1/15 23:09:00 發(fā)布:
圖怎么不直接顯示。暈! 一句話,還是程序或者說是系統(tǒng)架子不好, 各個任務(wù)各干各的事,同一時刻就一個任務(wù)是即或的,那么這樣所有與之關(guān)聯(lián)的才回響應(yīng),關(guān)鍵兩點:1系統(tǒng)耗時的分配2不同任務(wù)的管理。想好了就OK了。 千萬不要刻意的去等什么,有就干,沒有就轉(zhuǎn)走,就把他當(dāng)OS來設(shè)計。 呵呵!個人看法啊。 |
|
| 16樓: | >>參與討論 |
| 作者: wnch 于 2006/1/16 10:23:00 發(fā)布:
匯編本來就是一個跳來跳去的語言。不是一個結(jié)構(gòu)化的語言! |
|
| 17樓: | >>參與討論 |
| 作者: xymxym 于 2006/1/16 10:45:00 發(fā)布:
用狀態(tài)機(jī)的思路啊 初始時設(shè)變量MenuState=1,表示指向第一頁菜單,當(dāng)翻頁鍵按下時MenuState++;如果MenuState>9,則將其初始為1,再設(shè)一個標(biāo)志Flag1,當(dāng)MenuState被改變時(或翻頁鍵按下時),F(xiàn)lag1=1,主程序中判斷Flag=1時,將其清0,再根據(jù)MenuState的值調(diào)用相應(yīng)的菜單屏幕。鍵盤處理也是一樣,當(dāng)?shù)玫揭粋值時,先判斷MenuState,再將鍵值根據(jù)當(dāng)前所處菜單的處理規(guī)則進(jìn)行處理。千萬不要讓程序在一個子程序中死等,也不要從一個子程序LJMP到另一個子程序,這樣自己都會暈的。只要設(shè)一個標(biāo)志或狀態(tài)寄存器,然后在主程序中去處理,這樣結(jié)構(gòu)會清楚點。 |
|
| 18樓: | >>參與討論 |
| 作者: wenteng 于 2006/1/19 15:12:00 發(fā)布:
有道理 樓上說得很有道理。我正在考慮。我現(xiàn)在的問題是不但有翻頁鍵,還有增加,減少按鍵。每個畫面對應(yīng)的按鍵如何處理是我現(xiàn)在要解決的問題。請大家指教。 |
|
| 19樓: | >>參與討論 |
| 作者: RobertJ 于 2006/1/27 9:07:00 發(fā)布:
同意xymxym的思路 以前偶也做過,用狀態(tài)轉(zhuǎn)移大法則無往而不利了 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |