和12岁小同志搞创客开发:手撕代码,做一款数字骰子

Posted 不脱发的程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了和12岁小同志搞创客开发:手撕代码,做一款数字骰子相关的知识,希望对你有一定的参考价值。

机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧。

项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html 


小时候都玩过飞行棋吧,是不是特别喜欢掷骰子,今天就要通过Arduino来做个数字骰子。

如何实现数字骰子效果呢?其实就是使用8段LED数码段。

前景回顾:和12岁小同志搞创客开发:如何驱动LED数码管?

另外还将用到一个新模块:Shiftout模块。

Shiftout模块就是一块74HC595串行输入串行或并行输出的移位寄存器芯片。如果要看懂代码,那就需要对74HC595芯片的工作原理有个简单认识。

74HC595实现了串行输入转并行输出的功能。先说下什么是串行与并行。下图可以简单看出串行与并行的区别。串行是一个一个数往发,而并行是8位数一道往外发的。

74HC595可以将串行进来的数据处理,让它并行输出。这样的好处是,比如在我们要用到多个LED,而数字引脚又不够用的时候,用一个74HC595,就可以同时控制多个LED了。

 一个74HC595芯片输出正好也是8位,所以可以用74HC595的输出正好可以控制一个8段LED数码管。

74HC595起到的作用就是能够通过一个数据口并行输出8位,,不会让LED占用8个数字引脚,当然如果你想接8个数字口也是没有问题的,只是占用的引脚会多一点而已。

那具体如何发数据,发什么数据?就是由data,latch,clock这三个引脚决定的。


项目连线效果如下所示:

 实现代码如下所示:

int latchPin = 8;  //数字口8连接到74HC595芯片的使能引脚
int clockPin = 3;  //数字口3连接到74HC595芯片的时钟引脚
int dataPin = 9;   //数字口9连接到74HC595芯片的数据引脚
int buttonPin = 2; // 按钮连接到数字口2 

//代表数字0~9
byte Tab[]=
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;

int number;
long randNumber;
void setup() 
    pinMode(latchPin, OUTPUT);
    pinMode(dataPin, OUTPUT);  
    pinMode(clockPin, OUTPUT);
    randomSeed(analogRead(0));   //设置一个随机数产生源模拟口0


void loop()
    randNumber = random(10);   //产生0~9之间的随机数
    showNumber(randNumber);    //显示该随机数

    //一旦有按键按下,显示该数,并保持到松开为止
    while(digitalRead(buttonPin) == HIGH)  
       delay(100);
     


//该函数用于数码管显示
void showNumber(int number)
     digitalWrite(latchPin, LOW);
     shiftOut(dataPin, clockPin, MSBFIRST, Tab[number]);
     digitalWrite(latchPin, HIGH);
     delay(80);

下面就来说下shiftOut()函数怎样用?

shiftOut函数格式:

shiftOut(dataPin,clockPin,bitOrder, value)

  • dataPin:输出每一位数据的引脚(int)
  • clockPin:时钟引脚,当dataPin有值时此引脚电平变化(int)
  • bitOrder:输出位的顺序,最高位优先(MSBFIRST)或最低位优先(LSBFIRST)
  • value:要移位输出的数据(byte)

注意:

  1. dataPin和clockPin要setup()的pinMode()中,设置为OUTPUT。
  2. shiftOut目前只能输出1个字节(8位),所以如果输出值大于255需要分两步。

代码中,我们可以看出输出位的顺序是最高位优先的,Tab[number]就是输出的数据。

shiftOut(dataPin, clockPin, MSBFIRST, Tab[number]);

那我们看下Tab[number]里面是些什么?

//代表数字0~9
byte Tab[]=
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;

这些在: 前景回顾:和12岁小同志搞创客开发:如何驱动LED数码管?中就讲到,是数码管的组成原理,这里不再赘述。

既然需要做数字骰子,还有一个重要的一步,如何随机产生0~9之间的数字呢? Arduino提供了个好用的函数random()。

random (max)

random ()可生成随机数,生成[0, max-1]范围内的随机数,max是最大值。

random(10);//生成0~9之间的数

randomSeed()函数是用来设置随机种子的,我们这里就接到了模拟口0。

randomSeed(analogRead(0));

以上是关于和12岁小同志搞创客开发:手撕代码,做一款数字骰子的主要内容,如果未能解决你的问题,请参考以下文章

和12岁小同志搞创客开发:手撕代码,做一款数字骰子

和12岁小同志搞创客开发:手撕代码,做一款声控灯

和12岁小同志搞创客开发:手撕代码,做一款声控灯

和12岁小同志搞创客开发:手撕代码,做一款声控灯

和12岁小同志搞创客开发:手撕代码,做一款遥控灯

和12岁小同志搞创客开发:手撕代码,做一款遥控灯