找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3782|回復: 14
收起左側(cè)

請問按鈕怎樣關機和開機?附單片機程序

[復制鏈接]
ID:103131 發(fā)表于 2021-5-10 15:58 | 顯示全部樓層 |閱讀模式
按鈕要長按才能顯示關機,放手就不行了,我想要的是按一下就永久關機,再按一下就永久開機。

void KEY_TEST2(void)
{
    static unsigned int i = 0;
     if(KEY2==0)//按鍵1
       {
        delay_ms(50);
        if(KEY2==0)
          {     
             i = ++i%2;        
                        
                           printf("i =  %d\r\n",i);
              switch(i)
                          {
                                  case(0):
                                       
                                          POWER_OFF_MODE();break;

                                  case(1):
                                       
                                        AD_TEST();break;
                                 
                          }   
                            while(!KEY2);
                   }
                  
                }
         
}




void main(void)
{        
        
        
               

        while(1)
        {               
         
                 AD_TEST();
                 KEY_TEST2();
               
        }


               


               
}


回復

使用道具 舉報

ID:103131 發(fā)表于 2021-5-10 18:14 | 顯示全部樓層
為什么程序一起工作,按鈕按下沒法鎖定信號?
回復

使用道具 舉報

ID:101869 發(fā)表于 2021-5-10 20:16 來自手機 | 顯示全部樓層
while(!KEY2);這個是等待按鍵抬起,一般都是抬起后再執(zhí)行關機吧
回復

使用道具 舉報

ID:103131 發(fā)表于 2021-5-10 20:40 | 顯示全部樓層
非凡科技 發(fā)表于 2021-5-10 20:16
while(!KEY2);這個是等待按鍵抬起,一般都是抬起后再執(zhí)行關機吧

兩個函數(shù)一起運行,KEY按下后再放下就沒有鎖定了,請問有什么辦法讓按一下關閉,再按一下就打開?
回復

使用道具 舉報

ID:889094 發(fā)表于 2021-5-10 21:42 | 顯示全部樓層
   i = ++i%2;        神一樣的句子,讓我專門去百度%和左++的優(yōu)先級

按一下關,再按一下開,直接檢測放開不好么?
按下,消抖,等待放開然后操作,似乎更容易理解一些,你如果想按下和放開有不同的操作的話才會一定要在按下的時候來執(zhí)行操作的。

另外求教一下:    printf("i =  %d\r\n",i);是打印到串口了嗎?函數(shù)是怎么重定向的?
回復

使用道具 舉報

ID:889094 發(fā)表于 2021-5-10 22:02 | 顯示全部樓層
goldbirderman 發(fā)表于 2021-5-10 20:40
兩個函數(shù)一起運行,KEY按下后再放下就沒有鎖定了,請問有什么辦法讓按一下關閉,再按一下就打開?

單片機怎么會有同時執(zhí)行的問題?單片機是任務執(zhí)行的,應該沒有同時執(zhí)行的情況吧
回復

使用道具 舉報

ID:101869 發(fā)表于 2021-5-10 22:23 來自手機 | 顯示全部樓層
把開關取反就行了
回復

使用道具 舉報

ID:213173 發(fā)表于 2021-5-11 07:40 | 顯示全部樓層
樓上討論的都不在問題核心點上。此按鍵函數(shù)內(nèi)只在開/關機函數(shù)中2選1調(diào)用,但主函數(shù)始終在執(zhí)行開機函數(shù),當然按鍵關機后一旦松手即又開機,是樓主犯了邏輯錯誤。
回復

使用道具 舉報

ID:824490 發(fā)表于 2021-5-11 09:04 | 顯示全部樓層
http://www.torrancerestoration.com/bbs/dpj-203511-1.html
看年這個對你是不是有幫助?
回復

使用道具 舉報

ID:103131 發(fā)表于 2021-5-11 14:33 | 顯示全部樓層
wulin 發(fā)表于 2021-5-11 07:40
樓上討論的都不在問題核心點上。此按鍵函數(shù)內(nèi)只在開/關機函數(shù)中2選1調(diào)用,但主函數(shù)始終在執(zhí)行開機函數(shù),當 ...

static  unsigned int i = 0;

    if(KEY2==0)//按鍵1
       {
        delay_ms(50);
        if(KEY2==0)
          {     
            i++;
                          if(i>1)
                                  i = 0;
                       
                           printf("i =  %d\r\n",i);
              switch(i)
                          {
                                  case(0):
                                       
                                       while(!i)
                                          POWER_OFF_MODE();break; 我改成這樣就可以鎖定,可是沒法讓它開機
回復

使用道具 舉報

ID:213173 發(fā)表于 2021-5-11 16:01 | 顯示全部樓層
goldbirderman 發(fā)表于 2021-5-11 14:33
static  unsigned int i = 0;

    if(KEY2==0)//按鍵1

不要白忙活,原來的按鍵程序可以用,把main函數(shù)里AD_TEST();注釋掉即可。
void main(void)
{        
        while(1)
        {
//                AD_TEST();
                KEY_TEST2();
        }
}
回復

使用道具 舉報

ID:103131 發(fā)表于 2021-5-11 16:17 | 顯示全部樓層
wulin 發(fā)表于 2021-5-11 16:01
不要白忙活,原來的按鍵程序可以用,把main函數(shù)里AD_TEST();注釋掉即可。
void main(void)
{        

可是我AD_TEST()這個函數(shù)也要運行
回復

使用道具 舉報

ID:139866 發(fā)表于 2021-5-11 16:51 | 顯示全部樓層
goldbirderman 發(fā)表于 2021-5-11 16:17
可是我AD_TEST()這個函數(shù)也要運行

那就設置標志位,別直接拿去用函數(shù)
回復

使用道具 舉報

ID:103131 發(fā)表于 2021-5-11 16:54 | 顯示全部樓層
天ノ憶 發(fā)表于 2021-5-11 16:51
那就設置標志位,別直接拿去用函數(shù)

怎樣標志位?
回復

使用道具 舉報

ID:609524 發(fā)表于 2021-5-12 10:58 | 顯示全部樓層

設置一個標志位,為1開,為0關,標志位到按鍵里面取反就行了
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表