久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3493|回復: 7
收起左側

判斷按鈕單、雙、三擊,開關相應的led,編譯通過,邏輯卻沒反應,誠心請教指點,謝謝

[復制鏈接]
ID:52701 發表于 2013-9-4 09:08 | 顯示全部樓層 |閱讀模式
#include<reg51.h>     //使用的是stc12c4052ad
sbit led1  = P1^7;     // LED1接P1.7腳
sbit led2  = P1^6;     // LED2接P1.6腳
sbit led3  = P1^5;     // LED3接P1.5腳
sbit led4  = P1^4;     // LED4接P1.4腳
sbit button = P1^0;     // 按鈕接P1.0腳
void s(unsigned int a) 、// 延時函數
{
unsigned char i,j;
for(i=0;i<a;i++)
  for(j=0;j<600;j++);
}
void main(void)
{
unsigned  char key=0;        //按鈕狀態判斷變量
led1=led2=led3=led4=1;          //led初始均為關閉
button=1;          //按鈕初始化為按下
while(1){
    if(button==0){      
     key+=1;        //單擊key值為1
      s(20);
   if(button==0){
      key+=1;       //雙擊key值為2
       s(20);
    if(button==0){
       key+=1;         //三擊key值為3
        s(20);
     if(button==0){
        key+=1;     //四擊key值為4
         s(20);
      if(button==0){
       key+=1;    //長按key值為5
       s(100);
        while(button==0);
      }
     }
    }
  
   }
  }
  switch(key){         //根據key值開關相應引腳的led燈
   case 1:
    led1=~led1;
    break;
   case 2:
    led2=~led2;
    break;
   case 3:
    led3=~led3;
    break;
   case 4:
    led4=~led4;
    break;
   default:
    break;
  }

}
}

回復

使用道具 舉報

ID:1 發表于 2013-9-4 12:25 | 顯示全部樓層
你應該要做一下消抖處理
回復

使用道具 舉報

ID:153199 發表于 2017-1-8 16:09 | 顯示全部樓層
消抖處理一下
回復

使用道具 舉報

ID:140489 發表于 2017-1-11 11:15 | 顯示全部樓層
這樣寫可以做到按一次亮一個燈,按第5次,燈全滅
#include<reg52.h>   
sbit led1  = P1^7;     // LED1接P1.7腳
sbit led2  = P1^6;     // LED2接P1.6腳
sbit led3  = P1^5;     // LED3接P1.5腳
sbit led4  = P1^4;     // LED4接P1.4腳
sbit button = P1^0;     // 按鈕接P1.0腳
void delay(unsigned char ms)// 延時函數
{
unsigned char i,j;
for(i=ms;i>0;i--)
  for(j=110;j>0;j--);
}  


void main(void)
{
unsigned  char key=0;        //按鈕狀態判斷變量

//led1=led2=led3=led4=1;          //led初始均為關閉

button=1;          //按鈕初始化為按下
while(1){
   
        if(button==0)
        {
          delay(30);
          
          if(button==0)
          {   
        key++;
          while(button==0);
          }
  }
  switch(key){         //根據key值開關相應引腳的led燈
   case 1:
    led1=0;
    break;
   case 2:
    led2=0;
    break;
   case 3:
    led3=0;
    break;
   case 4:
    led4=0;
    break;
        case 5:
    led1=led2=led3=led4=1;
    break;
   default:
    break;
  }

}
}
回復

使用道具 舉報

ID:140489 發表于 2017-1-11 11:24 | 顯示全部樓層
//按1次亮1個燈,按4次4個燈全亮,按第5次,燈全滅,如此循環;仿真通過

#include<reg52.h>   
sbit led1  = P1^7;     // LED1接P1.7腳
sbit led2  = P1^6;     // LED2接P1.6腳
sbit led3  = P1^5;     // LED3接P1.5腳
sbit led4  = P1^4;     // LED4接P1.4腳
sbit button = P1^0;     // 按鈕接P1.0腳
void delay(unsigned char ms)// 延時函數
{
unsigned char i,j;
for(i=ms;i>0;i--)
  for(j=110;j>0;j--);
}  


void main(void)
{
unsigned  char key=0;        //按鈕狀態判斷變量

//led1=led2=led3=led4=1;          //led初始均為關閉

button=1;          //按鈕初始化為按下
while(1){
   
        if(button==0)
        {
          delay(30);
          
          if(button==0)
          {   
        key++;
          while(button==0);
          if(key==6)
          {key=0;}
          }
  }
  switch(key){         //根據key值開關相應引腳的led燈
   case 1:
    led1=0;
    break;
   case 2:
    led2=0;
    break;
   case 3:
    led3=0;
    break;
   case 4:
    led4=0;
    break;
        case 5:
    led1=led2=led3=led4=1;
    break;
   default:
    break;
  }

}
}
回復

使用道具 舉報

ID:140489 發表于 2017-1-11 14:03 | 顯示全部樓層
//按1次亮1個燈,按4次4個燈全亮,按第5次,燈全滅,如此循環

#include<reg52.h>   
sbit led1  = P1^7;     // LED1接P1.7腳
sbit led2  = P1^6;     // LED2接P1.6腳
sbit led3  = P1^5;     // LED3接P1.5腳
sbit led4  = P1^4;     // LED4接P1.4腳
sbit button = P1^0;     // 按鈕接P1.0腳
void delay(unsigned char ms)// 延時函數
{
unsigned char i,j;
for(i=ms;i>0;i--)
  for(j=110;j>0;j--);
}  


void main(void)
{
unsigned  char key=0;        //按鈕狀態判斷變量

//led1=led2=led3=led4=1;          //led初始均為關閉

button=1;          //按鈕初始化為按下
while(1){
   
        if(button==0)
        {
          delay(30);
          
          if(button==0)
          {   
        key+=1;
          while(button==0);
          if(key==6)
          key=0;
          }
  }
  switch(key){         //根據key值開關相應引腳的led燈
   case 1:
    led1=0;
    break;
   case 2:
    led2=0;
    break;
   case 3:
    led3=0;
    break;
   case 4:
    led4=0;
    break;
        case 5:
    led1=led2=led3=led4=1;
    break;
   default:
    break;
  }

}
}
回復

使用道具 舉報

ID:129918 發表于 2017-1-11 20:57 | 顯示全部樓層
頂ing一個
回復

使用道具 舉報

ID:161477 發表于 2017-1-12 15:54 | 顯示全部樓層
單擊,雙擊,長按
/***********************************************************************************************************

程序的功能:一個按鍵的單擊,雙擊,長按。三種按鍵方式,然后做不同的處理。這里就以P1口LED燈變化作為測試。

單擊:點亮P1口上第一個LED燈。(低電平點亮)

雙擊:點亮P1口上第二個LED燈。(低電平點亮)

長按:長按:點亮P1口上的8個LED燈。(低電平點亮)

使用方法:

硬件的連接:P2.0作為按鍵的輸入,P1口作為LED顯示,連接好后,直接復制粘貼生成HEX文件,燒寫進C51就能用。

************************************************************************************************************/

#include<reg51.h>

#define N_key 0 //無鍵

#define S_key 1 //單鍵

#define D_key 2 //雙鍵

#define L_key 3 //長鍵

#define key_state_0 0

#define key_state_1 1

#define key_state_2 2

#define key_state_3 3

sbit key_input = P2^0; // 按鍵輸入口

unsigned char time_10ms_ok = 0;

unsigned char key = 0;

unsigned char key_driver(void)

{

static unsigned char key_state = key_state_0, key_time = 0;

unsigned char key_return = N_key;

bit key_press;

key_press = key_input; // 讀按鍵I/O電平

switch (key_state)

{

case key_state_0: // 按鍵初始態

if (!key_press) key_state = key_state_1; // 鍵被按下,狀態轉換到按鍵消抖和確認狀態

break;

case key_state_1: // 按鍵消抖與確認態

if (!key_press)

{

key_time = 0; //

key_state = key_state_2; // 按鍵仍然處于按下,消抖完成,狀態轉換到按下鍵時間的計時狀態,但返回的還是無鍵事件

}

else

key_state = key_state_0; // 按鍵已抬起,轉換到按鍵初始態。此處完成和實現軟件消抖,其實按鍵的按下和釋放都在此消抖的。

break;

case key_state_2:

if(key_press)

{

key_return = S_key; // 此時按鍵釋放,說明是產生一次短操作,回送S_key

key_state = key_state_0; // 轉換到按鍵初始態

}

else if (++key_time >= 100) // 繼續按下,計時加10ms(10ms為本函數循環執行間隔)

{

key_return = L_key; // 按下時間>1000ms,此按鍵為長按操作,返回長鍵事件

key_state = key_state_3; // 轉換到等待按鍵釋放狀態

}

break;

case key_state_3: // 等待按鍵釋放狀態,此狀態只返回無按鍵事件

if (key_press) key_state = key_state_0; //按鍵已釋放,轉換到按鍵初始態

break;

}

return key_return;

}

/*=============

中間層按鍵處理函數,調用低層函數一次,處理雙擊事件的判斷,返回上層正確的無鍵、單鍵、雙鍵、長鍵4個按鍵事件。

本函數由上層循環調用,間隔10ms

===============*/

unsigned char key_read(void)

{

static unsigned char key_m = key_state_0, key_time_1 = 0;

unsigned char key_return = N_key,key_temp;

key_temp = key_driver();

switch(key_m)

{

case key_state_0:

if (key_temp == S_key )

{

key_time_1 = 0; // 第1次單擊,不返回,到下個狀態判斷后面是否出現雙擊

key_m = key_state_1;

}

else

key_return = key_temp; // 對于無鍵、長鍵,返回原事件

break;

case key_state_1:

if (key_temp == S_key) // 又一次單擊(間隔肯定<500ms)

{

key_return = D_key; // 返回雙擊鍵事件,回初始狀態

key_m = key_state_0;

}

else

{ // 這里500ms內肯定讀到的都是無鍵事件,因為長鍵>1000ms,在1s前低層返回的都是無鍵

if(++key_time_1 >= 50)

{

key_return = S_key; // 500ms內沒有再次出現單鍵事件,返回上一次的單鍵事件

key_m = key_state_0; // 返回初始狀態

}

}

break;

}

return key_return;

}

void main()

{

P1 = 0xff;        //IO口初始化

P2 = 0xff;

//定時器的初始化

TMOD = 0x01;        //選擇定時器的工作模式:定時器0,方式1

TH0 = (65535 - 10000)/256; //定時器的初值

TL0 = (65535 - 10000)%256;

EA = 1;        //開打總中斷使能

ET0 = 1;        //打開定時器0 的使能

TR0 = 1;        //打開定時器0 ,開始工作

while(1)

{

if(time_10ms_ok) //time_10ms_ok = 1,表示計時到了10MS。(10MS掃描一次按鍵)

{

time_10ms_ok = 0; //清除計時10MS標志

key = key_read(); //調用掃描按鍵程序,返回一個鍵值

if (key == L_key) //長按:點亮P1口上的8個LED燈。(低電平點亮)

{

P1 = 0x00;

}

else if(key == D_key)//雙擊:點亮P1口上第二個LED燈。(低電平點亮)

{

P1 = 0xfd;

}

else if(key == S_key)//單擊:點亮P1口上第一個LED燈。(低電平點亮)

{

P1 = 0xfe;

}

}

}

}
void timer0(void) interrupt 1        //用的是定時器0, 這個“interrupt 1”中的“1”代表1號中斷即是定時器0中斷。如果是“0”就是外部中斷0;“2“=外部中斷1;”3“定時器1中斷;”4“=串行口中斷
{

TH0 = (65535 - 10000)/256;

TL0 = (65535 - 10000)%256; //定時器0的方式1,得在中斷程序中重復初值。

time_10ms_ok = 1; //定時10MS 的標志

}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 又爽又黄axxx片免费观看 | 国产精品视频免费看 | 国产精品久久久久久久久图文区 | 中文字幕一区二区三区乱码在线 | 在线亚洲人成电影网站色www | 午夜在线观看免费 | 欧美视频第三页 | 国产一区二区三区高清 | 久久久久久国产精品免费免费狐狸 | 国产精品亚洲一区二区三区在线 | 日韩欧美三区 | 国产高清一区二区三区 | 久久久久国产精品一区二区 | 亚洲国产精品视频 | 欧美精品一区二区三区四区 在线 | 色资源在线 | 操操日| 国产特级毛片aaaaaa | 日韩成人免费 | 国产高清一二三区 | 亚洲一区二区三区免费观看 | 91av久久久| 最新日韩精品 | 欧美三级视频 | 国产在线不卡 | 国产精品www | 久久久国产一区二区三区 | 国产黄色大片在线观看 | 日韩av在线中文字幕 | 久久精品16| 国产亚洲成av人片在线观看桃 | 精品综合久久久 | 欧美精品在线一区二区三区 | 夜夜摸天天操 | 国产精品久久久久久久久久妞妞 | 一区二区高清 | 午夜视频精品 | 黄色91在线 | 日本精品一区二区 | 18gay男同69亚洲网站 | 三级在线免费观看 |