Arduino(三)——按钮控制数码管

本节,我们学习一下内容

1.用按键控制数码管从1~9显示,然后再清零

2.外部中断函数

1.我们先来看下面的图

 我们需要根据我们按键是否连通来连接我们的电路,所以我们连接好后就会是这样的

看完了连接图,接下来就要看我们的任务了,也就是让数码管从1~9显示然后清0,这里我们因为技术受限,所以我们用   else if   来写

int flag = 1;
int table[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
void abc( int data)// 数字段码
{
  int value = table[data];
  for ( int i = 3 ; i <= 9 ; i++)
  {
    digitalWrite(i, value & 0x01);
    value >>= 1;
  }
  delay(500);
}

void setup() {
  pinMode(2, INPUT_PULLUP);

  for (int i = 3 ; i <= 9 ; i++)
  {
    pinMode(i, OUTPUT);
  }
}

void loop() {

  if ( 0 == digitalRead(2))
  {
    delay(80);
    if (0 == digitalRead(2))
    {
again:
      if (flag == 1)
      {
        abc(1); flag = 2;
      }
      else if (flag == 2)
      {
        abc(2); flag = 3;
      }
      else if (flag == 3)
      {
        abc(3); flag = 4;
      }
      else if (flag == 4)
      {
        abc(4); flag = 5;
      }
      else if (flag == 5)
      {
        abc(5); flag = 6;
      }
      else if (flag == 6)
      {
        abc(6); flag = 7;
      }
      else if (flag == 7)
      {
        abc(7); flag = 8;
      }
      else if (flag == 8)
      {
        abc(8); flag = 9;
      }
      else if (flag == 9)
      {
        abc(9); flag = 0;
      }
      else if (flag == 0)
      {
        abc(0); flag = 1;
      }
      else if (flag == 1)
      {
        goto again;
      }



    }
  }
}

接下来我们对这个代码进行分析:

上半部分详见  Arduino(二),

我们从  setup  开始,我们注意到我们写了个非常特殊的形式 INPUT_PULLUP , 这是我们给 pin2 的一个属性,让他处于 输入上拉 的状态

再接着我们来看 loop 部分, if ( 0 == digitalRead(2)  是我们对按键的状态进行判断,digitalRead 就是一个读取状态的函数,我们读取pin2,也就是我们按键的状态,当我们的按键按下后,我们的状态会处于低电平状态,也就是 0;我们为什么在后面补上一个  delay(80)  呢?这是为了防止 机械振动,在我们的按键内部,当我们按了一次之后,他还会自己进行多次的震动,为了消除这个震动,我们用了一个delay延迟函数(参见Arduino(二)),让他不会那么敏感。 但是我们在后面又补上了 if ( 0 == digitalRead(2) 但这个条件只是为了确定我们是否按下按键。

接下来就到了我们的操作部分了,在这里我们用了 else if 条件从句(详细参见分支循环语句的具体学习(一));我们定义一个新的变量flag,我们用他来记录我们的状态(我们在这里也可以用flag ++来代替,减低我们的复杂程度),我们 flag 每一个对应的状态就会输入不同的数,所以我们在按下按钮后,他就会往下执行。

但是这样 一直else if 下去的话,我们的程序到0就中止了,我们该怎么让他继续下去呢?

因此我们补上了一个 goto 函数,我们执行完了之后,goto 函数 会让回到我们设置的 again那里,让我们的函数重新开始

2.外部中断函数

attachInterrupt(interrupt,function,mode) 外部中断只能用数字IO口 2 和 3,

interrupt  表示给中断口进行的 0 或 1;

function  表功能函数,在中断后,我们可以会跳到 我们写的function子函数进行中断处理服务

mode  表示中断模式 LOW低电平中断;CHANGE变化中断;RISNG上升中断;FALLNG下降中断

猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/121384812