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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1919|回復: 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;
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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;
回復

使用道具 舉報

5#
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. }
復制代碼



回復

使用道具 舉報

6#
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;
        }        
}


回復

使用道具 舉報

7#
ID:899076 發表于 2022-6-8 09:07 | 只看該作者
188610329 發表于 2022-6-8 01:59
void Delayus(int us)                //10us
{
        unsigned char i;

謝謝大佬指點
回復

使用道具 舉報

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

謝謝大佬指點
回復

使用道具 舉報

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

有道理
回復

使用道具 舉報

10#
ID:1109793 發表于 2025-1-20 13:21 | 只看該作者
阻塞延時的弊端
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品18hdxxxⅹ在线 | 在线观看一区 | 91在线影院| 在线观看中文字幕一区二区 | 欧美一区二区三区在线观看 | 婷婷久久五月 | 成人三级影院 | 精品视频一区二区 | 亚洲精品一区二区三区四区高清 | www.99热.com| 欧美 中文字幕 | 一级黄色片在线免费观看 | 成人看片在线观看 | 日本一区二区三区四区 | 一级做a爰片久久毛片 | 日韩一区二区三区av | 91精品国产乱码久久久久久久久 | 精品国产一级 | 羞羞网站免费观看 | 一区二区三区在线播放 | 欧美成人精品欧美一级 | 日韩精品一区在线 | 亚洲小视频在线播放 | 亚洲成人久久久 | 日本在线免费看最新的电影 | 91av大全 | 亚洲国产中文字幕 | 999久久 | 亚洲精品一区二区三区蜜桃久 | 国产精品久久久久久久久久久久 | 成人国产精品 | 日韩欧美在线免费观看 | 成人二区 | 久久综合久久自在自线精品自 | 九九亚洲 | 国产高清久久 | 亚洲国产欧美在线人成 | 欧美激情精品久久久久 | 日韩中文字幕一区二区 | 高清色视频 | 在线观看毛片网站 |