查看: 288|回复: 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);
    }
}


签到天数: 60 天

[LV.6]常住居民II

发表于 2021-4-6 16:04 | 显示全部楼层
因为BTN值只在循环开始才会变化.需要修改程序.

签到天数: 60 天

[LV.6]常住居民II

发表于 2021-4-7 01:09 | 显示全部楼层
因為你只在一開始讀取了一次 BTN
int BTN = digitalRead(10); //  讀取開關狀態

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

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

该用户从未签到

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

本版积分规则

arduino程序设计基础 blinker物联网解决方案

热门推荐

基于麦克纳姆轮的PID实例学习--机甲大师PID控制
基于麦克纳姆轮的PID实例
一 认识pid 首先要了解PID算法是什么。网上很多帖子要么就是只有理论,要么就没讲清
OLED 128*64自制可达10000000个选项的菜单(已更新)
OLED 128*64自制可达10000
OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
有没有人遇到过"MQTT Ping!"进入500ms间隔发送,偶现自动复位...
有没有人遇到过"MQTT Ping
出现该情况后,我在5V与3.3V端都加了1000uf和104。之后用弱网络进行测试,在一定程度
HC05发送数据出错
HC05发送数据出错
HC05往手机发送数据会产生错乱和缺失?
arduinoT12焊台 控制器 炫酷UI
arduinoT12焊台 控制器 炫
*声明:本项目源于https://github.com/wagiminator/ATmega-Soldering-Station 采用CC3
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表