導航:首頁 > 操作系統 > 單片機長按短按

單片機長按短按

發布時間:2022-08-24 22:51:18

單片機一鍵長按與短按按鍵實現的c程序有問題,實在不知道是哪裡有問題,請幫助修改一下,謝謝!

這……也太亂了吧?你能從這一大堆的邏輯中理出頭緒來,我真佩服死你了。你這長按一處理,後面短按馬上也生效了,長按跟沒有一樣。既然都用上定時器了,就別delay了,那東西只有教材上才會出現,實際應用上很少用到的。用定時器,設個基準時間比如200us一中斷,然後設個10ms的按鈕掃描時間,就是50個中斷,用兩個連續的按鈕掃描低電平來確定按鈕有效性,那個delay就可以88了,教條主義害死人啊。按扭有效後馬上對「中斷計數」,這個會吧?按鈕按下就連加,放開就清0,下次重計數,2秒就是20000次中斷,能計到這個數就說明長按有效,沒計到這個數就說明短按有效,這樣就可以分開處理啦,就這么簡單,別老拿定時器開啊關啊。理清思路,別說長按短按,就是雙擊都可以做出來。

⑵ 51單片機 按鍵長按短按效果

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit key=P1^0;
sbit LED1=P1^4;
sbit LED2=P1^5;

uchar code ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uint dat,cnt;
uchar dis[4],disscan=0;
bit flags,flagl;

void t0isr() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
cnt++;
if(cnt>=200)
{
flagl=1;
flags=0;
if((cnt%5)==0)dat++;
}
}
void t1isr() interrupt 3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P2=1<<disscan;
P0=ledtab[dis[disscan]];
disscan++;
disscan%=4;
}
main()
{
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
ET0=1;
ET1=1;
PT1=1;
EA=1;
P1=0xff;
while(1)
{
if(key==0)TR0=1;
if(key)
{
if(cnt<200 && TR0==1){flags=1;flagl=0;dat++;}
if(cnt>=200){flagl=1;flags=0;}
cnt=0;
TR0=0;
}
if(flags){LED1=0;LED2=1;}
if(flagl){LED1=1;LED2=0;}
if(flags==0 && flagl==0) {LED1=1;LED2=1;}
dis[0]=dat/1000;
dis[1]=(dat%1000)/100;
dis[2]=(dat%100)/10;
dis[3]=dat%10;
}
}

⑶ 單片機一個按鍵實現短按 中長按 更長按 也就是三種功能 程序怎麼寫

按鍵按下和抬起之間有防抖動延時,只要把防抖動延時時間設置大小不同就可以了。短按你設ms,中按搞個1-3s,長按弄個5-10s。我覺著這么行。

⑷ 51單片機,矩陣按鍵,長按短按判斷

/*網友反映長鍵結束後會送出短鍵值,特作更改2019.03.29*/

//1,再寫一個長短鍵判斷函數,調用那個按鍵掃描函數
unsignedcharKEY_process(void)
{
staticunsignedcharOld_key=0;//上次按鍵值
staticunsignedcharKey_buf=0;//按鍵有效保存
staticunsignedcharPress_CNT=0;//按鍵按下時間,根據調用時間間隔確定
=0;//長鍵有效標記變數
unsignedcharNew_key=0;//當前按鍵值
unsignedcharKEY=0;//待返回的按鍵值

New_key=keyscan();

if(New_key==Old_key)
{
if(New_key!=0)//建議keyscan返回0的那個值改為其他值,方便這里判斷
{
Key_buf=New_key;
if(Press_CNT<0xff)
{
Press_CNT++;
}
if(Press_CNT>=100)//調用時間間隔確定*100為長按時間,
{
KEY=Key_buf+100;//將短鍵+100作長鍵區分
Press_CNT=0;//按鍵時間清0
Key_buf=0;//按鍵緩沖清0
bPreKeyIsLong=1;//長鍵有效標記
}

}
else//按鍵彈起
{
if(Key_buf&&(bPreKeyIsLong==0))//僅在長鍵無效時
{
KEY=Key_buf;//將緩沖值送將返回的值
Key_buf=0;//清按鍵緩沖
}
Press_CNT=0;//按鍵彈起或按其他按鍵,將長按時間清0
bPreKeyIsLong=0;//長鍵有效標記清0
}
}
Old_key=New_key;//將新按鍵賦給下一次的舊按鍵值

returnKEY;//0代表無按鍵
}
//2,彈起不返回已確定的值,則在keyscan最後加一句判斷
if((P3&0X0F)==0X0F)//按鍵已經彈起
{
keyvalue=MY_key;//使按鍵等於一個自定義的值
}

⑸ 51單片機如何實現按鍵的長按與短按功能,嘗試過很多方法都不行,請高手多賜教,多謝了(想是簡單,做是難)

這個真心不難,就是簡單的c語言判定就行了,《C程序設計語言》,實在看不了就看譚總寫的那本c語言。給你寫過偽代碼,
if(key=ReadKey())//讀取按鍵,判斷有無按鍵按下去,沒按鍵按下,這里返回0值是不進入這個函數的
{
delay(x);//延時一段時間,寫過循環就行了
if(!ReadKey())//在次讀取按鍵值,實際上按下去按鍵是低電平(原理圖一般都是這樣做的)
{
return 已經鬆手了( 這里是高電平了返回0了)

⑹ 51單片機識別四個獨立按鍵是短按還是長按

識別長按,先要確定一個時間,超過這個時間為長按,否則即為短按。
當按一下鍵後,開始計時,同時判斷確定時間到否?到了,執行長按的程序,等待按鍵釋放。
在判斷時間的時候,如果按鍵釋放了,說明未到長按的時間,執行短按的程序。
或者,按下時開始計時,等待按鍵釋放,釋放後,停止計時,根據計時的時間來判斷是長按還是短按。

⑺ 請教51單片機定時中斷檢測長按與短按問題-100分懸賞

首先你的程序寫的不夠合理,作為按鍵一般會使用外部中斷而不是定時中斷,外部中斷可以保證實時按鍵。
一般按鍵都是採用外部中斷,如果是在while循環裡面進行按鍵鍵值判斷,那麼在判斷之前最好加個小延時,進行按鍵去抖。
像你這個wile循環耗時很長,最適合使用外部中斷了,當然如果按鍵沒有接到外部中斷引腳,採用定時中斷也可以達到一定的效果,但是一定要把定時時間設置的短一些。

閱讀全文

與單片機長按短按相關的資料

熱點內容
eclipseandroid建立工程 瀏覽:731
大胸女友主演 瀏覽:276
佛教電影《解怨》國語 瀏覽:474
哪部電影男孩叫安東 瀏覽:13
有騎木驢的電影叫什麼感覺 瀏覽:265
windows重啟mysql命令 瀏覽:730
單片機輸入輸出口接收脈沖 瀏覽:121
控制電腦滑鼠的命令 瀏覽:213
男男強暴電影 瀏覽:604
便利店送貨上門app叫什麼 瀏覽:468
win8怎麼打開命令行 瀏覽:129
p開頭的一個看片軟體 瀏覽:755
西班牙電影不準備的愛情 瀏覽:177
python轉換器使用教程 瀏覽:629
cad圖紙重復圖形命令 瀏覽:769
法國女同床戲多私處可見的電影 瀏覽:926
那你給年齡那邊電影想電影想一起電影 瀏覽:994
原耽小說下載 瀏覽:873
香港一級紅色電影 瀏覽:505
三級倫理電影胸大女主角拍的電影有哪些 瀏覽:170