机缘巧合在网上认识一位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)
注意:
- dataPin和clockPin要setup()的pinMode()中,设置为OUTPUT。
- 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(O));