標(biāo)題: C語言程序case跑到8之后按鍵就跳不出去了? [打印本頁]

作者: 修羅_戰(zhàn)    時間: 2022-6-7 18:03
標(biāo)題: C語言程序case跑到8之后按鍵就跳不出去了?
麻煩各位大佬幫忙看下哪里有問題,LED的呼吸子程序不能用按鍵切換

單片機C語言源程序如下:
#include <reg52.h>

unsigned int mode;

void DelayXms(unsigned int xms);
void Delayus(int us);
void LED_R();
void LED_G();
void LED();

sbit key=P3^4;

void main()                          //主程序
{
        while(1)
        {
                LED();
                if(!key)
                {
                        DelayXms(50);
                        if(!key)
                        {               
                                mode++;
                                if(mode>=10)                                
                                mode=0;                                
                        }  while(!key);
                }
        }
}

void DelayXms(unsigned int xms)                 //延遲函數(shù)
{
        unsigned i,j;
        for(i=xms;i>0;i--)
        {
                for(j=124;j>0;j--);
        }        
}

void Delayus(int us)                //10us
{
        unsigned char i;
        while(us)
        {
                i = 2;
                while (--i);
                us--;
        }
}

void LED_R()                         //LED呼吸
{
        int i;
        
        for(i=1;i<300;i++)//由暗變亮
        {
                P1=0x00;
                Delayus(i);
                P1=0x01;
                Delayus(300-i);
        }
        for(i=1;i<300;i++)//由亮變暗
        {
                P1=0x01;
                Delayus(i);
                P1=0x00;
                Delayus(300-i);
        }        
}

void LED_G()                                //LED呼吸
{
        int i;
        
        for(i=1;i<300;i++)//由暗變亮
        {
                P1=0x00;
                Delayus(i);
                P1=0x02;
                Delayus(300-i);
        }
        for(i=1;i<300;i++)//由亮變暗
        {
                P1=0x02;
                Delayus(i);
                P1=0x00;
                Delayus(300-i);
        }        
}

void LED()
{
        switch(mode)
        {
                case 0:P1 = 0x00;break;          //上電默認(rèn)所有的LED都不亮
                case 1:P1 = 0x01;break;          //按鍵按下,第一個LED亮
                case 2:P1 = 0x02;break;          //按鍵按下,第二個LED亮
                case 3:P1 = 0x04;break;          //按鍵按下,第三個LED亮
                case 4:P1 = 0x05;break;          //按鍵按下,第一第三個LED亮
                case 5:P1 = 0x03;break;          //按鍵按下,第一第二個LED亮
                case 6:P1 = 0x06;break;          //按鍵按下,第二第三個LED亮
                case 7:P1 = 0x07;break;          //按鍵按下,LED全亮
                case 8:LED_R();break;
                case 9:LED_G();break;
                default: break;
        }
}

作者: 修羅_戰(zhàn)    時間: 2022-6-7 18:05
前面的case 0 - case 7 都能正常,但是到了case 8 之后就不行了。按鍵按好多次才能跳出去。就是呼吸燈的子程序都不能用按鍵切換模式
作者: 17337161031    時間: 2022-6-7 22:04
當(dāng)達到最后一次的時候,如果程序在執(zhí)行當(dāng)前程序,按鍵無法被檢測到,建議使用外部中斷控制按鍵,會十分靈敏。
作者: wjsbmw    時間: 2022-6-7 23:14
void DelayXms(unsigned int xms) 函數(shù)里面定義的變量 unsigned i,j; 是錯誤的,正確的是unsigned int i,j;
作者: lkc8210    時間: 2022-6-7 23:27
LED_R();和LED_G();的寫法令mode在有按鍵按下時不能立刻更新
只有按著按鍵直到LED_R();和LED_G();運行完才能更新mode

改成這樣試試
  1. void LED_R()                         //LED呼吸
  2. {
  3.         static int i=1;
  4.                 static bit swap=1;
  5.         if(swap)
  6.         {
  7.                 P1=0x00;//由暗變亮
  8.                 Delayus(i);
  9.                 P1=0x01;
  10.                 Delayus(300-i);
  11.         }else
  12.         {
  13.                 P1=0x01;//由亮變暗
  14.                 Delayus(i);
  15.                 P1=0x00;
  16.                 Delayus(300-i);
  17.         }  
  18.                 if(i++>300){
  19.                         i = 1;
  20.                         swap = !swap;
  21.                 }                       
  22. }
復(fù)制代碼




作者: 188610329    時間: 2022-6-8 01:59
void Delayus(int us)                //10us
{
        unsigned char i;
        while(us)
        {
                i = 2;
                while (--i);
                us--;
             if(!key)  break;

        }
}

void LED_R()                         //LED呼吸
{
        int i;
        
        for(i=1;i<300;i++)//由暗變亮
        {
                P1=0x00;
                Delayus(i);              if(!key)  break;

                P1=0x01;
                Delayus(300-i);
              if(!key)  break;
        }
        for(i=1;i<300;i++)//由亮變暗
        {
                P1=0x01;
                Delayus(i);
             if(!key)  break;
                P1=0x00;
                Delayus(300-i);
             if(!key)  break;
        }        
}



作者: 修羅_戰(zhàn)    時間: 2022-6-8 09:07
188610329 發(fā)表于 2022-6-8 01:59
void Delayus(int us)                //10us
{
        unsigned char i;

謝謝大佬指點
作者: 修羅_戰(zhàn)    時間: 2022-6-8 09:07
lkc8210 發(fā)表于 2022-6-7 23:27
LED_R();和LED_G();的寫法令mode在有按鍵按下時不能立刻更新
只有按著按鍵直到LED_R();和LED_G();運行完才 ...

謝謝大佬指點

作者: w645053932    時間: 2025-1-20 10:44
17337161031 發(fā)表于 2022-6-7 22:04
當(dāng)達到最后一次的時候,如果程序在執(zhí)行當(dāng)前程序,按鍵無法被檢測到,建議使用外部中斷控制按鍵,會十分靈敏 ...

有道理
作者: xiaobendan001    時間: 2025-1-20 13:21
阻塞延時的弊端




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1