ArduinoでMAX7219を使った8桁7セグメントLEDの表示テストをしました。
このLEDは、Amazonから購入しましたが、中国からの発送なので、到着まで約3週間かかりました。こちらの商品で、2個で499円でした。

表面です。8桁で約7cmの幅です。使いやすい大きさですね。
LEDは、右からDigit0,1,2,3...7です。

裏面です。MAX7219コントローラが搭載されています。

このモジュールとの通信は、SPI通信で、DIN,CS,CLKの3つの信号で、コマンドとデータを送ります。Arduinoとの接続回路図です。
Arduino 8X7seg_LED
5V VCC
GND GND
D11(MOSI) DIN
D10(CS) CS
D13(SCK) CLK

このモジュールを使うためのライブラリは、Arduinoでは、ライブラリマネージャーに「MAX7219」と入力して検索すれば簡単に見つけることができますし、Web上でも紹介されています。私もこのライブラリのサンプルプログラムで、表示を確認しました。
今回は、あえてライブラリを使わないで表示テストをします。というのは、MAX7219の動作については、このブログの「Arduino 8X8LED MAX7219テスト その1」という記事で勉強しましたので、比較的簡単に動作させることができると考えたことと、ライブラリを使わないプログラムであれば、他のマイコン(PICやRaspberry Pi Picoなど)への移植もできると考えたからです。
例として、digit3に5を表示してみましょう。
MAX7219に送るデータは16ビットで、下の表1ようなフォーマットになっています。送信する順序は、D15,D14,.......D1,D0と最上位ビットから送信します。従って、上位8ビット(SDDRESS)、下位8ビット(DATA)の順にMSBFIRSTで送信します。

D8-D11は、レジスタのアドレスで、表2のように割り当てられています。

Digit3のアドレスは、0x04です。
次に「5」を表示するには、DATAに0101=5を送ります。

スケッチです。
0.5secごとに、Digit3に「5」を表示し、次にdotを付け加え、次に空白(blank)を表示(数字を消す)させています。
dot(デシマルポイント)を表示させるには、D7=1とすればよく、表示データに0x80を加えます。また、blankは、0x0fをデータとして送ります。
--------------------------------------------------------------------------------------------
/*
* Arduino MAX7219 7seg LED test
* 1桁表示テスト
* 2022.09.08
* JH7UBC Keiji Hata
*/
#include <SPI.h>
#define CS_PIN 10
//CLK PIN13
//DIN PIN11
// MAX7219 Register Address
#define MAX7219_DECODE_MODE 0x09
#define MAX7219_INTENSITY 0x0a
#define MAX7219_SCAN_LIMIT 0x0b
#define MAX7219_SHUTDOWN 0x0C
#define MAX7219_DISPLAY_TEST 0x0f
void maxTransfer(uint8_t address, uint8_t value) {
digitalWrite(CS_PIN, LOW); // Start transfer.
SPI.transfer(address); // Send address.
SPI.transfer(value); // Send the value.
digitalWrite(CS_PIN, HIGH); // Finish transfer.
}
void MAX7219_INI(){
maxTransfer(MAX7219_DECODE_MODE, 0xff);// Code B decode for digits 7–0
maxTransfer(MAX7219_INTENSITY, 0x03); // Use lowest intensity.
maxTransfer(MAX7219_SCAN_LIMIT, 0x07);// Display digits 01234567
maxTransfer(MAX7219_SHUTDOWN, 0x01);// Normal Operation
maxTransfer(MAX7219_DISPLAY_TEST, 0x00);// Normal Operation
}
void Clear_Display(){
for(uint8_t i=1;i<=8;i++){
maxTransfer(i,0x0f);
}
}
void setup() {
pinMode(CS_PIN, OUTPUT); // CS_Pin is OUTPUT Mode
digitalWrite(CS_PIN, HIGH); // CS=HIGH
SPI.setBitOrder(MSBFIRST); // Reverse the SPI Data o/p.
SPI.begin(); // Start SPI
MAX7219_INI();
Clear_Display();
}
void loop() {
maxTransfer(4,5);//digit4に5を表示
delay(500);
maxTransfer(4,5+0x80);//小数点を加える
delay(500);
maxTransfer(4,0x0f);//表示を消す(ブランク表示)
delay(500);
}
--------------------------------------------------------------------------------------------
表示結果です。
