欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4073|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

新手求助單片機(jī)按鍵問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:738970 發(fā)表于 2020-5-1 16:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
200黑幣
求助 我寫(xiě)了控制LED閃爍和常亮的程序, 寫(xiě)到這里 后面就不會(huì)寫(xiě)了。
我的按鍵是 K1  K2  當(dāng)K1按下LED閃爍,再按下LED常亮,
我這里的K1按鍵是我想要的,我不知道怎么讓單片機(jī)上電后LED燈全部熄滅的。能不能讓K1按下2秒后關(guān)閉所有
LED燈。K2按下 單片機(jī)停止工作  K1按鍵按下也不要工作。幫忙修改下謝謝。下面是我寫(xiě)的程序 我是新手剛剛開(kāi)始學(xué)習(xí)。






#include <AT89X52.H>
unsigned char n = 0;
sbit k1 = P1^0;
sbit k2 = P1^1;
sbit led = P0^0;
sbit led1 = P0^1;
sbit led2 = P0^2;
sbit led3 = P0^3;
sbit led4 = P0^4;
void delay()
{
    unsigned int  i, j;
    for(i = 0; i < 100; i++)   for(j = 0; j < 150; j++);
}
void readkey(void)
{
    unsigned char  i, j;
    if(!k1)  {
      for(i = 0; i < 10; i++)
        for(j = 0; j < 120; j++);  //延時(shí)消抖
      if(!k1)  {
        while(!k1);  //等待按鍵釋放
        n++;
        n %= 2;       //n = 0~0
      }
    }
}
main()
{
    while(1)  {
      switch(n)    {
      case 1: led = 0;led1 = 0;led2 = 0;led3 = 0;led4 = 0; readkey(); break;      //長(zhǎng)亮
      case 0: led1 = 0; led2 = 0; led3 = 0; led4 = 0; delay(); readkey(); led=~led; //快速閃爍
      }
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:742494 發(fā)表于 2020-5-1 20:24 | 只看該作者
首先建議樓主的問(wèn)題可以描述得更準(zhǔn)確些。
我整理如下,請(qǐng)看下是不是你想要的?
按鍵輸入 K1,K2
按鍵K1功能1:控制LED燈閃爍和常亮切換。  
                     這個(gè)就你現(xiàn)在的代碼,自己進(jìn)行優(yōu)化調(diào)試。
按鍵K1功能2:“讓K1按下2秒后關(guān)閉所有”,這點(diǎn)和功能1是矛盾的,應(yīng)刪除,直接改為上電初始化全滅。
                     解決方法是:1)增加1個(gè)void init(void)程序,將LED關(guān)掉。
                     2)在MAIN入口處先運(yùn)行init();程序。 這樣開(kāi)機(jī)就可以先執(zhí)行關(guān)LED操作。
按鍵K2功能:?jiǎn)纹瑱C(jī)停止工作,包括K1的按鍵功能也停止。
                   解決方法是,在循環(huán)中增加檢測(cè)K2的操作,檢測(cè)到K2后,執(zhí)行while(1);直接進(jìn)入死循環(huán),這樣就停止所有功能了。如果想要再按一次K2退出循環(huán),可以在檢測(cè)到K2后,執(zhí)行{滅燈,while(K2);};這樣一檢測(cè)到K2,就退出循環(huán),K1的功能又能再次使用。
                以上是思路,按照這個(gè)思路肯定可以實(shí)現(xiàn)你要的功能,代碼還是自己寫(xiě)吧。
回復(fù)

使用道具 舉報(bào)

板凳
ID:369312 發(fā)表于 2020-5-1 20:54 | 只看該作者
#include <AT89X52.H>
unsigned char n = 0;
sbit k1 = P1^0;
sbit k2 = P1^1;
sbit led = P0^0;
sbit led1 = P0^1;
sbit led2 = P0^2;
sbit led3 = P0^3;
sbit led4 = P0^4;
unsigned char flag = 0;
void delay()
{
    unsigned int  i, j;
    for(i = 0; i < 100; i++)   for(j = 0; j < 150; j++);
}
void readkey(void)
{
    unsigned char  i, j;
    if(!k1)  {
      for(i = 0; i < 10; i++)
        for(j = 0; j < 120; j++);  //延時(shí)消抖
      if(!k1)      {
        while(!k1);  //等待按鍵釋放
        n++;
        n %= 2;       //n = 0~0
      }
    }
    if(!k2)  {
      for(i = 0; i < 100; i++)
         for(j = 0; j < 250; j++)
              delay();
    //粗略延時(shí)2S
      if(!k2)      {
        while(!k2);  //等待按鍵釋放
            flag=!flag;//標(biāo)志位取反
      }
    }
}
main()
{
led = 1;led1 = 1;led2 = 1;led3 = 1;led4 = 1;//關(guān)燈
    while(1)  {
readkey();
if(!flag)   // flag為0則key1正常工作,為1則停止工作
{
      switch(n)    {
      case 1: led = 0; break;      //長(zhǎng)亮
      case 0: delay();  led=~led; break; //快速閃爍
      }
}
    }
}
試試看,行不行
回復(fù)

使用道具 舉報(bào)

地板
ID:413383 發(fā)表于 2020-5-1 22:11 | 只看該作者
真不知想表達(dá)什么
回復(fù)

使用道具 舉報(bào)

5#
ID:592807 發(fā)表于 2020-5-1 22:59 | 只看該作者


看著你功能描述,看著你的代碼,完全不知道你要干嘛,如果你要K2按下后單片機(jī)停止工作,那你只要將K2放到電源處就好了你要開(kāi)機(jī)后所有燈熄滅,就要在開(kāi)始處while(1)之前將IO口低電平
要精確延時(shí)2秒就去網(wǎng)上搜定時(shí)器延時(shí)函數(shù)
另外你的按鍵掃描也一團(tuán)糟
switch函數(shù)沒(méi)有結(jié)尾
led =~ led;是什么東西


#include <AT89X52.H>


unsigned char n = 0;//按鍵功能標(biāo)志為
sbit k1 = P1^0;//按鍵 1,k1 =1,表示按下
sbit k2 = P1^1;//按鍵2,k2 =1,表示按下
sbit led = P0^0;//led1 = 0燈亮
sbit led1 = P0^1;
sbit led2 = P0^2;
sbit led3 = P0^3;
sbit led4 = P0^4;
/*
  延時(shí)函數(shù)
  這里用的不是精確的定時(shí)器函數(shù),
  精度不高,但是也夠你用了

*/
void delay(unsigned int ums)
{
    unsigned int  i, j;

    for(i = 0;i < ums;i++)
    {
      for(j= 0; j< 200; j++) ;  //這里是兩個(gè)分開(kāi)循環(huán)200 和 102,沒(méi)有嵌套

      for(j = 0; j < 102; j++); //這里是兩個(gè)分開(kāi)循環(huán)200 和 102,沒(méi)有嵌套
    }
}

/*
按鍵掃描
排除同時(shí)按下兩個(gè)按鍵的情況
n = 0 K2首次按下,或者剛開(kāi)機(jī)狀態(tài),k1失效,燈全滅
n = 1 K2第二次按下?tīng)顟B(tài)燈閃爍
n = 2  K1按下,可以不停按下k1切換n = 1=2狀態(tài)
*/
void readkey(void)
{
    unsigned char  i, j;

  if(!k2)//檢測(cè)k2是否按下過(guò)
{
   delay(50);         //延時(shí)消抖,50ms-200ms不能太長(zhǎng),不能太短
  if(!k2)               //延時(shí)消抖
  {
    while(!k2);        //等待按鍵彈起,
    if(n == 0)n=1;
    else n=0;
  }
  else if(!k1)//檢測(cè)k1是否按下,用else if,別用if
  {
     delay(50);         //延時(shí)消抖,50ms-200ms不能太長(zhǎng),不能太短
    if(!k1)               //延時(shí)消抖
    {
      while(!k1);        //等待按鍵彈起,
      if(n == 1)n=2;
      else if n=0
   }     

  }


}



}
main()
{
     led = 0;
   led1 = 0;
   led2 = 0;
   led3 = 0;
   led4 = 0;

    while(1)
    {
      readkey();
      switch(n)  
      {
      case 0:  led = 1;led1 = 1;led2 = 1;led3 = 1;led4 = 1; break;  //全滅   
      case 1:if(led == 0)led=1;else led = 0;break;//閃爍
      case 2: delay(500);delay(500);delay(500);delay(500);//延時(shí)2S
                 led=0;led1=0;led2=0;led3=0;led4=0;//全亮
                  break;
      default:break;//switch函結(jié)尾
      }
    }
}







回復(fù)

使用道具 舉報(bào)

6#
ID:371233 發(fā)表于 2020-5-2 08:08 | 只看該作者
Proteus8.9 仿真STM32407ZGT6系列003_Keys的u8 ReadKey(u16 IoBit)按鍵要有防抖延時(shí)。
#define Oppsit(A) (A!=0)?0:1
u8 i, k=1, t=0;
u8 str[8][17]={  "紅燈亮!!!...\r\n",
                                        "紅亮滅!!!...\r\n",
                                        "黃燈亮!!!...\r\n",
                                        "黃亮滅!!!...\r\n",
                                        "綠燈亮!!!...\r\n",
                                        "綠亮滅!!!...\r\n",
                                        "燈閃亮!!!...\r\n",
                                        "燈閃滅!!!...\r\n",
                   };
u8 ReadKey(u16 IoBit){
       if(0==GPIO_ReadInputDataBit(GPIOC,IoBit)){
              return 0;
       }
    else{
              delay_us(10);
              if(1==GPIO_ReadInputDataBit(GPIOC,IoBit)) {
                     return1;
              }
              else{
                     return0;
              }
       }
}
int main (void)
{
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
       delay_init(168);    //初始化延時(shí)函數(shù)
       uart_init(9600);     //串口初始化
       LED_Init();                           //初始化LED端口
       KEY_Init();                                //按鍵初始化        
       while(1)
       {
                     if(1==ReadKey(0x0020))k=0;
                     if(1==k){
                            for(t=0;t<16;t++){
                                   USART_SendData(USART1,(u16) str[6][t]);
                                   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                            }
                            for(i=0;  i<6; i++){
                                          PCout((i/2+1))=Oppsit((i%2));
                                          for(t=0;t<16;t++){
                                                 USART_SendData(USART1,(u16) str[ i][t]);
                                                 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                                          }
                                          delay_ms(500);
                            }
                     }
                     else{
                            for(t=0;t<16;t++){
                                   USART_SendData(USART1,(u16) str[7][t]);
                                   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                            }
                            while(1!=ReadKey(0x0010));
                            k=1;
                            delay_ms(50);
                     }
       }
}
回復(fù)

使用道具 舉報(bào)

7#
ID:452950 發(fā)表于 2020-5-2 10:33 | 只看該作者
本帖最后由 xxpp2011 于 2020-5-2 12:25 編輯

//根據(jù)你的描述,LED接的應(yīng)該是高電平亮,所以開(kāi)始可以給P0低電平,k1按下交替控制LED閃爍和常亮兩種狀態(tài),k2為自鎖開(kāi)關(guān)控制電源就好了。
#include <REG52.H>
sbit k1 = P1^0;unsigned char n=0;
void delay(uint ms){
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}

main()
{
   P0=0;
   if(k1=0)
    {
     while(1)  
     {
       while(!(n%2))
       {
        P0=1;
        delay(30);
        P0=0;
        delay(30);
        if(k1=0)n++;      
        }
       while(n%2)
       {
        P0=1;
       if(k1=0)n++;      
       }
     }
}}






回復(fù)

使用道具 舉報(bào)

8#
ID:738970 發(fā)表于 2020-5-2 11:11 | 只看該作者
黃youhui 發(fā)表于 2020-5-1 22:59
看著你功能描述,看著你的代碼,完全不知道你要干嘛,如果你要K2按下后單片機(jī)停止工作,那你只要將K2放 ...

else if n=0  錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

9#
ID:738970 發(fā)表于 2020-5-2 11:22 | 只看該作者
黃youhui 發(fā)表于 2020-5-1 22:59
看著你功能描述,看著你的代碼,完全不知道你要干嘛,如果你要K2按下后單片機(jī)停止工作,那你只要將K2放 ...

我是新手上面代碼我都是開(kāi)視頻學(xué)的。有點(diǎn)亂不好意思。其實(shí)我就2個(gè)LED燈。LED 和LED1,我想用一個(gè)按鍵控制不同狀態(tài)。就像 k1 按一下 led閃爍 led1常亮。再按一下led常亮 led1也是常亮,再按一下循環(huán)。長(zhǎng)按2秒k1 跟按下K2同樣 關(guān)閉 led 和led1.不好意思 我是新手
回復(fù)

使用道具 舉報(bào)

10#
ID:738970 發(fā)表于 2020-5-2 11:54 | 只看該作者
tcdzyq 發(fā)表于 2020-5-1 20:24
首先建議樓主的問(wèn)題可以描述得更準(zhǔn)確些。
我整理如下,請(qǐng)看下是不是你想要的?
按鍵輸入 K1,K2

我新手 只能看視頻教程所以你跟我說(shuō)我不會(huì)寫(xiě)。我的要求應(yīng)該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環(huán)這兩個(gè)功能。需要關(guān)閉時(shí)長(zhǎng)按k1    2秒關(guān)閉。k2按一下就關(guān)閉。就是因?yàn)椴粫?huì)寫(xiě)才來(lái)求助的。會(huì)寫(xiě)就不求助了。

#include <AT89X52.H>
unsigned char n = 0;

sbit k1 = P1^0;
sbit k2 = P1^1;
sbit led = P0^0;
sbit led1 = P0^1;


void delay()
{
    unsigned int  i, j;
    for(i = 0; i < 110; i++)   for(j = 0; j < 220; j++);
}

void readkey(void)
{
    unsigned char  i, j;
    if(!k1)  {
      for(i = 0; i < 10; i++)
        for(j = 0; j < 120; j++);  //延時(shí)消抖
      if(!k1)  {
        while(!k1);  //等待按鍵釋放
        n++;
        n %= 3;       //n = 0~3
      }
    }
}
void main()
{     
      while(1)  {
      switch(n)    {
      case 2: led = 1;led1 = 1; readkey(); break;      //熄滅
          case 1: led = 0;led1 = 0; readkey(); break;      //長(zhǎng)亮
          case 0: led1 = 0; delay(); readkey(); led = ~led; //快速閃爍
      }
    }
}
回復(fù)

使用道具 舉報(bào)

11#
ID:738970 發(fā)表于 2020-5-2 11:54 | 只看該作者
hulilanyua 發(fā)表于 2020-5-1 22:11
真不知想表達(dá)什么

我新手 只能看視頻教程所以你跟我說(shuō)我不會(huì)寫(xiě)。我的要求應(yīng)該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環(huán)這兩個(gè)功能。需要關(guān)閉時(shí)長(zhǎng)按k1    2秒關(guān)閉。k2按一下就關(guān)閉。就是因?yàn)椴粫?huì)寫(xiě)才來(lái)求助的。會(huì)寫(xiě)就不求助了。

#include <AT89X52.H>
unsigned char n = 0;

sbit k1 = P1^0;
sbit k2 = P1^1;
sbit led = P0^0;
sbit led1 = P0^1;


void delay()
{
    unsigned int  i, j;
    for(i = 0; i < 110; i++)   for(j = 0; j < 220; j++);
}

void readkey(void)
{
    unsigned char  i, j;
    if(!k1)  {
      for(i = 0; i < 10; i++)
        for(j = 0; j < 120; j++);  //延時(shí)消抖
      if(!k1)  {
        while(!k1);  //等待按鍵釋放
        n++;
        n %= 3;       //n = 0~3
      }
    }
}
void main()
{     
      while(1)  {
      switch(n)    {
      case 2: led = 1;led1 = 1; readkey(); break;      //熄滅
          case 1: led = 0;led1 = 0; readkey(); break;      //長(zhǎng)亮
          case 0: led1 = 0; delay(); readkey(); led = ~led; //快速閃爍
      }
    }
}
回復(fù)

使用道具 舉報(bào)

12#
ID:738970 發(fā)表于 2020-5-2 11:55 | 只看該作者
黃youhui 發(fā)表于 2020-5-1 22:59
看著你功能描述,看著你的代碼,完全不知道你要干嘛,如果你要K2按下后單片機(jī)停止工作,那你只要將K2放 ...

我新手 只能看視頻教程所以你跟我說(shuō)我不會(huì)寫(xiě)。我的要求應(yīng)該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環(huán)這兩個(gè)功能。需要關(guān)閉時(shí)長(zhǎng)按k1    2秒關(guān)閉。k2按一下就關(guān)閉。
你給我的代碼是錯(cuò)的。

#include <AT89X52.H>
unsigned char n = 0;

sbit k1 = P1^0;
sbit k2 = P1^1;
sbit led = P0^0;
sbit led1 = P0^1;


void delay()
{
    unsigned int  i, j;
    for(i = 0; i < 110; i++)   for(j = 0; j < 220; j++);
}

void readkey(void)
{
    unsigned char  i, j;
    if(!k1)  {
      for(i = 0; i < 10; i++)
        for(j = 0; j < 120; j++);  //延時(shí)消抖
      if(!k1)  {
        while(!k1);  //等待按鍵釋放
        n++;
        n %= 3;       //n = 0~3
      }
    }
}
void main()
{     
      while(1)  {
      switch(n)    {
      case 2: led = 1;led1 = 1; readkey(); break;      //熄滅
          case 1: led = 0;led1 = 0; readkey(); break;      //長(zhǎng)亮
          case 0: led1 = 0; delay(); readkey(); led = ~led; //快速閃爍
      }
    }
}
回復(fù)

使用道具 舉報(bào)

13#
ID:738970 發(fā)表于 2020-5-2 11:56 | 只看該作者
kaillen 發(fā)表于 2020-5-2 08:08
Proteus8.9 仿真STM32407ZGT6系列003_Keys的u8 ReadKey(u16 IoBit)按鍵要有防抖延時(shí)。
#define Oppsit(A)  ...

我新手 只能看視頻教程所以你跟我說(shuō)我不會(huì)寫(xiě)。我的要求應(yīng)該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環(huán)這兩個(gè)功能。需要關(guān)閉時(shí)長(zhǎng)按k1    2秒關(guān)閉。k2按一下就關(guān)閉。
你給我的代碼51單片機(jī)可以用嗎?

#include <AT89X52.H>
unsigned char n = 0;

sbit k1 = P1^0;
sbit k2 = P1^1;
sbit led = P0^0;
sbit led1 = P0^1;


void delay()
{
    unsigned int  i, j;
    for(i = 0; i < 110; i++)   for(j = 0; j < 220; j++);
}

void readkey(void)
{
    unsigned char  i, j;
    if(!k1)  {
      for(i = 0; i < 10; i++)
        for(j = 0; j < 120; j++);  //延時(shí)消抖
      if(!k1)  {
        while(!k1);  //等待按鍵釋放
        n++;
        n %= 3;       //n = 0~3
      }
    }
}
void main()
{     
      while(1)  {
      switch(n)    {
      case 2: led = 1;led1 = 1; readkey(); break;      //熄滅
          case 1: led = 0;led1 = 0; readkey(); break;      //長(zhǎng)亮
          case 0: led1 = 0; delay(); readkey(); led = ~led; //快速閃爍
      }
    }
}
回復(fù)

使用道具 舉報(bào)

14#
ID:592807 發(fā)表于 2020-5-2 20:06 | 只看該作者
haolong155 發(fā)表于 2020-5-2 11:55
我新手 只能看視頻教程所以你跟我說(shuō)我不會(huì)寫(xiě)。我的要求應(yīng)該不是很難,上電燈是滅的,按一下k1 led閃爍led ...

我沒(méi)用keil打代碼,用的是論壇手打的代碼,出錯(cuò)了,也不報(bào)錯(cuò)的,所以要你自己改錯(cuò),這很關(guān)鍵,寫(xiě)代碼基本都是復(fù)制粘貼大佬或者別人寫(xiě)好的代碼,再手動(dòng)改錯(cuò)。
吧else if換成if。另外你那個(gè)長(zhǎng)安兩秒的判斷要在 while(!k1);  //等待按鍵釋放   要在這里判斷是否超過(guò)2秒
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表