簡単な数値表示をしたくなったので、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 件のコメント:
コメントを投稿