2022年3月6日日曜日

LEDで数字を表示する件(MAX7219)

 簡単な数値表示をしたくなったので、7セグメントのLED表示モジュールを動かしてみました。MAX7219を使った8桁モジュールを2個つないで16桁出してみます。

MAX7219を使った8桁2行の数値表示

MAX7219は、8桁の数字を表示できるコントローラで、複数つないで桁数を増やすことができます。
コントローラはArduinoを使いました。汎用ポートで制御しました。

早速ですが試作品の動画です。
表示内容と明るさが変わっています。

接続は、簡単です。Arduino側の端子は後述のソースコードをご覧ください。


 // MAX7219 LED表示器 x2
//   7セグメント16桁
//
// MAX7219 接続端子宣言
#define LED_DIN   4
#define LED_CLK   5
#define LED_LOAD  6
#include "MAX7219.h"
void setup() {
  // put your setup code here, to run once:
  
  LED_init();
}
void loop() {
  // put your main code here, to run repeatedly:
  char pp[16] = "1234567812345678";
  char *p;
  p = pp;
  LED_Intensity(1);
  LED_Print(p);
  delay(1000);
  
  //p = "2468024680246802";
  p = "1357913579135791";
  p[0] = '9';
  p[1] = '9';
  p[2] = '9';
  p[3] = '9';
  p[4] = '9';
  p[5] = '9';
  p[6] = '9';
  p[7] = 10;
  p[8] = 12;
  p[9] = 11;
  p[10] = 13;
  p[11] = 14;
  p[12] = 15;
  LED_Intensity(4);
  LED_Print(p);
  delay(1000);
  
}

以下を"MAX7219.h"というファイル名でスケッチフォルダに保存します。

// LED Commad
#define LED_DecodeMode 0x09
#define LED_intensity  0x0a
#define LED_ScanLimit  0x0b
#define LED_Shutdown   0x0c
#define LED_DisplayTest 0x0f
#define LED_ShutdownMode     0x00
#define LED_NormalOperation  0x01
#define LED_NoDecode      0x00
#define LED_DecodeFor7Seg 0xff
#define LED_DecodeMode2   0x01
#define LED_DecodeMode3   0x0f
// 関数プロトタイプ
void LED_send(byte address, byte data);
void LED_Byte(byte data);
void LED_init()
{
  pinMode(LED_DIN,OUTPUT);
  pinMode(LED_CLK,OUTPUT);
  pinMode(LED_LOAD,OUTPUT);
  digitalWrite(LED_CLK, HIGH);
  digitalWrite(LED_LOAD, LOW);
  LED_send( LED_DecodeMode,LED_DecodeFor7Seg);
  LED_send( LED_intensity,0x01);
  LED_send( LED_ScanLimit,0x07);
  LED_send( LED_Shutdown,LED_NormalOperation); 
  LED_send( LED_DisplayTest,0);
}
void LED_send(byte address, byte data)
{
  LED_Byte(address);
  LED_Byte(data);
  LED_Byte(address);
  LED_Byte(data);
  digitalWrite(LED_LOAD, HIGH);
  digitalWrite(LED_LOAD, LOW);
}
void LED_Byte(byte data)
{
  int i;
  for(i=0; i<8; i++)
  {
    if((data & 0x80) == 0)
    { digitalWrite(LED_DIN, LOW); }
    else {digitalWrite(LED_DIN, HIGH);}
    digitalWrite(LED_CLK, LOW);
    digitalWrite(LED_CLK, HIGH);
    data = data << 1;
  }
}
void LED_Intensity(byte intensity)
{
    LED_send( LED_intensity,intensity);
}
void LED_Print(char* pp)
{
  for(int i = 0; i < 8; i++)
  {
    LED_Byte(8 - i);
    LED_Byte(pp[i]);
    LED_Byte(8 - i);
    LED_Byte(pp[i + 8]);
    digitalWrite(LED_LOAD, HIGH);
    digitalWrite(LED_LOAD, LOW);
  }
}


スケッチをここに置いておきます。

 

0 件のコメント:

コメントを投稿