七段顯示器常應用於很多電路,但Arduino IDE並未提供該Library,為了便利程式使用做成Library,將2個檔案複製到IDE的libraries\SegmentLED目錄下並重啟IDE即可使用。
SegmentLED程式碼
#ifndef __SegmentLED_H__
#define __SegmentLED_H__
#if ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
// Seven Segment LED Pinout
// 10 9 8 7 6
//
// aaaaaaa
// ff bb
// ff bb
// ggggggg
// ee cc
// ee cc
// ddddddd
//
// 1 2 3 4 5
//
// Seven Segment LED Pin To Segment
// 1 -> e Seg
// 2 -> d Seg
// 3 -> common
// 4 -> c Seg
// 5 -> dp
// 6 -> b Seg
// 7 -> a Seg
// 8 -> common
// 9 -> f Seg
// 10 -> g Seg
#define MAX_SEGCNT 20
class SegmentLED
{
public:
// SegPin對應LED a,b,c,d,e,f,g,dp共8個Segment
SegmentLED( byte* SegPin, byte SegCnt);
// 顯示數值數字
void write( byte Digit, bool dp=false);
// 顯示數字及部分英文特殊字元
void print( char Char, bool dp=false);
private:
byte m_SegPin[MAX_SEGCNT];
void display( byte* SegLED, byte SegCnt, bool SegDp=false);
};
#endif // __SegmentLED_H__
// cpp Files
#include <SegmentLED.h>
// 英文字母
byte SevenSegAsciis[26][7] =
{
{ 1,1,1,0,1,1,1 } // = 'a'
{ 0,0,1,1,1,1,1 } // = 'b'
{ 1,0,0,1,1,1,0 } // = 'c'
{ 0,1,1,1,1,0,1 } // = 'd'
{ 1,0,0,1,1,1,1 } // = 'e'
{ 1,0,0,0,1,1,1 } // = 'f'
{ 0,0,0,0,0,0,1 } // = 'g'
{ 0,0,0,0,0,0,1 } // = 'h'
{ 0,0,0,0,0,0,1 } // = 'i'
{ 0,0,0,0,0,0,1 } // = 'j'
{ 0,0,0,0,0,0,1 } // = 'k'
{ 0,0,0,0,0,0,1 } // = 'l'
{ 0,0,0,0,0,0,1 } // = 'm'
{ 0,0,0,0,0,0,1 } // = 'n'
{ 0,0,1,1,1,0,1 } // = 'o'
{ 1,1,0,0,1,1,1 } // = 'p'
{ 0,0,0,0,0,0,1 } // = 'q'
{ 0,0,0,0,1,1,1 } // = 'r'
{ 0,0,0,0,0,0,1 } // = 's'
{ 0,0,0,1,1,1,1 } // = 't'
{ 0,0,0,0,0,0,1 } // = 'u'
{ 0,0,0,0,0,0,1 } // = 'v'
{ 0,0,0,0,0,0,1 } // = 'w'
{ 0,0,0,0,0,0,1 } // = 'x'
{ 0,0,0,0,0,0,1 } // = 'y'
{ 0,0,0,0,0,0,1 } // = 'z'
};
// 阿拉伯數字
byte SevenSegDigits[10][7] =
{
{ 1,1,1,1,1,1,0 }, // = 0
{ 0,1,1,0,0,0,0 }, // = 1
{ 1,1,0,1,1,0,1 }, // = 2
{ 1,1,1,1,0,0,1 }, // = 3
{ 0,1,1,0,0,1,1 }, // = 4
{ 1,0,1,1,0,1,1 }, // = 5
{ 1,0,1,1,1,1,1 }, // = 6
{ 1,1,1,0,0,0,0 }, // = 7
{ 1,1,1,1,1,1,1 }, // = 8
{ 1,1,1,0,0,1,1 } // = 9
};
// 特殊字元符號
byte SevenSegSymbols[1][7] =
{
{ 0,0,0,0,0,0,1 } // = '-'
};
SegmentLED::SegmentLED( byte* SegPin, byte SegCnt)
{
// 指定Pin設定為輸出模式
for (byte i = 0; i < SegCnt && i < MAX_SEGCNT; i++)
{
m_SegPin[i] = SegPin[i];
pinMode(SegPin[i], OUTPUT);
}
}
// 顯示數值數字
void SegmentLED::write( byte Digit, bool dp)
{
// 阿拉伯數字
if (Digit < 10)
display( SevenSegDigits[Digit], 7, dp);
}
// 顯示數字及部分英文特殊字元
void SegmentLED::print( char Char, bool dp)
{
// 阿拉伯數字
if (Char >= '0' && Char <= '9')
display( SevenSegDigits[Char - '0'], 7, dp);
// 大寫英文字母
else if (Char >= 'A' && Char <= 'Z' )
display( SevenSegAsciis[Char - 'A'], 7, dp);
// 小寫英文字母
else if (Char >= 'a' && Char <= 'z' )
display( SevenSegAsciis[Char - 'a'], 7, dp);
// 特殊字元符號
else if (Char == '-')
display( SevenSegSymbols[0], 7, dp);
}
void SegmentLED::display( byte* SegLED, byte SegCnt, bool SegDp)
{
// 開關7段顯示器
for (byte SegPos = 0; SegPos < SegCnt; SegPos++)
{
digitalWrite(m_SegPin[SegPos], SegLED[SegPos]);
}
// 開關小數點
if (SegDp)
digitalWrite(m_SegPin[7], 1);
else
digitalWrite(m_SegPin[7], 0);
}
應用於UNO實驗板範例程式
#include <SegmentLED.h>
// 七段顯示器a,b,c,d,e,f,g分別對應實驗板第2~9 PIN
byte SegLEDPin[] = {2, 3, 4, 5, 6, 7, 8, 9};
SegmentLED SegLED( SegLEDPin, sizeof(SegLEDPin));
byte Count = 0;
void setup()
{
// 顯示橫線
SegLED.print('-');
delay(1000);
// 顯示英文字母A
SegLED.print('a');
}
void loop()
{
delay(1000);
// 顯示阿拉伯數字
SegLED.write(Count);
Count = Count % 10;
}

