STM32筆記(5):使用MAX7219 顯示8位數7段顯示器

今天延續昨天的實作,繼續使用 LcdControl 程式庫,將 8x8 LED 模組,改成一樣使用 MAX7219 控制的 2 個 4 位數 7 段顯示器,這個模組可顯示 8 位數。而這次的實作是讓 8 位數顯示器閃爍顯示 "HELLO..." 三次,再顯示 1-8 數在在 8 位數顯示器上。本篇文章加上 LcdControl程式庫的幾個函數用法解釋,瞭解程式庫如何透過不同的函式呈現 8x8的 LED 閃爍,或是顯示文數字在7段顯示器上。


[安裝程式庫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 條

[接線圖]

CP2102STM32F103C8T68位數7段顯示器MAX7219模組
GNDGNDGND
3V33.3V-
RXPA9-
TXPA10-
-5VVCC
-PA7DIN
-PA8CS
-PA5CLK




[程式]

#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);
}

[實作結果]


[參考資料]

Post a Comment

較新的 較舊