和12岁小同志搞创客开发:手撕代码,做一款数字骰子
機(jī)緣巧合在網(wǎng)上認(rèn)識(shí)一位12歲小同志,從零開始系統(tǒng)輔導(dǎo)其創(chuàng)客開發(fā)思維和技巧。
項(xiàng)目專欄:https://blog.csdn.net/m0_38106923/category_11097422.html?
小時(shí)候都玩過飛行棋吧,是不是特別喜歡擲骰子,今天就要通過Arduino來做個(gè)數(shù)字骰子。
如何實(shí)現(xiàn)數(shù)字骰子效果呢?其實(shí)就是使用8段LED數(shù)碼段。
前景回顧:和12歲小同志搞創(chuàng)客開發(fā):如何驅(qū)動(dòng)LED數(shù)碼管?
另外還將用到一個(gè)新模塊:Shiftout模塊。
Shiftout模塊就是一塊74HC595串行輸入串行或并行輸出的移位寄存器芯片。如果要看懂代碼,那就需要對(duì)74HC595芯片的工作原理有個(gè)簡單認(rèn)識(shí)。
74HC595實(shí)現(xiàn)了串行輸入轉(zhuǎn)并行輸出的功能。先說下什么是串行與并行。下圖可以簡單看出串行與并行的區(qū)別。串行是一個(gè)一個(gè)數(shù)往發(fā),而并行是8位數(shù)一道往外發(fā)的。
74HC595可以將串行進(jìn)來的數(shù)據(jù)處理,讓它并行輸出。這樣的好處是,比如在我們要用到多個(gè)LED,而數(shù)字引腳又不夠用的時(shí)候,用一個(gè)74HC595,就可以同時(shí)控制多個(gè)LED了。
?一個(gè)74HC595芯片輸出正好也是8位,所以可以用74HC595的輸出正好可以控制一個(gè)8段LED數(shù)碼管。
74HC595起到的作用就是能夠通過一個(gè)數(shù)據(jù)口并行輸出8位,,不會(huì)讓LED占用8個(gè)數(shù)字引腳,當(dāng)然如果你想接8個(gè)數(shù)字口也是沒有問題的,只是占用的引腳會(huì)多一點(diǎn)而已。
那具體如何發(fā)數(shù)據(jù),發(fā)什么數(shù)據(jù)?就是由data,latch,clock這三個(gè)引腳決定的。
項(xiàng)目連線效果如下所示:
?實(shí)現(xiàn)代碼如下所示:
int latchPin = 8; //數(shù)字口8連接到74HC595芯片的使能引腳
int clockPin = 3; //數(shù)字口3連接到74HC595芯片的時(shí)鐘引腳
int dataPin = 9; //數(shù)字口9連接到74HC595芯片的數(shù)據(jù)引腳
int buttonPin = 2; // 按鈕連接到數(shù)字口2 //代表數(shù)字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)); //設(shè)置一個(gè)隨機(jī)數(shù)產(chǎn)生源模擬口0
}void loop(){randNumber = random(10); //產(chǎn)生0~9之間的隨機(jī)數(shù)showNumber(randNumber); //顯示該隨機(jī)數(shù)//一旦有按鍵按下,顯示該數(shù),并保持到松開為止while(digitalRead(buttonPin) == HIGH){ delay(100);}
}//該函數(shù)用于數(shù)碼管顯示
void showNumber(int number){digitalWrite(latchPin, LOW);shiftOut(dataPin, clockPin, MSBFIRST, Tab[number]);digitalWrite(latchPin, HIGH);delay(80);
}
下面就來說下shiftOut()函數(shù)怎樣用?
shiftOut函數(shù)格式:
shiftOut(dataPin,clockPin,bitOrder, value)
- dataPin:輸出每一位數(shù)據(jù)的引腳(int)
- clockPin:時(shí)鐘引腳,當(dāng)dataPin有值時(shí)此引腳電平變化(int)
- bitOrder:輸出位的順序,最高位優(yōu)先(MSBFIRST)或最低位優(yōu)先(LSBFIRST)
- value:要移位輸出的數(shù)據(jù)(byte)
注意:
- dataPin和clockPin要setup()的pinMode()中,設(shè)置為OUTPUT。
- shiftOut目前只能輸出1個(gè)字節(jié)(8位),所以如果輸出值大于255需要分兩步。
代碼中,我們可以看出輸出位的順序是最高位優(yōu)先的,Tab[number]就是輸出的數(shù)據(jù)。
shiftOut(dataPin, clockPin, MSBFIRST, Tab[number]);
那我們看下Tab[number]里面是些什么?
//代表數(shù)字0~9
byte Tab[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
這些在:?前景回顧:和12歲小同志搞創(chuàng)客開發(fā):如何驅(qū)動(dòng)LED數(shù)碼管?中就講到,是數(shù)碼管的組成原理,這里不再贅述。
既然需要做數(shù)字骰子,還有一個(gè)重要的一步,如何隨機(jī)產(chǎn)生0~9之間的數(shù)字呢? Arduino提供了個(gè)好用的函數(shù)random()。
random (max)
random ()可生成隨機(jī)數(shù),生成[0, max-1]范圍內(nèi)的隨機(jī)數(shù),max是最大值。
random(10);//生成0~9之間的數(shù)
randomSeed()函數(shù)是用來設(shè)置隨機(jī)種子的,我們這里就接到了模擬口0。
randomSeed(analogRead(0));
總結(jié)
以上是生活随笔為你收集整理的和12岁小同志搞创客开发:手撕代码,做一款数字骰子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 和12岁小同志搞创客开发:手撕代码,做一
- 下一篇: 和12岁小同志搞创客开发:手撕代码,做一