本小白遇到的問題:
Q1:四位數碼管怎麼接線
拆開包裝的一瞬間本小白驚呆了:MD居然有十二個引腳!!老子的OLED屏幕才4個引腳!!
經過一番簡單的搜索。本小白找到了這個:
怎麼說呢,不明覺厲吧,不過這種高深莫測的圖顯然不是我這種層次的人能夠揣測的,於是我繼續搜索,找到了這個:
如圖所示(圖片來自百度經驗):
從這張圖上,可以簡單看出四位數碼管的工作原理,四位數碼管一共8*4個發光二極管,包括四個數管,每個數管爲a,b,c,d,e,f,g,h八段(第八段爲數管左下角的小數點,圖中未畫出)。共12個引腳,其中4個引腳控制標號1234的四個數管是否發光,8個引腳控制abcdefgh八段LED燈是否發光。
那麼,怎麼用ARDUINO來控制呢?
事實上,數碼管分爲共陽數碼管和共陰數碼管。顧名思義,共陽即共陽極,共陰即共陰極。對於共陽數碼管,因爲陽極共用,因此各引腳實際上與陰極相連,因此需給予低電平方能觸發,共陰極引腳則相反。本小白採用的是共陽數碼管,因此後續均以共陽數碼管爲基礎討論。
數碼管的控制與LED燈的控制類似,比如給予引腳1和引腳a低電平,其餘引腳高電平,則1a處的數碼管被點亮。
接線也和LED燈類似,引腳1234直接與UNO的IO接口相連即可,控制LED的引腳abcdefgh則需串聯一220Ω的電阻。接線時,本小白採用的方案是:引腳a-h分別對應UNO的1-8,引腳1-4分別對於UNO的12-9(注意此處順序!)
最終接線圖:
(只需要知道接線異常麻煩即可,下邊是有源蜂鳴器,另有他用,可以忽略)
接好線以後,就可以開始愉快的玩耍了!
Q2:怎麼控制四個數管顯示不同的內容
玩耍過程中發現一個嚴肅的問題,按照數碼管的工作原理,四個數管顯示的內容始終相同啊。如果我想讓數碼管顯示“5678”,應該怎麼辦呢?
實驗表明,如果我讓數管1快速顯示“5”然後關閉,數管2快速顯示“6”然後關閉……
只要速度夠快,人眼看到的就是“5678”!
示例程序如圖所示(相關函數省略,簡介及功能在註釋裏面):
clearLEDs(); //此處爲將八個LED的引腳設爲高電平,用於防止重影
pickDigit(1); //此處爲將引腳1設爲低電平,其餘3引腳爲高電平
pickNumber(5); //此處爲控制八個LED使數碼管輸出爲“5”
delay(2);
clearLEDs();
pickDigit(2);
pickNumber(6);
delay(2);
clearLEDs();
pickDigit(3);
pickNumber(7);
delay(2);
clearLEDs();
pickDigit(4);
pickNumber(8);
delay(2);
這樣,就可以控制數碼管顯示四個不同內容了
類庫的建立:
庫函數包括六個:
void begin();
該函數用於引腳的初始化,由於某種特殊的原因(懶),此處要求引腳連接方式固定(見上文)
void pickNumber(int number);
該函數用於將8個LED發光樣式設定爲對應的數字(0~9);
void pickDigit(int digit);
該函數用於設定某一數管發光(低電平),其餘不發光(高電平)
void clearLEDs();
該函數用於清空數碼管(設置8個LED均爲高電平)
void printNumber(int n);
該函數用於顯示不帶小點的數字(0~9999)
void pointNumber(int n, boolean n1, boolean n2, boolean n3, boolean n4);
該函數用於輸出帶小點的數字(0~9999),後四個參數分別對應四個小點的發光狀態(1爲發光,0爲不發光),
如pointNumber(2134,0,1,1,0)的顯示結果爲21.3.4
下面爲h文件
#ifndef LED4_H
#define LED4_H
#include "Arduino.h"
class LED4 {
public:
void begin(); //用於引腳的初始化
void pickNumber(int number); //用於將8個LED發光樣式設定爲對應的數字(0~9)
void pickDigit(int digit); //用於設定某一數管發光(低電平),其餘不發光(高電平)
void clearLEDs(); //用於清空數碼管
void printNumber(int n); //用於顯示不帶小點的數字(0~9999)
void pointNumber(int n, boolean n1, boolean n2, boolean n3, boolean n4); //用於輸出帶小點的數字(0~9999),後四個參數分別對應四個小點的發光狀態(1爲發光,0爲不發光)
private:
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
int p = 8;
int d4 = 9;
int d3 = 10;
int d2 = 11;
int d1 = 12;
};
#endif
下面爲cpp文件:(懶得敲註釋了,不過應該比較易懂,見諒)
#include "Arduino.h"
#include "LED4.h"
void LED4::begin()
{
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(p, OUTPUT);
}
void LED4::clearLEDs()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(p, HIGH);
}
void LED4::pickDigit(int digit)
{
digitalWrite(d1, LOW);
digitalWrite(d2, LOW);
digitalWrite(d3, LOW);
digitalWrite(d4, LOW);
switch (digit)
{
case 1:
digitalWrite(d1, HIGH);
break;
case 2:
digitalWrite(d2, HIGH);
break;
case 3:
digitalWrite(d3, HIGH);
break;
default:
digitalWrite(d4, HIGH);
break;
}
}
void LED4::pickNumber(int number)
{
switch (number)
{
case 0:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
break;
case 1:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 2:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case 3:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
break;
case 4:
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 5:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 6:
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 7:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;
case 8:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
case 9:
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
break;
}
}
void LED4::printNumber(int n)
{
int i, j, k, l;
i = n / 1000;
j = (n % 1000) / 100;
k = (n % 100) / 10;
l = n % 10;
clearLEDs();
pickDigit(1);
pickNumber(i);
delay(2);
clearLEDs();
pickDigit(2);
pickNumber(j);
delay(2);
clearLEDs();
pickDigit(3);
pickNumber(k);
delay(2);
clearLEDs();
pickDigit(4);
pickNumber(l);
delay(2);
}
void LED4::pointNumber(int n, boolean n1, boolean n2, boolean n3, boolean n4)
{
int i, j, k, l;
i = n / 1000;
j = (n % 1000) / 100;
k = (n % 100) / 10;
l = n % 10;
clearLEDs();
pickDigit(1);
pickNumber(i);
if(n1)
digitalWrite(p, LOW);
delay(2);
clearLEDs();
pickDigit(2);
pickNumber(j);
if (n2)
digitalWrite(p, LOW);
delay(2);
clearLEDs();
pickDigit(3);
pickNumber(k);
if (n3)
digitalWrite(p, LOW);
delay(2);
clearLEDs();
pickDigit(4);
pickNumber(l);
if (n4)
digitalWrite(p, LOW);
delay(2);
}
keywords.txt文件省略
下面爲實例程序,用於番茄鍾
#include "LED4.h"
LED4 led4;
int i,j,k;
int worktime = 45; //番茄鍾工作時間
int resttime = 8; //番茄鍾休息時間
int nowtime = 0; //當前剩餘時間
void setup()
{
led4.begin();
pinMode(13,OUTPUT);
}
void loop()
{
start(worktime); //開始工作
FMtone(3000); //工作結束,蜂鳴器發聲提示
start(resttime); //開始休息
FMtone(1000); //休息結束,蜂鳴器發聲提示
}
/*用於蜂鳴器發聲*/
void FMtone(int t)
{
digitalWrite(13,HIGH);
delay(t);
digitalWrite(13,LOW);
}
/*用於開始時長爲t的倒計時*/
void start(int t)
{
for(k = 0;k < 125;k++) /*下面循環默認從XX:59開始,此語句用於修正爲從XX:00開始*/
led4.pointNumber(t * 100,0,1,0,0);
for(i = t - 1;i >= 0;i--) /*分鐘*/
{
for(j = 59;j >= 0;j--) /*秒*/
{
nowtime = i * 100 + j;
for(k = 0;k < 118;k++) /*庫中pointNumber函數包括4個delay(2),此處理應爲1000/8 = 125,但經實際修正,改爲118*/
{
led4.pointNumber(nowtime,0,1,0,0);
}
}
}
}
庫下載地址:
https://download.csdn.net/download/weixin_43771001/10963621
以上