为什么这样判断不生效?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2636|回复: 3

[已解决] 为什么这样判断不生效?

[复制链接]
发表于 2021-4-6 11:11 | 显示全部楼层 |阅读模式
本帖最后由 dpxiachixx 于 2021-4-8 15:09 编辑

问题已解决,谢谢各位大佬!!!


方案1:按下开关,一位数码管从0数到9方案2:按下开关不松手时,1位数码管从0数到9,如果松手就停下

目前,方案2拆了10个if,但是运行效果和方案1一模一样毫无差别。。。
为什么方案2,我松手后不会停下??????10个if,全都读到了HIGH???


方案1的代码:

//  自定义清除数字的函数
void OffLed()
{
    for (int i = 1; i <= 7; i++)
    {
        digitalWrite(i, HIGH);
    }
}
// 自定义展示数字的函数
void ShowLed(int a, int b, int c, int d, int e, int f, int g)
{
    //  接通电源
    digitalWrite(12, HIGH);
    //  展示数字0.5秒
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    delay(500);
    //  清除数字0.5秒
    OffLed();
    delay(500);
}

void setup()
{
    //  初始化电源IO
    pinMode(12, OUTPUT);
    //  初始化判断IO
    pinMode(10, INPUT_PULLUP);
    //  初始化控制IO(一次7个)
    for (int i = 1; i <= 7; i++)
    {
        pinMode(i, OUTPUT);
    }
}

void loop()
{
    //  读取开关状态
    int BTN = digitalRead(10);

    //  如果开关按下,则运行我定义的函数
    if (BTN == LOW)
    {
        OffLed();                     //  清除屏幕
        ShowLed(1, 2, 3, 4, 5, 6, 0); //  显示数字0
        ShowLed(0, 2, 3, 0, 0, 0, 0); //  显示数字1
        ShowLed(1, 2, 0, 4, 5, 0, 7); //  显示数字2
        ShowLed(1, 2, 3, 4, 0, 0, 7); //  显示数字3
        ShowLed(0, 2, 3, 0, 0, 6, 7); //  显示数字4
        ShowLed(1, 0, 3, 4, 6, 0, 7); //  显示数字5
        ShowLed(1, 0, 3, 4, 5, 6, 7); //  显示数字6
        ShowLed(1, 2, 3, 0, 0, 0, 0); //  显示数字7
        ShowLed(1, 2, 3, 4, 5, 6, 7); //  显示数字8
        ShowLed(1, 2, 3, 4, 0, 6, 7); //  显示数字9
    }
}



方案2的代码:

//  自定义清除数字的函数
void OffLed()
{
    for (int i = 1; i <= 7; i++)
    {
        digitalWrite(i, HIGH);
    }
}
// 自定义展示数字的函数
void ShowLed(int a, int b, int c, int d, int e, int f, int g)
{
    //  接通电源
    digitalWrite(12, HIGH);
    //  展示数字0.5秒
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    delay(500);
    //  清除数字0.5秒
    OffLed();
    delay(500);
}

void setup()
{
    //  初始化电源IO
    pinMode(12, OUTPUT);
    //  初始化判断IO
    pinMode(10, INPUT_PULLUP);
    //  初始化控制IO(一次7个)
    for (int i = 1; i <= 7; i++)
    {
        pinMode(i, OUTPUT);
    }
    Serial.begin(9600);
}

void loop()
{  
    OffLed();                  //  清除屏幕
    int BTN = digitalRead(10); //  读取开关状态
    Serial.println(BTN);

    if (BTN == LOW)            //  如果开关按下,显示数字0
    {
        ShowLed(1, 2, 3, 4, 5, 6, 0);
    }

    if (BTN == LOW)        //  如果开关按下,显示数字1
    {
        ShowLed(0, 2, 3, 0, 0, 0, 0);
    }


    if (BTN == LOW)        //  如果开关按下,显示数字2
    {
        ShowLed(1, 2, 0, 4, 5, 0, 7);
    }

    if (BTN == LOW)        //  如果开关按下,显示数字3
    {
        ShowLed(1, 2, 3, 4, 0, 0, 7);
    }

    if (BTN == LOW)        //  如果开关按下,显示数字4
    {
        ShowLed(0, 2, 3, 0, 0, 6, 7);
    }

    if (BTN == LOW)        //  如果开关按下,显示数字5
    {
        ShowLed(1, 0, 3, 4, 6, 0, 7);
    }

    if (BTN == LOW)        //  如果开关按下,显示数字6
    {
        ShowLed(1, 0, 3, 4, 5, 6, 7);
    }

    if (BTN == LOW)        //  如果开关按下,显示数字7
    {
        ShowLed(1, 2, 3, 0, 0, 0, 0);
    }

    if (BTN == LOW)        //  如果开关按下,显示数字8
    {
        ShowLed(1, 2, 3, 4, 5, 6, 7);
    }

    if (BTN == LOW)        //  如果开关按下,显示数字9
    {
        ShowLed(1, 2, 3, 4, 0, 6, 7);
    }
}


发表于 2021-4-6 16:04 | 显示全部楼层
因为BTN值只在循环开始才会变化.需要修改程序.
发表于 2021-4-7 01:09 | 显示全部楼层
因為你只在一開始讀取了一次 BTN
int BTN = digitalRead(10); //  讀取開關狀態

然後後面所有的 if 都會根據一開始
讀到的 BTN 值進行判定執行,當然
有放開就跟沒放開一樣

你的程式只能做方案 1 的工作(按一下由0→9),
若要按住不放由0→9、中間放開就停住,
你的程式要先判斷按鈕是短按或長按,
再依短按(以現有程式精簡)/長按(另增程式)
進行處理

发表于 2021-4-7 14:29 | 显示全部楼层
判断是否按下的位置错了,方案二里你每次判断是否按下都用的是之前判断的结果,结果没有更新,自然都是一样的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 09:49 , Processed in 0.083231 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表