写点什么

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

  • 2021 年 12 月 15 日
  • 本文字数:1556 字

    阅读完需:约 5 分钟

和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~9byte 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));
复制代码


发布于: 3 小时前阅读数: 4
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入

【公众号】美男子玩编程,关注获取海量资源~

评论

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