七段顯示器常應用於很多電路,但Arduino IDE並未提供該Library,為了便利程式使用做成Library,將2個檔案複製到IDE的libraries\SegmentLED目錄下並重啟IDE即可使用。
SegmentLED程式碼
// Header Files #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; }