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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3490|回復: 13
打印 上一主題 下一主題
收起左側

新手求助單片機按鍵問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:738970 發表于 2020-5-1 16:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
200黑幣
求助 我寫了控制LED閃爍和常亮的程序, 寫到這里 后面就不會寫了。
我的按鍵是 K1  K2  當K1按下LED閃爍,再按下LED常亮,
我這里的K1按鍵是我想要的,我不知道怎么讓單片機上電后LED燈全部熄滅的。能不能讓K1按下2秒后關閉所有
LED燈。K2按下 單片機停止工作  K1按鍵按下也不要工作。幫忙修改下謝謝。下面是我寫的程序 我是新手剛剛開始學習。






#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++);  //延時消抖
      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;      //長亮
      case 0: led1 = 0; led2 = 0; led3 = 0; led4 = 0; delay(); readkey(); led=~led; //快速閃爍
      }
    }
}

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:369312 發表于 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++);  //延時消抖
      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();
    //粗略延時2S
      if(!k2)      {
        while(!k2);  //等待按鍵釋放
            flag=!flag;//標志位取反
      }
    }
}
main()
{
led = 1;led1 = 1;led2 = 1;led3 = 1;led4 = 1;//關燈
    while(1)  {
readkey();
if(!flag)   // flag為0則key1正常工作,為1則停止工作
{
      switch(n)    {
      case 1: led = 0; break;      //長亮
      case 0: delay();  led=~led; break; //快速閃爍
      }
}
    }
}
試試看,行不行
回復

使用道具 舉報

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

使用道具 舉報

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


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


#include <AT89X52.H>


unsigned char n = 0;//按鍵功能標志為
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;
/*
  延時函數
  這里用的不是精確的定時器函數,
  精度不高,但是也夠你用了

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

    for(i = 0;i < ums;i++)
    {
      for(j= 0; j< 200; j++) ;  //這里是兩個分開循環200 和 102,沒有嵌套

      for(j = 0; j < 102; j++); //這里是兩個分開循環200 和 102,沒有嵌套
    }
}

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

  if(!k2)//檢測k2是否按下過
{
   delay(50);         //延時消抖,50ms-200ms不能太長,不能太短
  if(!k2)               //延時消抖
  {
    while(!k2);        //等待按鍵彈起,
    if(n == 0)n=1;
    else n=0;
  }
  else if(!k1)//檢測k1是否按下,用else if,別用if
  {
     delay(50);         //延時消抖,50ms-200ms不能太長,不能太短
    if(!k1)               //延時消抖
    {
      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);//延時2S
                 led=0;led1=0;led2=0;led3=0;led4=0;//全亮
                  break;
      default:break;//switch函結尾
      }
    }
}







回復

使用道具 舉報

6#
ID:371233 發表于 2020-5-2 08:08 | 只看該作者
Proteus8.9 仿真STM32407ZGT6系列003_Keys的u8 ReadKey(u16 IoBit)按鍵要有防抖延時。
#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);//設置系統中斷優先級分組2
       delay_init(168);    //初始化延時函數
       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);
                     }
       }
}
回復

使用道具 舉報

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

//根據你的描述,LED接的應該是高電平亮,所以開始可以給P0低電平,k1按下交替控制LED閃爍和常亮兩種狀態,k2為自鎖開關控制電源就好了。
#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++;      
       }
     }
}}






回復

使用道具 舉報

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

else if n=0  錯誤
回復

使用道具 舉報

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

我是新手上面代碼我都是開視頻學的。有點亂不好意思。其實我就2個LED燈。LED 和LED1,我想用一個按鍵控制不同狀態。就像 k1 按一下 led閃爍 led1常亮。再按一下led常亮 led1也是常亮,再按一下循環。長按2秒k1 跟按下K2同樣 關閉 led 和led1.不好意思 我是新手
回復

使用道具 舉報

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

我新手 只能看視頻教程所以你跟我說我不會寫。我的要求應該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環這兩個功能。需要關閉時長按k1    2秒關閉。k2按一下就關閉。就是因為不會寫才來求助的。會寫就不求助了。

#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++);  //延時消抖
      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;      //長亮
          case 0: led1 = 0; delay(); readkey(); led = ~led; //快速閃爍
      }
    }
}
回復

使用道具 舉報

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

我新手 只能看視頻教程所以你跟我說我不會寫。我的要求應該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環這兩個功能。需要關閉時長按k1    2秒關閉。k2按一下就關閉。就是因為不會寫才來求助的。會寫就不求助了。

#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++);  //延時消抖
      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;      //長亮
          case 0: led1 = 0; delay(); readkey(); led = ~led; //快速閃爍
      }
    }
}
回復

使用道具 舉報

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

我新手 只能看視頻教程所以你跟我說我不會寫。我的要求應該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環這兩個功能。需要關閉時長按k1    2秒關閉。k2按一下就關閉。
你給我的代碼是錯的。

#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++);  //延時消抖
      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;      //長亮
          case 0: led1 = 0; delay(); readkey(); led = ~led; //快速閃爍
      }
    }
}
回復

使用道具 舉報

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

我新手 只能看視頻教程所以你跟我說我不會寫。我的要求應該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環這兩個功能。需要關閉時長按k1    2秒關閉。k2按一下就關閉。
你給我的代碼51單片機可以用嗎?

#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++);  //延時消抖
      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;      //長亮
          case 0: led1 = 0; delay(); readkey(); led = ~led; //快速閃爍
      }
    }
}
回復

使用道具 舉報

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

我沒用keil打代碼,用的是論壇手打的代碼,出錯了,也不報錯的,所以要你自己改錯,這很關鍵,寫代碼基本都是復制粘貼大佬或者別人寫好的代碼,再手動改錯。
吧else if換成if。另外你那個長安兩秒的判斷要在 while(!k1);  //等待按鍵釋放   要在這里判斷是否超過2秒
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产乱码精品一区二区三区忘忧草 | 欧美日韩电影一区 | 亚洲av毛片 | 国产日韩一区二区三免费高清 | 亚洲一区二区三区桃乃木香奈 | 91精品国产91久久久久久丝袜 | 午夜亚洲 | 人人干人人看 | 一区二区高清在线观看 | 日韩欧美在线观看视频 | 久久福利电影 | 在线视频国产一区 | 毛片网在线观看 | 天天综合永久 | 亚洲人成人一区二区在线观看 | 日韩中文字幕在线观看视频 | 国产成人免费视频网站高清观看视频 | 在线免费观看黄视频 | 犬夜叉在线观看 | 精品网站999www | 一区二区三区av | 久久久久久国产精品 | 成人精品鲁一区一区二区 | 网色| 欧美成年黄网站色视频 | 亚洲第一天堂 | 视频一区二区在线 | 国产成人精品一区二 | 一本一道久久a久久精品综合 | 欧美国产视频 | 欧美 日韩 国产 在线 | 欧美区日韩区 | 日日草夜夜草 | 91精品国产91久久久久青草 | 午夜电影福利 | 日韩一区二区免费视频 | 国产精品无码久久久久 | 亚洲国产精品久久久久秋霞不卡 | 国产日韩欧美在线观看 | 亚洲免费视频在线观看 | 北条麻妃一区二区三区在线观看 |