⑴ 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;//使按鍵等於一個自定義的值
}
⑵ 單片機怎樣識別按鍵是單機,雙擊還是長按,演算法應該是怎樣
過濾抖動的問題
第一次發生接觸時,設置一個flag表明上次所有btn狀態,然後定時器啟動。然後在main
loop進行檢測,一直檢查剛才那個按下的btn,如果發現到定時器將要到時刻都還在接觸狀態,那麼應該是長按,重置定時器。如果出現了一定間隔的斷開,那麼等待直到定時器中斷發生時,檢查flag中btn狀態和現在btn狀態,則可以發現是否雙click---
⑶ 51單片機中如何按下按鍵時數碼管正常顯示而不閃爍,並且實現長按連續
你好,我也遇到這樣的問題,經過一周的研究,問之前的前輩得出結果,希望對你有幫助
char scan_k(char k)
{
int i=0;//定義一個變數用來累計長按的時間
if((KEY1&&KEY2&&KEY3&&KEY4&&KEY5&&KEY6)==0)//如果有按鍵按下
{
while(!KEY1)//如果按鍵1按下
{
xianshi(neirong);//執行顯示
delay_ms(1);//延時
i++;//每次i自加1
if(i>=1000)
{
k=11;//按鍵1長按
}
else
{
k=1;//按鍵1短按
}
}
i=0;
while(!KEY2)//如果按鍵2按下
{
xianshi(neirong);//執行顯示
delay_ms(1);//延時
i++;//每次i自加1
if(i>=1000)
{
k=21;//按鍵2長按
}
else
{
k=2;//按鍵2短按
}
}
i=0;//在下一個按鍵按下之前清空i的值
while(!KEY3)//如果按鍵3按下
{
xianshi(neirong);//執行顯示
delay_ms(1);//延時
i++;//每次i自加1
if(i>=1000)
{
k=31;//按鍵3長按
}
else
{
k=3;//按鍵3短按
}
}
i=0;
while(!KEY4)//如果按鍵4按下
{
xianshi(neirong);//執行顯示
delay_ms(1);//延時
i++;//每次i自加1
if(i>=1000)
{
k=41;//按鍵4長按
}
else
{
k=4;//按鍵4短按
}
}
i=0;
while(!KEY5)//如果按鍵5按下
{
xianshi(neirong);//執行顯示
delay_ms(1);//延時
i++;//每次i自加1
if(i>=1000)
{
k=51;//按鍵5長按
}
else
{
k=5;//按鍵5短按
}
}
i=0;
while(!KEY6)//如果按鍵6按下
{
xianshi(neirong);//執行顯示
delay_ms(1);//延時
i++;//每次i自加1
if(i>=1000)
{
k=61;//按鍵6長按
}
else
{
k=6;//按鍵6短按
}
}
i=0;
}
return k;//返回按鍵的值
}
以上代碼,不帶操作系統,不包含中斷,請根據實際情況調整你想要的長按時間,按鍵按下的時候,如果你的消抖時間太長,數碼管會有明顯的閃爍或者變暗,請根據自己的需求進行調整
⑷ 單片機按鍵短按和長按的程序
設置定時器100毫秒中斷a值自家1
設置按鍵值位變數k
設置按鍵埠k1
if (!k1)按鍵按下
{
delay(20);去痘
if (!k1)確認按下
a=0;計時數清0 確保長按時間精準
while(!k1)按鈕沒釋放 死循環檢測按下時間
if(a>30)達到3000毫秒
k=!k按鍵值取反 沒按前為0 長按3秒後為1 短案無效
}
⑸ 單片機按鍵長按鍵處理問題,在線請高手幫忙,解決了一定再追加積分!
呵呵,你好,更改的代碼如下,希望你能夠自己理解啦
key()
{
{
if(s1==0)
{
delayms(10);
if(s1==0)
{
num++;
if(num==100)
num=0;
count[0]=num/10;
count[1]=num%10;
}
delayms(200);//個人感覺while(!s1)不能一直按著計數比較麻煩;
}
if(s2==0)
{
delayms(10);
{
if(s2==0)
{
num--;
if(num==-1)
num=100;
count[0]=num/10;
count[1]=num%10;
delayms(200);
}
}
}
}
}
⑹ 51單片機C語言編程如何實現長按按鍵實現數值的累加
這個可以用定時器來做,比如檢查某鍵,按鍵時間超過2秒後一個變數開始累加知道鍵釋放為止。實現方法如下:
#include<reg51.h>
#define
uint
unsigned
int
#define
uchar
unsigned
char
uint
v=0,time=0;
sbit
key=P1^0;
void
t0isr()
interrupt
1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if((key==0)&&(time>40)v++;
//如果按鍵時間超過2秒且鍵未釋放,變數+1
if(key==1)time=0;
//如果鍵釋放,時間復位
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1);
}
⑺ 怎麼用C語言/C51程序實現單片機按鍵長按開機與長按關機
1.
首先需要硬體支持,也就是單片機某個引腳可以控制斷電和維持上電
2.
按鍵的的作用也可以給單片機供電,並且還要有個專門的引腳檢測按鍵狀態。
3.
軟體:首先是長按判斷。這個最好用按鍵掃描。就是檢測按鍵按下時候,定時器計時,如果松開就立即清零。在設置一個功能函數檢測定時值,大於兩秒後,就表示長按。
4.
按鍵按下單片機供電開始計時,如果達到長按標准,就輸出引腳控制持續供電,這時候按鍵鬆了也不會斷電。
5.
運行期間,按鍵再次按下並符合長按,那木引腳輸出停止供電,這時候如果按鍵松開,那就徹底沒電關機。
⑻ 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;
}
}
⑼ 單片機C語言,紅外線遙控器,長按按鍵一直按下程序該怎樣區分呢
每種協議都是不一樣的,比如是日立的協議吧,就是通常說的一種,長按時發的第一個32位是對應的地址碼,命令碼及其反碼,但是按鍵一直按下時,則每隔固定時間發送的是重復碼,這個重復是固定一組編碼,與你按鍵對應的的地址和命令沒有任何關系,也就是說任何長按的重復碼都是一樣的;
而連續按則不同,按鍵松開後再按,則再次發送對應地址碼,命令碼及其反碼,不發送重復碼。
程序可以根據具體的編碼時序分支處理,若是連續按,則跳入一個分支,否則跳入長按處理,長按裡面判斷很簡單,則將上一次的結果重復一次即可。
⑽ 單片機按鍵怎麼實現長按和短按和組合鍵功能
是在實物開發板上實現嗎?
長按和短按很好實現,當檢測到有按鍵按下了,就開始計時,用定時器,檢測到按鍵松開了,停止計時,然後根據計時的時間長短,確定是長按還是短按,比如,時間小於0.5秒為短按,超過3秒為長按,其餘時間為無效,不夠長按時間,就為無效按鍵,也不算是短按的。這樣可以排除是隨意按鍵的可能。
組合鍵就好辦了,檢測到同時按兩個,三個,就為組合鍵,至於是什麼功能,那由你自己定義了。