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

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

项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html
小时候都玩过飞行棋吧,是不是特别喜欢掷骰子,今天就要通过 Arduino 来做个数字骰子。
如何实现数字骰子效果呢?其实就是使用 8 段 LED 数码段。
另外还将用到一个新模块:Shiftout 模块。

Shiftout 模块就是一块 74HC595 串行输入串行或并行输出的移位寄存器芯片。如果要看懂代码,那就需要对 74HC595 芯片的工作原理有个简单认识。
74HC595 实现了串行输入转并行输出的功能。先说下什么是串行与并行。下图可以简单看出串行与并行的区别。串行是一个一个数往发,而并行是 8 位数一道往外发的。

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

一个 74HC595 芯片输出正好也是 8 位,所以可以用 74HC595 的输出正好可以控制一个 8 段 LED 数码管。
74HC595 起到的作用就是能够通过一个数据口并行输出 8 位,,不会让 LED 占用 8 个数字引脚,当然如果你想接 8 个数字口也是没有问题的,只是占用的引脚会多一点而已。
那具体如何发数据,发什么数据?就是由 data,latch,clock 这三个引脚决定的。

项目连线效果如下所示:

实现代码如下所示:
下面就来说下 shiftOut()函数怎样用?
shiftOut 函数格式:
shiftOut(dataPin,clockPin,bitOrder, value)
dataPin:输出每一位数据的引脚(int)
clockPin:时钟引脚,当 dataPin 有值时此引脚电平变化(int)
bitOrder:输出位的顺序,最高位优先(MSBFIRST)或最低位优先(LSBFIRST)
value:要移位输出的数据(byte)
注意:
dataPin 和 clockPin 要 setup()的 pinMode()中,设置为 OUTPUT。
shiftOut 目前只能输出 1 个字节(8 位),所以如果输出值大于 255 需要分两步。
代码中,我们可以看出输出位的顺序是最高位优先的,Tab[number]就是输出的数据。
那我们看下 Tab[number]里面是些什么?
这些在: 前景回顾:和12岁小同志搞创客开发:如何驱动LED数码管?中就讲到,是数码管的组成原理,这里不再赘述。

既然需要做数字骰子,还有一个重要的一步,如何随机产生 0~9 之间的数字呢? Arduino 提供了个好用的函数 random()。
random ()可生成随机数,生成[0, max-1]范围内的随机数,max 是最大值。
randomSeed()函数是用来设置随机种子的,我们这里就接到了模拟口 0。
版权声明: 本文为 InfoQ 作者【不脱发的程序猿】的原创文章。
原文链接:【http://xie.infoq.cn/article/9e9ff82a37f85446b2a073d8f】。文章转载请联系作者。
评论