導航:首頁 > 操作系統 > 單片機按鍵復用

單片機按鍵復用

發布時間:2023-05-15 13:41:31

單片機51,出現按一次按鍵,得到多次按鍵的情況,怎麼解決

單片機51,出現按一次按鍵,得到多次按鍵的情況,是由於沒有做「消抖」處理的結果,在軟體上做一些延時消抖處理後,一般就可以解決這個問題。比如:

keyscan()
{
if(key==0)//當按鍵按下
{
delay(10);//延時消抖
if(key==0)//如果按鍵任然按下
{
while(key==0);//等待按鍵抬起
.......
}
}
}

❷ 51單片機C語言按鍵被重復執行

程序有些啰嗦,
voidmain()
{
while(1)key();//調用按鍵服寬仔陪兄務函數
}
voidkey()
{
if(S1==0)testone();
elseif(S2==0)testhold();
慎亂汪elseif(S3==0)noteup();
elseif(S4==0)notedown();
}

❸ 怎麼解決單片機兩個或多個鍵同時按下的情況

解決單片機兩個或多個鍵同時按下的情況的程序:
key1_flag=0;
if(key==1)
{
delay(500);
if(key1==1&&key_flag==0)
{;}
}
key1_flag=key1;
解釋:
1)當key1(帶自鎖)作為51單片機輸入信號被按下時,再按key2(不帶自鎖)時,響應就有問題了;
2)如果是先判斷key1的話,加個延時,然後再判斷key2的電平,理論上沒問題的;
3)或者如果你key1自鎖的時候為高電平,直接
while(key1)
{;}。

❹ 51單片機中如何通過一個按鍵實現暫停與恢復需要一個編程的思想

有以下幾種情況:
1.循環查詢按鍵。當按鍵按第一次時間,進入第一層循環查詢語句內部,執行恢復。不跳出該層循環,繼續查詢按鍵。當第二次按下時間,進入第二層循環查詢語句內部,執行暫停。循環結束。若想反復暫停和恢復,就在外面再加一層while(1)類似的死循環,反復執行其內部的兩層循環查詢語句。
2.用一個標志變數,記住按鍵的狀態。初始化為個值,如「暫停」,按鍵之後檢查標志變數,是「暫停」就執行「恢復」,再讓它變為「恢復」說明當前已經執行了恢復。反之亦然。
3.掉電暫停。這樣需要按鍵能觸發cpu工作。所以,需要按鍵接到外部中斷上面。中斷後可以恢復CPU工作。在中斷中再判斷是否要讓cpu掉電與否。
不知道這種方法你能接受不?還是用外部中斷。此按鍵觸發中斷後,關掉所有其他的中斷,也即EA=0(最好先用個變數記住EA,方便恢復),然後就一直在中斷中等待該按鍵第二次按下再恢復EA,最後退出中斷。

❺ 51單片機中如何通過一個按鍵實現暫停與恢復需要一個編程的思想

1、創建項目文件。

❻ 51單片機IO口的分時復用應用問題

可以復用,但是按鍵的時候燈是亮的。
復用方法有點類似動態顯示掃描,讀取按鍵之前,把P0.1置成高電平,即關燈,延時一點時間,讀按鍵。讀完按鍵,恢復顯示內容。
由於按鍵讀取不需要很頻繁,比如說10ms才讀一次,那麼顯示偶爾關一小會,比如說10us,肉眼感覺不到顯示閃爍。

❼ 單片機按鍵復位電路各元件的作用

R17
C13組成止電復位電路,剛上電時,C13是電壓為0,電源通過R17對電容充電,因此,RST引腳呈現高電平,高電平時間大於2個晶振周期,單片機復位
電容充電完畢,RST引腳呈現低電平,復位結束
按鈕S22和R16組成手動復位電路
,按下S22,電源接通R16和
R17,由於R17阻值比較大,因此RST是高電平,同時電容通過R16迅速放電,即使按鈕觸點斷開,電源也可對C13充電,使RST高電平穩定一段時間
,保證可靠復位。
C13容量較小時,R16可省掉,小電容短路放電不會損壞按鈕觸點

❽ 關於單片機IO口輸入輸出復用問題

首先電阻應該接電源正極,按鍵一端接地,但還不行,按鍵檢測時,IO口先輸出高電平,若有按鍵按下則檢測到低電平,所以在你檢測按鍵之前,LED已經處於亮態了,這和你檢肢好塌測到按鍵按歷圓下再亮是矛盾的

當按鍵不被按下時,IO口是高是低由程序決定的,復位時IO口襪慶黙認是作為輸入用的,輸出是高電平

但負載能力比較弱

將LED改為低電平驅動是可行的,平時IO時輸出高平可作為輸入,LED不亮,按下按鍵後,單片機檢測到低電平,可輸出低電平,LED就一直亮了(也可由程序控制亮一段時間滅,以便再次進行檢測)

❾ 單片機獨立鍵盤輸入數碼管顯示 使用獨立鍵盤輸入,實現按鍵復用,並在數碼管上顯示。

這個就兩個功能,一個是鍵盤掃描,二是數碼管顯示,這樣的程序網上一大把,
按鍵程序
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar pre_peyno=16;keyno=16;
void delayms(int x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void ked_scan()
{
uchar m;
P2=0x0f;
if(P2&0x0f!=0x0f)
delayms(2);
if(P2&0x0f!=0x0f)
m=P2^0x0f;
switch(m)
{
case1:keyno=0;break;
case2:keyno=1;break;
case4:keyno=2;break;
case8:keyno=3;break;
default:keyno=16;
}
P2=0xf0;
delayms(1);
m=P2>>4^0x0f;
m=m+10;
switch(m)
{
case1:keyno=0;break;
case2:keyno=4;break;
case4:keyno=8;break;
case8:keyno=12;break;
}
}
main()
{
P2=0xff;
while(1)
{
uchar i;
switch(keyno)
{
case0:P2=0x00;break;
case1:P2=0xfe;for(i=0;i<7;i++){P2=_crol_(P2,1);delayms(150);}break;
case2:P2=0x7f;for(i=0;i<7;i++)P2=_cror_(p2,1);delayms(150);}break;
case16:P2=0xff;break;
}
}

數碼管程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit la=P2^7;
sbit wela=P2^6;
unsigned char code num[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

#define uint unsigned int

void delay(uint x)
{
while(x--);
}

void main()
{
while(1)
{

P0=0xfe;
wela=1;
wela=0;
P0=num[1];
la=1;
la=0;
delay(1000);

P0=0xfd;
wela=1;
wela=0;
P0=num[2];
la=1;
la=0;
delay(1000);

}
}
以上兩個程序是參考程序,不過還得根據自己的實際電路改改,不能直接運用。

閱讀全文

與單片機按鍵復用相關的資料

熱點內容
伺服器磁碟滿了文件刪不掉該如何處理 瀏覽:847
壓縮彈簧展開長度 瀏覽:509
如何共享國外app 瀏覽:687
淘寶app如何掃描圖片 瀏覽:594
反編譯作業幫 瀏覽:856
釘釘打卡伺服器過什麼意思 瀏覽:139
鏤空加密隔斷牆效果圖 瀏覽:539
windows7怎麼安裝證書伺服器 瀏覽:952
證券業務的程序員 瀏覽:202
u點伺服器wifi密碼如何設置 瀏覽:864
寶馬x5大燈編程 瀏覽:673
python安裝和使用 瀏覽:381
加密的門禁卡復制了用不了 瀏覽:714
javacsv讀寫 瀏覽:806
ug編程教程pdf 瀏覽:763
latex編譯軟體安卓版 瀏覽:248
如何在信合app上交居民醫保 瀏覽:109
丑惡pdf 瀏覽:365
陝西定頻壓縮機銷售公司 瀏覽:795
安卓系統如何幫人打王者 瀏覽:427