和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~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(0));
總結
以上是生活随笔為你收集整理的和12岁小同志搞创客开发:手撕代码,做一款数字骰子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 和12岁小同志搞创客开发:手撕代码,做一
- 下一篇: 和12岁小同志搞创客开发:手撕代码,做一