搜尋此網誌

2015/06/14

串列式四位元七段顯示器

13-3-4 串列式四位元七段顯示器

IRA中級認證的動作要求中,除七段顯示器外,其餘循跡感測、馬達控制、障礙物偵測、蜂鳴器等週邊均在前面章節中介紹過,要完成任務路徑需求沒有問題,故本節先介紹這一顆內建PT6761串列控制晶片的七段顯示器TOFD-5465GGH-B。

一、 簡介

TOFD-5465GGH-B是一個內嵌PT6961 LED驅動IC的四位元七段顯示器,如圖 13‑17所示,此元件具有SPI介面,iPOE-A1可透過圖 13‑17(a)的DIN、CLK、CS腳位控制顯示內容,使用上非常方便。

image     image

(a)正面及腳位圖 (b)背面圖

13‑17 內嵌PT6961的四位元七段顯示器

二、 顯示

1. PT6961控制器使用顯示記憶體(RAM)來儲存微控制器傳送過來的數據,只要將想顯示的LED段儲存在RAM中,PT6961會處理其多工顯示的部分,其中由左至右四位數對應的RAM位址分別為0xC0(千位)、0xC2(百位)、0xC4(拾位)和0xC6(個位)。

2. 七段顯示器LED的各段名稱如圖 13‑18所示,欲顯示一般的數字碼所對應的顯示控制碼表 13‑6所示。

3. TOFD-5465GGH-B的小數點似乎沒有被連接到LED上,故無法顯示,能顯示的只有正中央的冒號部分,此部分由0xC0和0xC2的第7位元控制。

image

13‑18 七段顯示器的各段名稱

13‑6 共陰七段顯示器的顯示控制碼

image

三、 函式庫

1. 下載與安裝:PT6961控制器有許多控制命令,為方便使用,一般會使用PT6961函式庫,首先請進入底下網站http://gtbtech.com/?attachment_id=864,將檔案下載後解壓縮至Arduino安裝資料夾的libraries資料夾中,例如C:\arduino-1.0.6\libraries。或者也可從書後光碟的程式→libraries中找到PT6961函式庫。

2. 函式庫指令簡介

(1) 建立PT6961物件:使用函式庫的第一個動作是指定腳位與物件實體化,可透過底下的命令完成。

PT6961 SEG7(DIN腳位, CLK腳位, CS腳位); 
(2) 初始化PT6961:使用PT6961控制器前,可以底下的指令對PT6961進行一些設定,包含設定顯示記憶體為自動遞增、顯示的亮度最亮,同時清除顯示記憶體為0(不顯示狀態)。
SEG7.initDisplay(); 
(3) 初始化顯示記憶體:執行底下指令後可清除顯示記憶體為0。
SEG7.initRAM(); 
(4) 送控制命令給PT6961,其中cmd為控制命令
SEG7.sendCmd(char cmd); 
常用的控制命令如下。
char  _DISPLAY_6X12 = 0x02;	// 使用6個數字12個LED段模式
char _DISPLAY_7X11 = 0x03; // 使用7個數字11個LED段模式
char _AUTO_INCREMENT = 0x40; // 顯示記憶體位址自動遞增
char _FIXED_ADDRESS = 0x44; // 顯示記憶體位址固定
char _DISPLAY_OFF = 0x80; // 顯示器關閉(不顯示)
char _DISPLAY_1_16 = 0x88; // 顯示亮度為1/16(最暗)
char _DISPLAY_2_16 = 0x89; // 顯示亮度為2/16
char _DISPLAY_4_16 = 0x8A; // 顯示亮度為4/16
char _DISPLAY_10_16 = 0x8B; // 顯示亮度為10/16
char _DISPLAY_12_16 = 0x8D; // 顯示亮度為12/16
char _DISPLAY_14_16 = 0x8F; // 顯示亮度為14/16(最亮)
(5) 顯示指定的數字num,以及是否顯示中間冒號的LED段,colon為0不顯示,為1顯示「:」。
SEG7.sendNum(int num, char colon);
(6) 顯示指定的個別數字,以及是否顯示中間冒號的LED段。
SEG7.sendDigits(char digit1, char digit2, char digit3, char digit4, char colon); 
(7) 顯示指定位數的LED 段控制碼,其中digit為顯示記憶體位址,由左至右四位數對應的RAM位址分別為0xC0(千位)、0xC2(百位)、0xC4(拾位)和0xC6(個位);val為顯示控制碼,可參考表 13‑6的轉碼。
SEG7.sendSegment(char digit, char val); 
(8) 顯示指定位數的數字,其中digit為顯示記憶體位址,val為顯示的數字,colon指定是否顯示中間冒號的LED段(註:只有千位及百位數的colon有作用)。
SEG7.sendDigit(char digit, char val, char colon); 

四、 電路連接


1. iPOE-A1與TOFD-5465GGH-B顯示器的連接很簡單,只要將TOFD-5465GGH-B的6個端點插在A0~A6的母座上即可,如圖 13‑19(b)所示。電源部分由A5腳提供+5V,A0腳提供接地,A2~A4腳分別接至DIN、CLK、CS。

2. 不過,由於TOFD-5465GGH-B顯示器的腳很細,直接插在A0~A6的母座上很鬆容易接觸不良,故需透過如圖 13‑19(a)所示的長腳圓孔座轉接。若沒有轉接也可以,接點會比較鬆行走中容易因振動而接觸不良。

image  image


(a)長腳圓孔座 (b)插在A0~A6的母座上

13‑19 iPOE-A1與TOFD-5465GGH-B顯示器的連接

五、 範例


(一) 0-F的顯示練習
1. 本小節提供的第一個範例為拾位數顯示減號,個位數顯示0-9的練習,請看底下程式說明,程式專案位置在光碟\程式\第13章\chap13_3_7SEG_num。
// Oasis TOFD-5465GGH-B 4 Digit LED with PT6961 Controller
// http://gtbtech.com/?p=528

#include // 引入PT6961標頭檔

// 腳位指定 Pin A2 = DIN
// Pin A3 = CLK
// Pin A4 = CS

PT6961 SEG7(A2, A3, A4); // 物件實體化

void setup()
{
pinMode(A0, OUTPUT); // A0設為輸出
pinMode(A5, OUTPUT); // A5設為輸出
digitalWrite(A0, LOW); // A0設為接地
digitalWrite(A5, HIGH); // A5設為+5V,當做電源
SEG7.initDisplay(); // PT6961初始化
SEG7.sendSegment(0xC4, 0x40); // 拾位數顯示減號
}

void loop()
{
// 計數從0-9、A-F
for(int i=0; i<16; i++){
SEG7.sendDigit(0xC6,i,0); // 0xC6為個位數的顯示位址
delay(500);
}
}

2. 請插好四位元七段顯示器在A0~A6的插座上,燒錄好程式後即可看到數字呈現-0~-F持續循環顯示的結果,其中減號是七段顯示器中的g段亮,其餘不亮,故字碼為01000000=0x40。

(二) 計時碼表的顯示練習
1. 第二個範例為計時碼表的顯示練習,千位與百位顯示00~59秒,拾位與個位顯示00~99代表百分秒,顯示器中間的冒號每秒鐘會閃一次;詳細程式說明請看底下程式內容,程式專案位置在光碟\程式\第13章\chap13_3_7SEG_clock。
// Oasis TOFD-5465GGH-B 4 Digit LED with PT6961 Controller
// http://gtbtech.com/?p=528

#include // 引入PT6961標頭檔

// 腳位指定 Pin A2 = DIN
// Pin A3 = CLK
// Pin A4 = CS

PT6961 SEG7(A2, A3, A4); // 物件實體化
boolean colon=false; // 宣告一個冒號的變數

void setup()
{
pinMode(A0, OUTPUT); // A0設為輸出
pinMode(A5, OUTPUT); // A5設為輸出
digitalWrite(A0, LOW); // A0設為接地
digitalWrite(A5, HIGH); // A5設為+5V,當做電源
SEG7.initDisplay(); // PT6961初始化
}

void loop()
{
// 計數從 00:00-59:99
for (int i=0; i<6000; i++){
if (i%50==0) colon=!colon; // 每50*10=500ms冒號轉態一次
SEG7.sendNum(i,colon); // 送出數值顯示
delay(10); // 因為是1/100秒故延遲時間為10ms
}
}
image

13‑20 碼表範例成果

沒有留言: