找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2066|回復(fù): 9
收起左側(cè)

C語言程序case跑到8之后按鍵就跳不出去了?

[復(fù)制鏈接]
ID:899076 發(fā)表于 2022-6-7 18:03 | 顯示全部樓層 |閱讀模式
麻煩各位大佬幫忙看下哪里有問題,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;
        }
}
回復(fù)

使用道具 舉報

ID:899076 發(fā)表于 2022-6-7 18:05 | 顯示全部樓層
前面的case 0 - case 7 都能正常,但是到了case 8 之后就不行了。按鍵按好多次才能跳出去。就是呼吸燈的子程序都不能用按鍵切換模式
回復(fù)

使用道具 舉報

ID:329625 發(fā)表于 2022-6-7 22:04 | 顯示全部樓層
當(dāng)達到最后一次的時候,如果程序在執(zhí)行當(dāng)前程序,按鍵無法被檢測到,建議使用外部中斷控制按鍵,會十分靈敏。
回復(fù)

使用道具 舉報

ID:25696 發(fā)表于 2022-6-7 23:14 | 顯示全部樓層
void DelayXms(unsigned int xms) 函數(shù)里面定義的變量 unsigned i,j; 是錯誤的,正確的是unsigned int i,j;
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 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ù)制代碼



回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 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;
        }        
}


回復(fù)

使用道具 舉報

ID:899076 發(fā)表于 2022-6-8 09:07 | 顯示全部樓層
188610329 發(fā)表于 2022-6-8 01:59
void Delayus(int us)                //10us
{
        unsigned char i;

謝謝大佬指點
回復(fù)

使用道具 舉報

ID:899076 發(fā)表于 2022-6-8 09:07 | 顯示全部樓層
lkc8210 發(fā)表于 2022-6-7 23:27
LED_R();和LED_G();的寫法令mode在有按鍵按下時不能立刻更新
只有按著按鍵直到LED_R();和LED_G();運行完才 ...

謝謝大佬指點
回復(fù)

使用道具 舉報

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

有道理
回復(fù)

使用道具 舉報

ID:1109793 發(fā)表于 2025-1-20 13:21 | 顯示全部樓層
阻塞延時的弊端
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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