第 23 课 简单创作 - 数字骰子

介绍

在之前的实验中,我们学习了如何使用 7 段数码管并通过按键控制 LED。在本课中,我们将使用一个 7 段数码管和一个按键来创建一个简单的数字骰子。

所需器件

../_images/megac23.png

原理图

数字骰子背后的想法非常简单:一个 7 段数码管从 1 到 7 快速循环显示。当按下按键时,流动会减慢, 直到它停在一个数字上。当再次按下按键时,该过程将重复。

原理图如下所示:

../_images/image252.png

实验步骤

第 1 步:搭建电路。

../_images/image211.png ../_images/image253.png

第 2 步:打开代码文件 Lesson_23_Digital_Dice.ino

第 3 步:选择 开发板端口

第 4 步:点击 上传 按钮来上传代码。

你现在可以看到7 段数码管循环显示1~6。按下按键,显示速度会减慢,直到三秒后停止。再次按下按键,该过程将重复。

../_images/image254.jpeg

代码

代码分析

初始随机数来自A0

randomSeed(analogRead(0));

初始随机数是从 A0 生成的,随机数的范围是 0-1023。

数字骰子

void loop()
{
    int stat = digitalRead(keyIn);  //store value read from keyIn
    if(stat == HIGH)  // check if the pushbutton is pressed

如果是,相应的引脚为高电平。

{
    num ++; // num adds 1
    if(num > 1)
    {
        num = 0;
    }
}

如果 num > 1,则清除该值。这是为了防止重复按压。所以不管你按多少次都算一次。

Serial.println(num);  // print the num on serial monitor
if(num == 1)  //when pushbutton is pressed
{
    randNumber = random(1,7); //Generate a random number in 1-7
    showNum(randNumber);  //show the randNumber on 7-segment
    delay(1000);  //wait for 1 second
    while(!digitalRead(keyIn));  //When not press button,program stop here.

让它一直显示最后一个随机数。

int stat = digitalRead(keyIn);

再次读取按键的状态。

if(stat == HIGH) // check if the pushbutton is pressed

如果是,请运行下面的代码。

{
        num ++; // num+1=2
        digitalWrite(ledPin,HIGH); //turn on the led
        delay(100);
        digitalWrite(ledPin,LOW); //turn off the led
        delay(100);
        if(num >= 1) // clear the num
        {
            num = 0;
        }
    }
    }
    //show random numbers at 100 microseconds intervals
    //If the button has not been pressed
    randNumber = random(1,7);
    showNum(randNumber);
    delay(100);
}

showNum() 函数

void showNum(int num)
{
    digitalWrite(latchPin,LOW); //ground latchPin and hold low for transmitting
    shiftOut(dataPin,clockPin,MSBFIRST,datArray[num]);
    //return the latch pin high to signal chip that it
    //no longer needs to listen for information
    digitalWrite(latchPin,HIGH); //pull the latchPin to save the data
}

该功能是在7段数码管上显示 dataArray[] 中的数字。