標題: 怎樣讓單片機程序按鍵后執(zhí)行一次就停止呢 [打印本頁]

作者: 我在東北玩51    時間: 2019-8-30 21:22
標題: 怎樣讓單片機程序按鍵后執(zhí)行一次就停止呢
就比如兩個按鍵控制一個LED 按下按鍵1: LED亮1秒后滅 (只亮一次不循環(huán) )
按下按鍵1: LED亮2秒后滅 (只亮一次不循環(huán) )
像按下去閃爍直接取反就好了 那亮一次改怎么弄  思路框架應(yīng)該是什么樣的


作者: 陌上輕雨寒    時間: 2019-8-31 08:26
檢測按鍵;亮;延時1秒;滅,就這么簡單
作者: m182892    時間: 2019-8-31 09:01
陌上輕雨寒 發(fā)表于 2019-8-31 08:26
檢測按鍵;亮;延時1秒;滅,就這么簡單

你這個放while循環(huán)里面會一直閃爍的,雖然你想它只執(zhí)行一次,樓主肯定也試過。
作者: qazwsx22    時間: 2019-8-31 09:07
等待按鍵,按鍵按下任務(wù)執(zhí)行,執(zhí)行完進入死循環(huán),只有等單片機重啟才能再按按鍵。如果想按一次以后都不能用,那就在后備寄存器或者可存儲芯片里存標識,上電讀取標識位是否按下過。
作者: 51好黑電子論壇    時間: 2019-8-31 09:33
你對單片機還沒有理解清楚!單片機你可以理解它只執(zhí)行一次。如果沒有循環(huán),它就只運行一次。
作者: 51好黑電子論壇    時間: 2019-8-31 09:34
比如:LED=1,如只有這么一條語句,你打開單片機,它就會只會執(zhí)行一次。
作者: 51好黑電子論壇    時間: 2019-8-31 09:35
你想要執(zhí)行很多次,就得加循環(huán)。while(1)。
作者: 51好黑電子論壇    時間: 2019-8-31 09:37
如果你用兩個按鍵來控制一個LED燈,不需要加循環(huán),就只執(zhí)行一次。
作者: 51好黑電子論壇    時間: 2019-8-31 09:38
1,先用一個循環(huán)監(jiān)聽是按下按鍵1還是按鍵2,記得加按鍵延遲。
作者: 51好黑電子論壇    時間: 2019-8-31 09:38
在按鍵里分別對應(yīng)LED亮的時間長度。
作者: 51好黑電子論壇    時間: 2019-8-31 09:40
比如按按鍵1,亮1秒后停止。LED=1 ;延遲1秒,LED=0;這就完成了按鍵1的功能。
作者: 51好黑電子論壇    時間: 2019-8-31 09:41
再按鍵2也是一樣。LED=1,延遲2秒,LED=0;完成了按鍵2的操作。
作者: 51好黑電子論壇    時間: 2019-8-31 09:42
說得那么詳細應(yīng)該明白了吧?LED=1燈亮,LED=0燈滅。
作者: 51好黑電子論壇    時間: 2019-8-31 09:44
如果你想弄復(fù)雜一點,比如我想連續(xù)按1二次,就會自動執(zhí)行2,你可以加個計數(shù)參數(shù)。
作者: 51好黑電子論壇    時間: 2019-8-31 09:53
你要理解兩個點:
1,單片機程序原本就只會執(zhí)行一次。是我們?yōu)榱俗寙纹瑱C一直執(zhí)行下去,才加了循環(huán)。也就是說,不加循環(huán),就只執(zhí)行一次。
2,燈亮和滅無非就是0和1.單片機的腳出來的無非就是0和1,燈亮就是LED=1,燈滅就是LED=0;取反是算法更簡單而已。
兩個按鍵控制一個LED,按鍵判斷需要循環(huán)進行,
先判斷是哪個按鍵按下了,再決定LED亮燈的時間長度。判斷按鍵的時候記得加上延遲去抖動。
比如:按鍵1按下,延遲0.005秒,再判斷是否是按鍵1按下,如果是,執(zhí)行   LED=1,延遲1秒,LED=0;
按鍵2按下,延遲0.005秒,再判斷是否是按鍵2按下,如果是,執(zhí)行   LED=1,延遲2秒,LED=0;
這么詳細,應(yīng)該明白了吧?



作者: cuihaodianzi    時間: 2019-8-31 10:01
可以說詳細點嗎
兩個按鍵控制…… 按下按鍵 1  …… 按下按鍵 1  ……
只按按鍵 1  為什么還要兩個按鍵,一個按鍵就可以了。
按下按鍵要松手嗎,按著的時候燈亮滅,還是松開的時候再執(zhí)行 ?
作者: 王杰666    時間: 2019-9-2 08:23
引用標志位不知是否可以
作者: a731370129    時間: 2019-9-3 12:09
不加循環(huán)
作者: zhangyucheng02    時間: 2019-9-4 17:55
led點亮,掃描案件,按鍵按下檢查是哪個按鍵,去抖。進入一個在shile里面搞倆個while(1)里面設(shè)置好定時關(guān)閉就行了。燈不亮即便再關(guān)也沒有問題
作者: 那個誰和誰    時間: 2019-9-5 11:03
設(shè)置個標志位不就行了,按一次,標志位+1,檢測不到標志位,燈就不會再亮了。想什么時候亮,再把標志位置位回來。
作者: glory_gm    時間: 2019-9-5 20:32
用標志位,按鍵讀取高低電平,然后判斷條件;蛘哂弥袛,外部中斷
作者: 納愛斯牙牙樂    時間: 2019-9-5 21:57
用中斷,在中斷服務(wù)函數(shù)里面啟動LED延時之后關(guān)閉
作者: GSdreamer    時間: 2019-9-6 06:11
1)main函數(shù)里不寫控制邏輯,只寫初始化代碼?刂芁ED的邏輯寫在外部中斷里。
作者: GSdreamer    時間: 2019-9-6 06:13
2)不開中斷,在main函數(shù)里不斷檢測兩個按鍵狀態(tài)。同時用兩個全局變量記錄燈是不是已經(jīng)亮過了。如果沒亮過那么檢測到按鍵按下就點亮。如果已經(jīng)亮過了那即使檢測到按鍵按下也不點亮。
作者: 天風(fēng)情    時間: 2019-9-6 10:42
條件判斷啊,C語言的基礎(chǔ)知識
作者: 一泓秋    時間: 2019-9-6 15:25
這種問題入門后都比較簡單了,第一步先檢查按鍵是否按下,如果按下則執(zhí)行你的操作(如點燈),判斷按鍵是否松開,如果按鍵松開則不進行操作(如熄滅燈)
作者: niejiangong    時間: 2022-5-24 10:45
void main()
{       
                LED1=0;        //點亮
                delay_ms(5000); //大約延時450ms
                LED1=1;        //熄滅
                delay_ms(5000);        
}
像以上程序,雖然沒有循環(huán),但實際運行起來后一直不停地亮、滅、亮、滅,這是為什么?
作者: xuxiaojian    時間: 2022-5-24 10:48
用個if語句
作者: LXJG    時間: 2022-5-24 11:11
不要寫在while里面就不會一直循環(huán),寫個按鍵,當按鍵按下led燈亮一下就好了

作者: niejiangong    時間: 2022-5-24 11:27
LXJG 發(fā)表于 2022-5-24 11:11
不要寫在while里面就不會一直循環(huán),寫個按鍵,當按鍵按下led燈亮一下就好了

如果寫個按鍵是可以解決,那是因為按鍵沒有被再次按下,就不會再亮燈。
但上面這個簡單的程序中,明顯是沒有while循環(huán)的,為什么程序會重復(fù)執(zhí)行呢?
我一直也有這個困惑,main主程序是不是一直會自動重復(fù)循環(huán)?結(jié)束了再從頭再來?51單片機是不是默認的就是這樣?
作者: niejiangong    時間: 2022-5-24 12:05
51好黑電子論壇 發(fā)表于 2019-8-31 09:33
你對單片機還沒有理解清楚!單片機你可以理解它只執(zhí)行一次。如果沒有循環(huán),它就只運行一次。

我試過多次了,雖然沒有while,它也會重復(fù)執(zhí)行main




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