Arduino學習筆記01:四位數碼管的使用以及相關類庫的編寫

本小白遇到的問題:

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




以上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章