2014年7月5日 星期六

Arduino七段顯示器Library


七段顯示器常應用於很多電路,但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;
}