本节,我们学习一下内容
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下降中断