前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >和12岁小同志搞创客开发:手撕代码,做一款数字骰子

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

作者头像
不脱发的程序猿
发布2021-12-15 08:20:00
2560
发布2021-12-15 08:20:00
举报

机缘巧合在网上认识一位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这三个引脚决定的。

项目连线效果如下所示:

实现代码如下所示:

代码语言:javascript
复制
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需要分两步。

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

代码语言:javascript
复制
shiftOut(dataPin, clockPin, MSBFIRST, Tab[number]);

那我们看下Tabnumber里面是些什么?

代码语言:javascript
复制
//代表数字0~9
byte Tab[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

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

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

代码语言:javascript
复制
random (max)

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

代码语言:javascript
复制
random(10);//生成0~9之间的数

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

代码语言:javascript
复制
randomSeed(analogRead(O));
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档