找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

請(qǐng)工程化,定制化你的單片機(jī)代碼

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

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

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

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

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

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


回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

181#
ID:59151 發(fā)表于 2020-1-18 00:24 | 只看該作者
很好的文章,不止內(nèi)容好,就連寫的文章都是那么文理清晰,有可能文章寫得好的人寫單片機(jī)代碼都是特別清晰的,因?yàn)樽髡叩乃悸诽袅?/td>
回復(fù)

使用道具 舉報(bào)

182#
ID:661513 發(fā)表于 2020-1-21 16:33 來(lái)自手機(jī) | 只看該作者
寫的真好,對(duì)定時(shí)器有了更深的理解
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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