找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
樓主: Similarv
打印 上一主題 下一主題
收起左側(cè)

請工程化,定制化你的單片機代碼

    [復(fù)制鏈接]
回帖獎勵 40 黑幣 回復(fù)本帖可獲得 2 黑幣獎勵! 每人限 1 次
161#
ID:668298 發(fā)表于 2020-1-3 08:37 | 只看該作者
講的真好,從實用角度出發(fā),給出解決方案。
回復(fù)

使用道具 舉報

162#
ID:682611 發(fā)表于 2020-1-7 08:50 | 只看該作者
說到的東西非常有用
回復(fù)

使用道具 舉報

163#
ID:553941 發(fā)表于 2020-1-7 14:29 | 只看該作者
Similarv 發(fā)表于 2019-6-20 13:30
用靜態(tài)變量去統(tǒng)計按鍵的時間,隨后對此時間進行裁決。
延時只會讓你的程序卡在那里一段時間,動彈不得。

如果我只需要執(zhí)行一次按鍵之后的程序,為了避免按鍵長按導(dǎo)致的重復(fù)運行,就用一個變量,在每次進入中斷檢測到這個按鍵按下的時候加一,然后判斷這個變量的值,必須在要求的范圍內(nèi)才執(zhí)行,這樣是不是就能解決按鍵消抖和長按的問題了
回復(fù)

使用道具 舉報

164#
ID:195830 發(fā)表于 2020-1-7 15:01 | 只看該作者
絕世好帖!
回復(fù)

使用道具 舉報

165#
ID:283883 發(fā)表于 2020-1-7 18:48 | 只看該作者
很好,謝謝分享
回復(fù)

使用道具 舉報

166#
ID:636210 發(fā)表于 2020-1-8 08:57 | 只看該作者
很牛的分析
回復(fù)

使用道具 舉報

167#
ID:323102 發(fā)表于 2020-1-8 14:50 | 只看該作者
可不可以把文檔資料發(fā)上來?
回復(fù)

使用道具 舉報

168#
ID:682588 發(fā)表于 2020-1-9 15:49 | 只看該作者
在按鍵處理過程中,使用狀態(tài)機控制可以釋放CPU的資源
回復(fù)

使用道具 舉報

169#
ID:108573 發(fā)表于 2020-1-11 10:04 | 只看該作者
絕世好貼,就是不知道PDF文檔發(fā)在哪了?
回復(fù)

使用道具 舉報

170#
ID:590770 發(fā)表于 2020-1-11 18:07 | 只看該作者
這個得頂啊,老鐵
回復(fù)

使用道具 舉報

171#
ID:488782 發(fā)表于 2020-1-11 23:53 | 只看該作者
豁然開朗啊
回復(fù)

使用道具 舉報

172#
ID:77675 發(fā)表于 2020-1-12 21:05 | 只看該作者
有種使人豁然開郎的感覺,正規(guī)化流程。
回復(fù)

使用道具 舉報

173#
ID:59168 發(fā)表于 2020-1-12 23:40 | 只看該作者

專家講解,學(xué)習了。
回復(fù)

使用道具 舉報

174#
ID:599678 發(fā)表于 2020-1-13 09:20 | 只看該作者
這種針對代碼量小的項目實時性沒有問題。但代碼量大的整個程序架構(gòu)就會顯得臃腫,也需針對同一個事情,在主函數(shù)中不同時基處都要處理。比較好的做法是把定時器做成指針回調(diào),需要一個定時器,就定義一個變量,通過注冊函數(shù)把地址給底層函數(shù),應(yīng)用層看只是申明一個變量,并且通過注冊函數(shù)給個地址,底層看只是檢測到該地址有效,然后定時加1加到最大(不溢出)。兩層分開各自管理方便維護。
回復(fù)

使用道具 舉報

175#
ID:130230 發(fā)表于 2020-1-13 09:34 | 只看該作者
先別照抄別人的,給個思路。定時器中斷+flg+狀態(tài)機實現(xiàn)一個阻塞式的時間片程序結(jié)構(gòu)。。。自己試一下不難的在看這篇文章。
回復(fù)

使用道具 舉報

176#
ID:476527 發(fā)表于 2020-1-13 16:52 | 只看該作者
本帖最后由 Similarv 于 2020-1-13 18:07 編輯
13303022280 發(fā)表于 2020-1-7 14:29
如果我只需要執(zhí)行一次按鍵之后的程序,為了避免按鍵長按導(dǎo)致的重復(fù)運行,就用一個變量,在每次進入中斷檢 ...

你的做法當然也沒有問題,不過我是這么做的:
按鍵就只是做按鍵檢測,并且設(shè)置相應(yīng)的“按鍵已觸發(fā)”標志(bit變量);至于按鍵的功能則是在別處比如狀態(tài)機中去執(zhí)行。
例子:當按鍵按下之后開/關(guān)燈

key.c 文件:
bit key_flag_light;  //當按鍵觸發(fā)時為1,否則為0, 此變量是給狀態(tài)機使用的
static bit key_press_light; //當按鍵按下時為1,未按下為0,此變量僅在key.c內(nèi)使用。
函數(shù)1-keyScan()  -- 功能:檢測按鍵是否按下,若按鍵按下則將key_press_light置一,否則清零。
函數(shù)2-keyDeal()   -- 功能:使用某靜態(tài)變量統(tǒng)計key_press_light的時間;當key_press_light從1變?yōu)?的時候,檢查靜態(tài)變量的值是否大于消抖值,若大于消抖時間則將key_flag_light設(shè)置為1;

state.c文件
函數(shù)1-StateMachine() -- 功能:當key_flag_light==1時,取反led_flag_out的值,隨后將key_flag_light設(shè)置為0.

led.c文件
bit led_flag_out; //當該值==1,開燈;當該值==0;關(guān)燈
函數(shù)1-ledOutput() -- 功能:根據(jù)led_flag_out的取值開燈或者關(guān)燈

main.c文件
在10ms或者20ms的時基中依次調(diào)用
keyScan();
keyDeal();
StateMachine();
在100ms的時基中調(diào)用
ledOutput();

/******/
稍微修改一下,剛剛沒有認真審題,你需要做長按的判定,我這個架構(gòu)是基于短按的。
修改的地方位于keyDeal()部分,
短按 —— 是等待按鍵松開時裁決靜態(tài)變量的計時值。
長按 —— 則是直接在靜態(tài)變量等于‘長按時間點’的時刻將key_flag_light置一即可。key_flag_light==1的時候,狀態(tài)機自然會處理長按事件,此后keyDeal()里的靜態(tài)變量會在按鍵繼續(xù)按著的時候繼續(xù)加,但其值已經(jīng)‘大于’‘長按時間點’了,所以key_flag_light不會被重復(fù)置一,當按鍵釋放之后,此靜態(tài)變量清零,一切重新開始。


回復(fù)

使用道具 舉報

177#
ID:476527 發(fā)表于 2020-1-13 17:46 | 只看該作者
hubj627 發(fā)表于 2020-1-13 09:20
這種針對代碼量小的項目實時性沒有問題。但代碼量大的整個程序架構(gòu)就會顯得臃腫,也需針對同一個事情,在主 ...

進階教程尚待壇友們自己修行,鄙人不才,只能帶路到這了
回復(fù)

使用道具 舉報

178#
ID:108573 發(fā)表于 2020-1-13 22:21 | 只看該作者
Similarv 發(fā)表于 2020-1-13 17:46
進階教程尚待壇友們自己修行,鄙人不才,只能帶路到這了

樓主是否在其他帖子發(fā)布了PDF及源碼?想下載先來,沒事多看看,望回復(fù)
回復(fù)

使用道具 舉報

179#
ID:476527 發(fā)表于 2020-1-14 09:11 | 只看該作者
神出沒 發(fā)表于 2020-1-13 22:21
樓主是否在其他帖子發(fā)布了PDF及源碼?想下載先來,沒事多看看,望回復(fù)

暫時還沒有別的文章,此文獨此一份,有沒有盜貼我就不清楚了
回復(fù)

使用道具 舉報

180#
ID:685918 發(fā)表于 2020-1-14 09:47 | 只看該作者
多謝樓主分享
回復(fù)

使用道具 舉報

181#
ID:59151 發(fā)表于 2020-1-18 00:24 | 只看該作者
很好的文章,不止內(nèi)容好,就連寫的文章都是那么文理清晰,有可能文章寫得好的人寫單片機代碼都是特別清晰的,因為作者的思路太棒了
回復(fù)

使用道具 舉報

182#
ID:661513 發(fā)表于 2020-1-21 16:33 來自觸屏版 | 只看該作者
寫的真好,對定時器有了更深的理解
回復(fù)

使用道具 舉報

183#
ID:615823 發(fā)表于 2020-1-23 17:56 | 只看該作者

學(xué)習了 非常好 期待后續(xù)
回復(fù)

使用道具 舉報

184#
ID:544092 發(fā)表于 2020-1-26 12:06 | 只看該作者
shenyuqiu 發(fā)表于 2019-8-10 10:38
樓主這文章比那些所謂的教科書好多了,那些教科書按鍵消抖動不動就是delay(20ms),真是誤人子弟,真正出來 ...

回想一下自己在剛開始學(xué)的時候是什么樣子,你是明白了單片機編程,回頭說教科書爛。教科書是面向初學(xué)者的,目的是引人入門。初學(xué)者,你給他講狀態(tài)機編程,他能搞明白?搞不明白不說,反而會打擊學(xué)習興趣。這些東西在初學(xué)的時候都不重要,重點關(guān)注單片機本身的基本功能和應(yīng)用,等有一定的知識和經(jīng)驗之后,在來學(xué)這些也不遲。
回復(fù)

使用道具 舉報

185#
ID:117930 發(fā)表于 2020-1-27 00:33 | 只看該作者
對于我等初學(xué)者來說 確實有很大的啟示  謝謝
回復(fù)

使用道具 舉報

186#
ID:68468 發(fā)表于 2020-1-28 23:09 | 只看該作者
好貼,頂樓主!
回復(fù)

使用道具 舉報

187#
ID:494559 發(fā)表于 2020-1-30 12:44 | 只看該作者

很好的文章,請繼續(xù)。感謝!
回復(fù)

使用道具 舉報

188#
ID:76606 發(fā)表于 2020-3-13 22:34 | 只看該作者
好文章 要分享
回復(fù)

使用道具 舉報

189#
ID:413383 發(fā)表于 2020-3-14 00:18 | 只看該作者
不錯的文章,希望有后續(xù)
回復(fù)

使用道具 舉報

190#
ID:692599 發(fā)表于 2020-3-14 10:50 | 只看該作者
很不錯的文章,樓主的這個按鍵程序應(yīng)該是按鍵彈起后才響應(yīng)的吧
回復(fù)

使用道具 舉報

191#
ID:542948 發(fā)表于 2020-3-14 16:53 | 只看該作者

看完受益匪淺,希望有后續(xù)
回復(fù)

使用道具 舉報

192#
ID:258004 發(fā)表于 2020-3-14 19:51 | 只看該作者
學(xué)習了。留個記號。觸類旁通。其他語言也同樣。
回復(fù)

使用道具 舉報

193#
ID:695749 發(fā)表于 2020-3-14 22:48 | 只看該作者
理念在不斷的突破,再次學(xué)習,受益中,謝謝分享!
回復(fù)

使用道具 舉報

194#
ID:585390 發(fā)表于 2020-3-16 17:02 | 只看該作者
點贊,謝謝分享,學(xué)習一下
回復(fù)

使用道具 舉報

195#
ID:709387 發(fā)表于 2020-3-16 17:58 | 只看該作者
感謝感謝    學(xué)習了
回復(fù)

使用道具 舉報

196#
ID:709685 發(fā)表于 2020-3-16 20:28 | 只看該作者
作為新手的我想了解更多。
回復(fù)

使用道具 舉報

197#
ID:707109 發(fā)表于 2020-3-16 21:11 | 只看該作者
非常喜歡,希望有后續(xù)
回復(fù)

使用道具 舉報

198#
ID:21545 發(fā)表于 2020-3-16 21:43 | 只看該作者
學(xué)習了,謝謝。!
回復(fù)

使用道具 舉報

199#
ID:705241 發(fā)表于 2020-8-20 17:27 | 只看該作者
講的好,有收獲啊
回復(fù)

使用道具 舉報

200#
ID:813486 發(fā)表于 2020-8-22 10:27 | 只看該作者
受益匪淺
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表