標(biāo)題: [后續(xù)]單片機(jī)狀態(tài)機(jī)+事件驅(qū)動(dòng) 按鍵掃描 [打印本頁]

作者: 王朗的誘惑    時(shí)間: 2020-4-9 23:38
標(biāo)題: [后續(xù)]單片機(jī)狀態(tài)機(jī)+事件驅(qū)動(dòng) 按鍵掃描
本帖最后由 王朗的誘惑 于 2020-4-14 22:26 編輯

前接[失敗]狀態(tài)機(jī)+事件驅(qū)動(dòng) 按鍵掃描。(如果懶得看前面的內(nèi)容可以直接看本帖,無妨)
繼2018年10月實(shí)驗(yàn)過一個(gè)按鍵掃描失敗,時(shí)隔將近一年半,后續(xù)它終于來了!
這次換用了IAP15W4K61S4,把之前的程序搞好了。必須要承認(rèn)一個(gè)錯(cuò)誤:之前單片機(jī)死機(jī)其實(shí)不是單片機(jī)速度問題,而是程序設(shè)計(jì)問題[慚愧……],現(xiàn)在已經(jīng)解決。這次的程序添加了事件隊(duì)列,進(jìn)一步釋放定時(shí)器資源。定時(shí)器只負(fù)責(zé)添加任務(wù),由主程序清空任務(wù)隊(duì)列+執(zhí)行事件函數(shù)。所以芯片慢點(diǎn)也沒關(guān)系啦。

正文
狀態(tài)機(jī)、事件隊(duì)列
狀態(tài)機(jī)還是挺常見,不過為什么要用事件隊(duì)列呢?因?yàn)橹袛嗪瘮?shù)不能拖得太長(zhǎng),如果定時(shí)器中斷執(zhí)行的事件函數(shù)還沒完,下一次中斷又來了可怎么辦……所以加入事件隊(duì)列機(jī)制,中斷只負(fù)責(zé)把需要執(zhí)行的事件入隊(duì),由主函數(shù)執(zhí)行并清空隊(duì)列里面的事件函數(shù),也算是某種“異步”了吧。
假如主函數(shù)清空隊(duì)列的速度還沒有定時(shí)器入隊(duì)快,那么隊(duì)列滿了以后,之后的按鍵事件直接拋棄,不會(huì)響應(yīng)。
參考資料
機(jī)智云的STM32按鍵掃描
資源占用功能說明文件說明使用方法
以下步驟在主函數(shù)main.c中操作。
注意事項(xiàng)其他
害,原諒我偷懶下吧……其實(shí)文檔已經(jīng)在github上面寫好了,這里不知道怎么用markdown編輯器,搞得排版很亂……所以剩下的設(shè)計(jì)思路參考Wiki吧。

工程代碼已上傳。(也可以到github上面下載https://github.com/AdjWang/C51KeyScan)



作者: 王朗的誘惑    時(shí)間: 2020-4-10 11:50
本帖最后由 王朗的誘惑 于 2020-4-14 22:30 編輯

之前上傳失敗了…… 狀態(tài)機(jī)按鍵20200409bak.zip (1.12 MB, 下載次數(shù): 38)
更新:(僅在github上更新,暫不在論壇上傳更新后的附件,避免附件版本和帖子里的說明對(duì)不上)2020/04/14 添加對(duì)switch,即自鎖開關(guān)的支持。


作者: xmfjfhcel    時(shí)間: 2020-4-14 15:28
大俠真的太歷害得不要不要的。 佩服,啥時(shí)候有樓主一半的水平就可以了。
作者: 王朗的誘惑    時(shí)間: 2020-4-14 22:35
xmfjfhcel 發(fā)表于 2020-4-14 15:28
大俠真的太歷害得不要不要的。 佩服,啥時(shí)候有樓主一半的水平就可以了。

哈哈,多謝夸獎(jiǎng)。我也不聰明啊,只是努力并堅(jiān)持下來,玩單片機(jī)快6年了,我能做到的,你也一定能,說不定還能做得更好。
作者: zmc419    時(shí)間: 2022-9-1 18:06
很好,可以參考,不過太消耗資源了




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1