前の記事でArduino UNO R4(WiFi)でのSPIのテストをしました。それを元に以前Arduino UNO R3でMAX7219 8X7segLEDのテストに使ったスケッチを書き替えてみました。
配線図です。
スケッチです。元記事はこちら。
--------------------------------------------------------
/*
* Arduino UNO R4 WiFi MAX2719 8X7segLED test
* 2024.03.04
* JH7UBC Keiji Hata
*/
#include <SPI.h>
SPISettings spi_setting(1000000, MSBFIRST, SPI_MODE3);
#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);
}
}
//x=表示開始digit(digit7-0)、nl=数値の最大長、num=表示する数値
//数値は右詰めで表示する
void printnum(uint8_t x,uint8_t nl,uint16_t num){
String s=String(num); //数値を文字列に変換
uint8_t ln=s.length();//文字列の長さ
int ix=ln-nl; //index初期値
uint8_t sx=x+1; //表示開始アドレス
for(uint8_t i=0;i<nl;i++){
int index=ix+i;
if(index<0){
maxTransfer(sx-i,0x0f);
}else{
String c=s.substring(index,index+1);//indexの文字を1個取り出す
uint8_t m = c.toInt();//文字列を数値に変換
maxTransfer(sx-i,m);
}
}
}
void setup() {
pinMode(CS_PIN, OUTPUT); // CS_Pin is OUTPUT Mode
digitalWrite(CS_PIN, HIGH); // CS=HIGH
SPI.begin(); // Start SPI
SPI.beginTransaction(spi_setting);
MAX7219_INI();
Clear_Display();
}
void loop() {
for(uint16_t i=0;i<10000;i++){
printnum(5,4,i);
delay(500);
}
}
--------------------------------------------------------
* Arduino UNO R4 WiFi MAX2719 8X7segLED test
* 2024.03.04
* JH7UBC Keiji Hata
*/
#include <SPI.h>
SPISettings spi_setting(1000000, MSBFIRST, SPI_MODE3);
#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);
}
}
//x=表示開始digit(digit7-0)、nl=数値の最大長、num=表示する数値
//数値は右詰めで表示する
void printnum(uint8_t x,uint8_t nl,uint16_t num){
String s=String(num); //数値を文字列に変換
uint8_t ln=s.length();//文字列の長さ
int ix=ln-nl; //index初期値
uint8_t sx=x+1; //表示開始アドレス
for(uint8_t i=0;i<nl;i++){
int index=ix+i;
if(index<0){
maxTransfer(sx-i,0x0f);
}else{
String c=s.substring(index,index+1);//indexの文字を1個取り出す
uint8_t m = c.toInt();//文字列を数値に変換
maxTransfer(sx-i,m);
}
}
}
void setup() {
pinMode(CS_PIN, OUTPUT); // CS_Pin is OUTPUT Mode
digitalWrite(CS_PIN, HIGH); // CS=HIGH
SPI.begin(); // Start SPI
SPI.beginTransaction(spi_setting);
MAX7219_INI();
Clear_Display();
}
void loop() {
for(uint16_t i=0;i<10000;i++){
printnum(5,4,i);
delay(500);
}
}
--------------------------------------------------------
数字がカウントアップされて表示されました。