今天延續昨天的實作,繼續使用 LcdControl 程式庫,將 8x8 LED 模組,改成一樣使用 MAX7219 控制的 2 個 4 位數 7 段顯示器,這個模組可顯示 8 位數。而這次的實作是讓 8 位數顯示器閃爍顯示 "HELLO..." 三次,再顯示 1-8 數在在 8 位數顯示器上。本篇文章加上 LcdControl程式庫的幾個函數用法解釋,瞭解程式庫如何透過不同的函式呈現 8x8的 LED 閃爍,或是顯示文數字在7段顯示器上。
LedControl(int dataPin, int clkPin, int csPin, int numDevices);
int dataPin : Arduino 資料輸出的 Pin
int clockPin : 時鐘 Clock Pin
int csPin : 當資料被送出時選擇的設備 device
int numDevices : 最多有多少個設備要被控制
• 設定進入省電模式:
shutdown(int addr, bool b);
int addr : 控制顯示的位址
boolean b : 設定為 true,設備進入電力中斷模式,設定為 false 為正常模式
• 設定顯示亮度:
setIntensity(int addr, int intensity);
int addr : 控制顯示的位址
int intensity : 顯示器的亮度,介於 0(最暗) 及15(最亮) 之間
• 將所有LED設定成不顯示:
clearDisplay(int addr);
int addr : 控制顯示的位址
• 設定單一個LED 的亮或滅狀態:
setLed(int addr, int row, int col, boolean state);
addr : 顯示的位址
row : Led的列數 (0..7)
col : Led的欄數 (0..7)
state : 設定為 true,Led為亮,設定為 false,則關閉 Led 顯示
• 使用8bits顯示指定列的8個LED 亮或滅狀態:
setRow(int addr, int row, byte value);
addr : 顯示的位址
row : 列的編號 (0..7)
value : 8 bits 來顯示該列的LED是否為亮,1為亮,0為暗
• 使用8bits顯示指定欄的8個LED 亮或滅狀態:
setColumn(int addr, int col, byte value);
addr : 顯示的位址
col : 欄的編號 (0..7)
value : 8 bits 來顯示該欄的LED是否為亮,1為亮,0為暗
• 在7段顯示器顯示一個十六進位數字:
setDigit(int addr, int digit, byte value, boolean dp);
addr : 顯示的位址
digit : 顯示字元的位置 (0..7)
value : 顯示的數字 (0x00..0x0F)
dp : 設定小數點
• 在7段顯示器顯示一個字元:
setChar(int addr, int digit, char value, boolean dp);
addr : 顯示的位址
digit : 顯示字元的位置 (0..7)
value : 顯示的字元,僅可顯示0,1,2,3,4,5,6,7,8,9,0,A,b,c,d,E,F,H,L,P,.,-,_,' '
dp : 設定小數點
[安裝程式庫Library]
本實作需要安裝以下程式庫:直接到 Arduino IDE 功能表選單,選擇 [草稿碼 Sketch] → [匯入程式庫 Include Library] → [ 管理程式庫 Manage Libraries...],在出現的視窗搜尋處輸入 LedControl,如以下畫面,按下安裝即可。
程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。
[LedControl 函式庫]
• 建立一個新的控制:LedControl(int dataPin, int clkPin, int csPin, int numDevices);
int dataPin : Arduino 資料輸出的 Pin
int clockPin : 時鐘 Clock Pin
int csPin : 當資料被送出時選擇的設備 device
int numDevices : 最多有多少個設備要被控制
• 設定進入省電模式:
shutdown(int addr, bool b);
int addr : 控制顯示的位址
boolean b : 設定為 true,設備進入電力中斷模式,設定為 false 為正常模式
• 設定顯示亮度:
setIntensity(int addr, int intensity);
int addr : 控制顯示的位址
int intensity : 顯示器的亮度,介於 0(最暗) 及15(最亮) 之間
• 將所有LED設定成不顯示:
clearDisplay(int addr);
int addr : 控制顯示的位址
• 設定單一個LED 的亮或滅狀態:
setLed(int addr, int row, int col, boolean state);
addr : 顯示的位址
row : Led的列數 (0..7)
col : Led的欄數 (0..7)
state : 設定為 true,Led為亮,設定為 false,則關閉 Led 顯示
• 使用8bits顯示指定列的8個LED 亮或滅狀態:
setRow(int addr, int row, byte value);
addr : 顯示的位址
row : 列的編號 (0..7)
value : 8 bits 來顯示該列的LED是否為亮,1為亮,0為暗
• 使用8bits顯示指定欄的8個LED 亮或滅狀態:
setColumn(int addr, int col, byte value);
addr : 顯示的位址
col : 欄的編號 (0..7)
value : 8 bits 來顯示該欄的LED是否為亮,1為亮,0為暗
• 在7段顯示器顯示一個十六進位數字:
setDigit(int addr, int digit, byte value, boolean dp);
addr : 顯示的位址
digit : 顯示字元的位置 (0..7)
value : 顯示的數字 (0x00..0x0F)
dp : 設定小數點
• 在7段顯示器顯示一個字元:
setChar(int addr, int digit, char value, boolean dp);
addr : 顯示的位址
digit : 顯示字元的位置 (0..7)
value : 顯示的字元,僅可顯示0,1,2,3,4,5,6,7,8,9,0,A,b,c,d,E,F,H,L,P,.,-,_,' '
dp : 設定小數點
[材料]
- STM32F103C8T6 開發板
- USB轉TTL序列傳輸線 CP2102
- 8位數 MAX7219 模組
- 排線 n 條
[接線圖]
CP2102 | STM32F103C8T6 | 8位數7段顯示器MAX7219模組 |
---|---|---|
GND | GND | GND |
3V3 | 3.3V | - |
RX | PA9 | - |
TX | PA10 | - |
- | 5V | VCC |
- | PA7 | DIN |
- | PA8 | CS |
- | PA5 | CLK |
[程式]
#include <LedControl.h> // PA7:Data in, PA5: Clock, PA8: CS(Load) LedControl lc=LedControl(PA7,PA5,PA8,1); unsigned long delaytime=500; int i=0; void setup() { lc.shutdown(0,false); // 關閉省電模式 lc.setIntensity(0,8); // 設定亮度為 8 (介於0~15之間) lc.clearDisplay(0); // 清除螢幕 } void loop() { // HELLO 閃動3次 for (i=1;i<=3;i++){ delay(delaytime); lc.setChar(0,7,'H',false); lc.setChar(0,6,'E',false); lc.setChar(0,5,'L',false); lc.setChar(0,4,'L',false); lc.setChar(0,3,'0',false); lc.setChar(0,2,'.',false); lc.setChar(0,1,'.',false); lc.setChar(0,0,'.',false); delay(delaytime); lc.clearDisplay(0); } // 顯示8個位數數字 1-8 lc.clearDisplay(0); delay(delaytime); lc.setDigit(0,7,1,false); delay(delaytime); lc.setDigit(0,6,2,false); delay(delaytime); lc.setDigit(0,5,3,false); delay(delaytime); lc.setDigit(0,4,4,false); delay(delaytime); lc.setDigit(0,3,5,false); delay(delaytime); lc.setDigit(0,2,6,false); delay(delaytime); lc.setDigit(0,1,7,false); delay(delaytime); lc.setDigit(0,0,8,false); delay(1500); lc.clearDisplay(0); delay(delaytime); }
張貼留言