1樓:匿名使用者
這種情況一般檢測訊號沿,間隔去取埠的電平,依次放在一個位元組裡。比如<<1,上升沿」就是0x0f 下降沿就是0xff。取字簡易**如下,放在main函式或者定時中斷函式裡迴圈處理就好了
unsigned char keytemp;
void getkey(void){
keytemp<<1;
if(p1.1)
if(0x0f==keytemp)
if(0xf0==keytemp)
if(0xff==keytemp)
if(0x00==keytemp)
}main()}
2樓:匿名使用者
如果是迴圈檢測,那麼你說的這個常置高的訊號跟按鈕處理有什麼不同呢,對於微控制器的高速處理來說,你按得再短,對它來說也是「常置」訊號,「快速輕按」就足夠微控制器處理幾十上百次了。你的按鈕處理不是通過「上升沿」或者「下降沿」訊號來處理的嗎?即檢測到兩個相鄰的高電平和低電平,才做一次有效處理,其它不予理睬。
再或者,可以設定一個標誌位,檢測到高電平後,標誌位置位,檢測到低電平,標誌位清0,那麼每次處理前先檢測一下此標誌位,就可以保證只處理一次了。
3樓:匿名使用者
講清楚一點,幹嘛用,要什麼功能?
微控制器51,出現按一次按鍵,得到多次按鍵的情況,怎麼解決
4樓:匿名使用者
微控制器51,出現按一次按鍵,得到多次按鍵的情況,是由於沒有做「消抖」處理的結果,在軟體上做一些延時消抖處理後,一般就可以解決這個問題。比如:
keyscan()}}
5樓:
在檢測到按鍵時,延時10ms,再次檢測,如果仍然檢測到按鍵按下,才能說明有按鍵按下;
在按鍵檢測函式結束時,新增等待按鍵釋放程式,如while(key_valve!=0);
6樓:
if(key==0)}
怎樣用51微控制器實現累加計時和倒計時,並用六個共陰極數碼管顯示出來。用兩個按鍵分別切換。
7樓:匿名使用者
剛開始上電時, system_mode不是1 也不是2,不知你初始化時是否給它賦值?另外你的按鍵檢測程式沒加入到迴圈程式中,剛上電時若沒有按鍵按下,則很快跳過兩個按鍵檢測語句,然後進入迴圈顯示程式中,這是一個死迴圈,只有中斷才可打斷其執行,所以再按什麼鍵也沒反應了,建議把按鍵檢測放入顯示迴圈中,它對顯示效果不會有什麼影響,或在初始化後加一個迴圈,若兩個按鍵都沒有按下,一直檢測按鍵
51微控制器怎麼處理20個按鍵?
8樓:匿名使用者
最安全,最可靠的方式,是獨立的按鍵;
採用矩陣鍵盤,為了就是節省 io 口的使用
9樓:
採用矩陣鍵盤咯,節省io
效率主要看你怎麼程式設計的,其實也要看你要什麼東西吧
10樓:尼瑪真響亮
用專門的驅動晶片比較好;如果不缺io的話,那就用獨立的。
11樓:匿名使用者
不缺io口獨立按鍵好
微控制器如何接收外部的訊號
12樓:匿名使用者
如果只是開關訊號,那隻要掃描io就行;
如果是脈衝訊號,只要用外部定時計數器或者外部中斷就行,比如光電編碼器;
發射出來的訊號是個週期訊號,不同的按鍵,其編碼不同,編碼中0和1對應的脈衝長度有差別,詳細內容可以看相關的資料。
要實現一直按著音量會一直加(減),這個過程比較複雜,需要微控制器不斷的接收響應,要編寫相應的微控制器程式,之後還需要除錯。
13樓:
我講一下大概的思路哦,有2種辦法:
1.不用改變io的工作方式,採用查詢的方式接收訊號,比如,if( iox == 1 )//檢測到高電平訊號,低電平也一樣,把1改為0
else //否則沒有檢測到高電平訊號2.採用中斷,要改變io為中斷模式,這個可以看一下書,外部中斷那一章。
14樓:匿名使用者
不需要 直接接到i/o口上就可以了
微控制器按鍵按一下,數字只加一。
15樓:藏在水中的人
檢測上升沿,與下降沿,如下程式
unsigned char keyscan( bit key )keystatus = j; //記錄本次按鍵狀態
if( keystatus =1 )
else
}return 0x00;}
16樓:匿名使用者
你又想不停的+1,又想不迴圈,好像不可能吧。
17樓:匿名使用者
你可以用定器,分時去讀key的狀態,讀了就離開,並記錄key狀態維持的時間,來斷別是否有按鍵按下,
18樓:
這樣不是很好嗎,按下只要沒放就在那等待,如果不等待,又會進入下一次按鍵的判斷,這樣可能不是我們想要要的結果,如果你不想在那等,就不用while(!key),程式執行完這個key的過程後,可能會立馬又進入了key函式,那麼,你本來想要加1的,可能在你按的那一下,就加到5、6了。
但是,如果你一定要像你說的那樣的程式,也並不是不行,簡單可行的辦法就是中斷加查尋的方法,中斷的目的是在下降沿時觸發,由於微控制器的外中斷很少,不可能獨立做n多個按鍵,那麼,按鍵還要通過與門連到其他i/o口,有了中斷做為觸發前提,再通過其他i/o口查尋,就可以獲得當前是哪個鍵了。由於中斷是下降沿觸發,所以,每一次按鍵只會出現一個下降沿,反以不管你按下多久,程式執行完了都會立馬退出,而且不會有下一次的誤判。不過這樣做的缺點就是,按鍵越多,硬體(與門)就會用的越多,電路會複雜一些,當然,成本也會相應增加。
一個51微控制器如何同時響應兩個以上按鍵輸入訊號
19樓:回卜去的
如果是輪詢按鍵的話,可以按下key1以後將一個變數i置一,直到鬆開變數i清零,這樣再按key2的時候進去先檢測i是否為0,為0才能進行下一步
20樓:萬頃烽煙
所謂的同時響應是不可能的,無論是掃描還是中斷都有分先後。
你的問題可以參考以下解決方法:
掃描時先記錄key1的狀態,如果為按下則無論下次掃描到什麼狀態都不執行動作,如果是放開的記錄為放開,再次掃描到如果為按下則執行動作。這個掃描可以同時應用於key2兩個不相沖突。
51微控制器 獨立按鍵按下去 再放開才算按鍵一次 計算按鍵次數 程式應該怎麼寫?
21樓:禿賊
你好!因為按鍵操作涉及暫存器配置和按鍵防抖,因此寫了你也不一定用得上。而且你這個的邏輯比較簡單,建議自己寫。主要注意幾個地方就可以了:
按鍵i/o口電平的配置:要結合硬體電路確認按鍵是低電平觸發還是高電平觸發。在程式中設定正確的i/o口電平。
i/o口的輸入輸出狀態的配置:i/o口作為按鍵輸入必須是準雙向模式或輸入模式,這個不同微控制器配置暫存器方式不同但大同小異。
按鍵防抖:在按鍵按下時有時會有短暫的接觸不良,因此會多次判斷按鍵按下和斷開,因此一般在按鍵按下或斷開時增加幾十毫秒的防抖處理,具體就是連續多個迴圈判斷按鍵是否是一個狀態,如果狀態不變,再進行下一步處理。
51微控制器按鍵防抖這麼處理
22樓:
一般是檢測到按鍵按下後,過一段時間再檢測一次,如果兩次都檢測到了說明確實是按鍵按下了。
間隔時間 一般是10-20毫秒。
23樓:匿名使用者
防抖,判斷到埠高電平之後,延時10ms左右,再判斷一次是否還是剛剛的高電平狀態,如果是,再等待按鍵釋放,即while(!key);。跳出這個迴圈之後就表示按鍵事件完成。
那麼就led =~led。
你的程式:if(key == 0) 如果是高電平觸發,那麼大部分時間都在進行led取反,導致過快閃爍,你看不出變化,就看成了長亮。如果是低電平觸發,你按下的每一時刻都在變化,釋放之後,可能是亮的,也可能是滅的
51微控制器的pc值怎麼算,51微控制器中如何進行相對定址?pc值怎麼計算?rel又怎麼給
鈺瀟 a 50h sp 50h 51h 30h 52h 50h pc 5030h a 50h sp 50h 因為在程式中,sp減了兩次,後來又加了兩次,在程式最後ret有在返回的時候減了兩次,即地址出棧,故最終結果是50h。51h 30h 52h 50h 因為ret指令返回時,出棧的結果是高地址 5...
51微控制器學到什麼程度可以學其他的微控制器
不學51微控制器也可以學其他的微控制器 既然學了51微控制器,就不著急學其他的微控制器,先試試學習用51微控制器解決幾個實際問題,哪怕是很簡單的問題都可以。有一定解決實際問題的能力和經歷後,再學其他微控制器就能學到點子上,知道如何才能學以致用。 看你自己的理解情況,好的人可同時學習很多微控制器 以我...
51微控制器init什麼意思,51微控制器的“51”是什麼意思?
51微控制器init 一般初始化函式的函式名。用法 類 alloc init init 是建構函式初始化用,他能初始化啥,都初始化為預設值,alloc 之後就是預設值。51微控制器簡介 51系列微控制器是一個統稱。代表時鐘為12分頻,內部儲存器為哈佛結構 資料和 分別儲存 的一系列8位微控制器。代表...