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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

新手求助單片機按鍵問題

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:738970 發(fā)表于 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

板凳
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++);  //延時消抖
      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 發(fā)表于 2020-5-1 22:11 | 只看該作者
真不知想表達什么
回復

使用道具 舉報

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


看著你功能描述,看著你的代碼,完全不知道你要干嘛,如果你要K2按下后單片機停止工作,那你只要將K2放到電源處就好了你要開機后所有燈熄滅,就要在開始處while(1)之前將IO口低電平
要精確延時2秒就去網(wǎng)上搜定時器延時函數(shù)
另外你的按鍵掃描也一團糟
switch函數(shù)沒有結(jié)尾
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;
/*
  延時函數(shù)
  這里用的不是精確的定時器函數(shù),
  精度不高,但是也夠你用了

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

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

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

/*
按鍵掃描
排除同時按下兩個按鍵的情況
n = 0 K2首次按下,或者剛開機狀態(tài),k1失效,燈全滅
n = 1 K2第二次按下狀態(tài)燈閃爍
n = 2  K1按下,可以不停按下k1切換n = 1=2狀態(tài)
*/
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函結(jié)尾
      }
    }
}







回復

使用道具 舉報

6#
ID:371233 發(fā)表于 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);//設置系統(tǒng)中斷優(yōu)先級分組2
       delay_init(168);    //初始化延時函數(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);
                     }
       }
}
回復

使用道具 舉報

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

//根據(jù)你的描述,LED接的應該是高電平亮,所以開始可以給P0低電平,k1按下交替控制LED閃爍和常亮兩種狀態(tài),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 發(fā)表于 2020-5-2 11:11 | 只看該作者
黃youhui 發(fā)表于 2020-5-1 22:59
看著你功能描述,看著你的代碼,完全不知道你要干嘛,如果你要K2按下后單片機停止工作,那你只要將K2放 ...

else if n=0  錯誤
回復

使用道具 舉報

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

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

使用道具 舉報

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

我新手 只能看視頻教程所以你跟我說我不會寫。我的要求應該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環(huán)這兩個功能。需要關閉時長按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 發(fā)表于 2020-5-2 11:54 | 只看該作者

我新手 只能看視頻教程所以你跟我說我不會寫。我的要求應該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環(huán)這兩個功能。需要關閉時長按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 發(fā)表于 2020-5-2 11:55 | 只看該作者
黃youhui 發(fā)表于 2020-5-1 22:59
看著你功能描述,看著你的代碼,完全不知道你要干嘛,如果你要K2按下后單片機停止工作,那你只要將K2放 ...

我新手 只能看視頻教程所以你跟我說我不會寫。我的要求應該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環(huán)這兩個功能。需要關閉時長按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 發(fā)表于 2020-5-2 11:56 | 只看該作者
kaillen 發(fā)表于 2020-5-2 08:08
Proteus8.9 仿真STM32407ZGT6系列003_Keys的u8 ReadKey(u16 IoBit)按鍵要有防抖延時。
#define Oppsit(A)  ...

我新手 只能看視頻教程所以你跟我說我不會寫。我的要求應該不是很難,上電燈是滅的,按一下k1 led閃爍led1常亮 再按 led常亮led1常亮。k1按鍵循環(huán)這兩個功能。需要關閉時長按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 發(fā)表于 2020-5-2 20:06 | 只看該作者
haolong155 發(fā)表于 2020-5-2 11:55
我新手 只能看視頻教程所以你跟我說我不會寫。我的要求應該不是很難,上電燈是滅的,按一下k1 led閃爍led ...

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久中文字 | 精品在线播放 | 国产精品久久久久久妇女6080 | 一区二区不卡视频 | 久久久久99 | 福利一区二区 | 久久天天躁狠狠躁夜夜躁2014 | 欧美 日韩 综合 | 色爱av| 中文字幕一区二区三区乱码在线 | 午夜视频一区二区 | 国产婷婷 | 一区二区三区韩国 | 日本韩国电影免费观看 | 色视频一区二区 | 亚洲综合网站 | 久久这里只有精品首页 | a欧美| 男女免费视频网站 | 久久精品亚洲精品国产欧美 | 天堂在线中文字幕 | 在线视频一区二区三区 | 日日噜噜噜夜夜爽爽狠狠视频97 | 日韩午夜精品 | 中文字幕免费 | 91中文在线观看 | 欧美中文一区 | 免费性视频 | 中文字幕在线播放第一页 | 不卡一区二区三区四区 | 亚洲精品一区二三区不卡 | 中文在线视频观看 | 日本高清精品 | 国产在线观看一区二区 | 成人亚洲一区 | 青青草综合 | 成人一区二区三区视频 | 精品欧美视频 | 国产欧美日韩综合精品一区二区 | 成人国产在线视频 | 亚洲精品国产偷自在线观看 |