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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1957|回復: 9
收起左側

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

[復制鏈接]
ID:899076 發表于 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)                 //延遲函數
{
        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;          //上電默認所有的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;
        }
}
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:161164 發表于 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. }
復制代碼



回復

使用道具 舉報

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


回復

使用道具 舉報

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

謝謝大佬指點
回復

使用道具 舉報

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

謝謝大佬指點
回復

使用道具 舉報

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

有道理
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产午夜精品久久久久免费视高清 | 欧美日韩在线国产 | 国产aⅴ | 一区二区在线看 | 亚洲成人av在线播放 | 中文字幕乱码一区二区三区 | 久久国产激情视频 | 日韩在线一区二区 | 国产91精品久久久久久久网曝门 | 欧美在线国产精品 | 性一交一乱一伦视频免费观看 | 国产黑丝av | 不卡欧美 | 9191在线观看 | 99看片网 | 日韩二三区 | 91色站| 最新中文字幕在线 | 亚洲一区中文字幕 | 欧美精品在欧美一区二区少妇 | 欧美精品一区二区在线观看 | 国产精品久久久乱弄 | 高清av电影 | 国产福利91精品 | 国产精品久久久乱弄 | 欧美视频日韩 | 中文字幕99 | 欧美日韩国产一区二区三区不卡 | 精品96久久久久久中文字幕无 | 久久精品国产一区 | 欧美亚洲国语精品一区二区 | 国产精品成人国产乱一区 | 精品99爱视频在线观看 | 久久久www成人免费精品 | 国产福利在线看 | 久久国产婷婷国产香蕉 | 欧美精品综合在线 | 日韩精品亚洲专区在线观看 | 91精品国产综合久久久久 | 免费一级欧美在线观看视频 | 国产伊人久久久 |