1. 51單片機如何實現按鍵的長按與短按功能,嘗試過很多方法都不行,請高手多賜教,多謝了(想是簡單,做是難)
這個真心不難,就是簡單的c語言判定就行了,《C程序設計語言》,實在看不了就看譚總寫的那本c語言。給你寫過偽代碼,
if(key=ReadKey())//讀取按鍵,判斷有無按鍵按下去,沒按鍵按下,這里返回0值是不進入這個函數的
{
delay(x);//延時一段時間,寫過循環就行了
if(!ReadKey())//在次讀取按鍵值,實際上按下去按鍵是低電平(原理圖一般都是這樣做的)
{
return 已經鬆手了( 這里是高電平了返回0了)
2. 在51單片機中,按一下按鍵1,執行一個程序功能1,按按鍵2,執行程序功能2
#include<reg51.h>
#include<intrins.h>
unsigned char fun,led1=0xfe,led2=0x55;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
void t0isr() interrupt 1
{
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
switch(fun)
{
case 1:P0=led1;led=_crol_(led1,1);break;
case 2:P0=led1;led=_cror_(led1,1);break;
case 3:P0=~led2;break;
default: break;
}
}
main()
{
TMOD=0x01;
TH0=(65536-60000)/256;
TL0=(65536-60000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(key1==0)
{
while(key1==0);
fun=1;
}
if(key2==0)
{
while(key2==0);
fun=2;
}
if(key3==0)
{
while(key3==0);
fun=3;
}
}
}
3. 單片機按鍵按一次就加一
按鍵相對是個低速任務。你按的再快,一秒可以按十次嗎?什麼?你可以。。那你就是作弊了。因為哪怕你反應的過來。按鍵可不行。所以。這個本質你需要牢牢抓住。那麼你可以選擇一秒之內只檢測幾次按鍵。把幾乎是連續在使用的機器時間碎片化。比如在一個碎片里只查一次按鍵。是的,你現在就是這么做的。只是循環太快。碎片太多。按鍵的抖動你都查到了。所以你需要的僅僅是慢下來。極限就是剛剛說的查10次。算算,這是一個100ms的定時。明白定時器的真正用途了嗎?如果你實際這么實驗了你會發現這的確有效。不會加個成百上千了。接下來你需要設置一個邏輯讓按鍵檢測只對下降沿起作用。最好的辦法就是和前次的狀態比較。如果上次的狀態為高而此次狀態為低。那麼這就是個下降沿。於是你需要一個寄存器保存上一次的狀態。並每次比較後更新。原來這寄存器是這么用的。。實際實驗後發現這么干已經可以保證基本每次長按只會加1。但是短按似乎會丟失。那是因為。100ms實在是長了些。電平保持100ms有時是太難了。所以,你可以適當提高頻率。比如提高10倍。以10ms為周期。基本能解決大多數問題。
4. 如何用單片機實現單擊 + 雙擊 + 長按
這是三種鍵有效方法,可按下面思路設計供你參考;
1、單擊有效,可以採用彈起有效。如選擇上升沿有效。
2、雙擊有效,要採用在一定的定時時間內兩次計數的方法,也就是先設定一個有效時間,在第一次鍵有效後在這個有效時間內鍵再次有效就可以認定最終有效,否則無效。
3、長按有效,也要採用計時的方法。也就是鍵有效後在一定的時間內連續檢測有效性,如檢測時間內連續保持有效可以認定最終有效,否則無效。
後兩種方法要求設計一個專門的判斷程序才能完成。
5. 單片機 一個按鈕設置按一下加1 另一個按鍵按一下減1 求幫忙編寫程序
#include<reg52>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P1^4;
sbit K2 = P1^5;
uchar data K1state;
uchar data K2state;
uint data num,ntmp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x06f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;
uchar data showIndex,indexTmp;
uchar data W[8];
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);//能使之延時接近1毫秒就成 無需精確
}
void main()
{
K1state = 0xFF;
K2state = 0xFF;
num = 0;
while(1)
{
delay(1);//每毫秒輪詢一回
//移位法,延時防抖
K1state = (K1state<<1);
K2state = (K2state<<1);
if(K1) K1state++;
if(K2) K2state++;
//檢查開關狀態
if(K1state==0x80) num++;
if(K2state==0x80) num--;
for(indexTmp=0,ntmp = num;indexTmp<=7;indexTmp++)
{
W[indexTmp] = num%10;
num /=10;
}
P0 = (0x01<<showIndex);//位選
P2 = table[W[showIndex]];//段選
showIndex++;
if(showIndex>=8)
showIndex=0;
}
}
看了你的全圖,修改後了,用Keil uVision 3或4都可以,編譯後可以查看對應的匯編代碼
程序稍大一點的,不會有人用匯編來給你蘑菇,匯編設計寫編碼太慢了,開發代價不值得
6. 單片機按鍵有幾種方式
按鍵檢測一般有:1、查詢、2、掃描、3中斷等方式。查詢方式佔用主循環資源,就是說主程序主要干檢測按鍵的活兒,若增加其他程序容易出錯。掃描方式效果最好,可以在性能和佔用資源間平衡,中斷方式,適用於響應速度極高的場景,但抗干擾較差。
7. 51單片機按鍵
#include<reg51.h>
#define uchar unsigned char
uchar num,time,limit=2;
sbit led1=P1^0;
sbit key1=P2^0;
bit flag=0;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time>=60)
{
TR0=0;
time=0;
flag=1;
}
}
void t1isr() interrupt 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
num++;
if(num>limit)
{
num=0;
led1=~led1;
}
}
main()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
ET0=1;
ET1=1;
EA=1;
while(1)
{
if(key1==0)
{
time=0;
num=0;
TR1=1;
TR0=1;
flag=0;
while(key1==0);
if(flag==1)limit++;
}
}
}
8. 單片機按鍵短按和長按的程序
不能給你程序,只能給你思路。
設置定時器(建設100ms),在設置一個變數x,(100ms自加1)
在主循環中判斷按鍵是否按下,並判斷x的值大小;
假設 x每隔100ms加1
y是按鍵狀態(為1表示按下,為0 表示未按)
z記錄按鍵狀態的(初始值0)
b 記錄長安 a記錄短按
eg:
if(!z)
{
if(y)
{
a=1;
z=1;
}
}
else if(x>10)// 1s
{
b=1;
}
9. 51單片機按位與
a=a&0xf0;也就相當於a=0;,它這樣寫是給P3^5清零或者置0的作用。
10. 51單片機獨立按鍵中,按一下和一直按的區別
按一下松開這個LED一直亮:
if(key==0)
{
while(key==0);
led=0;
}
按一下松開就亮一下:
if(key==0)
{
led=0;
while(key==0);
led=1;
}