2013-01-06
arduinoでの動作確認の図
数値以外の内蔵フォントはこれだけ。non decodeモードで数値とこれ以外の物を表示することも出来る。
回路図。
・信号線に1kΩが入っているがブレッドボードで配線するときに間違って電源やGNDに繋いで壊さないようにするため。プリント基板にするなら間違えようが無いので抵抗不要。
・LED1だけコモンピンが2本接続されているが特に意味は無い。LED内部で繋がっている。
0001 /*---------------------- 2012-01-06 written by iizuka -----*/
0002 /* MAX7219 TEST */
0003 /*----------------------------------------------------------*/
0004 #define LOADpin 10
0005 #define DINpin 11
0006 #define CLKpin 13
0007
0008 void setup() {
0009 pinMode(LOADpin,OUTPUT);
0010 pinMode(DINpin, OUTPUT);
0011 pinMode(CLKpin, OUTPUT);
0012 digitalWrite(LOADpin,HIGH);
0013 digitalWrite(DINpin, LOW );
0014 digitalWrite(CLKpin, LOW );
0015 delay(1);
0016
0017 max7219write( 0x0F, 0x00 ); // display test , normal operation
0018 max7219write( 0x09, 0xFF ); // decode mode , decode digit 0 to 7
0019 max7219write( 0x0A, 0x08 ); // intensity , 0x01=dark .... 0x0F=bright
0020 max7219write( 0x0B, 0x07 ); // scan limit , display 0 to 7
0021 max7219write( 0x0C, 0x01 ); // shutdown mode register , normal operation
0022 }
0023
0024 void loop()
0025 {
0026 max7219write( 0x09, 0xFF ); // DIGIT 0-7 : Code
0027 // display "12345678"
0028 max7219write( 1, 1 );
0029 max7219write( 2, 2 );
0030 max7219write( 3, 3 );
0031 max7219write( 4, 4 );
0032 max7219write( 5, 5 );
0033 max7219write( 6, 6 );
0034 max7219write( 7, 7 );
0035 max7219write( 8, 8 );
0036 delay(2000);
0037
0038 // display "9-EHLP "
0039 max7219write( 1, 9 );
0040 max7219write( 2, 10 );
0041 max7219write( 3, 11 );
0042 max7219write( 4, 12 );
0043 max7219write( 5, 13 );
0044 max7219write( 6, 14 );
0045 max7219write( 7, 15 );
0046 max7219write( 8, 15 );
0047 delay(2000);
0048
0049 // display "1234Abcd"
0050 max7219write( 0x09, 0x0F ); // DIGIT 0-3 : Code DIGIT 4-7 : No decode
0051 max7219write( 1, 1 );
0052 max7219write( 2, 2 );
0053 max7219write( 3, 3 );
0054 max7219write( 4, 4 );
0055 max7219write( 5, B01110111 );
0056 max7219write( 6, B00011111 );
0057 max7219write( 7, B00001101 );
0058 max7219write( 8, B00111101 );
0059 delay(2000);
0060 }
0061
0062
0063 void max7219write( byte high_byte, byte low_byte )
0064 {
0065 digitalWrite( LOADpin, LOW );
0066 shiftOut( DINpin, CLKpin, MSBFIRST, high_byte );
0067 shiftOut( DINpin, CLKpin, MSBFIRST, low_byte );
0068 digitalWrite( LOADpin, HIGH );
0069 delayMicroseconds(1);
0070 }
上のプログラムの波形の一部。shiftOut命令はかなり遅い。16ビット送るのに300μ秒かかっている
Probe00:CLK
Probe01:LOAD
Probe02:DIN
Probe03:DOUT カスケード接続の時に使う。DINで入力された物が16クロック遅れて出力される
0001 /*---------------------- 2012-01-06 written by iizuka -----*/
0002 /* MAX7219 TEST */
0003 /*----------------------------------------------------------*/
0004 #include <SPI.h>
0005
0006 #define LOADpin 10
0007 // DIN = Digital 11 pin
0008 // CLK = Digital 13 pin
0009
0010 void setup() {
0011 pinMode(LOADpin,OUTPUT);
0012 digitalWrite(LOADpin,HIGH);
0013
0014 SPI.begin();
0015 SPI.setBitOrder(MSBFIRST);
0016 SPI.setClockDivider(SPI_CLOCK_DIV2);
0017 SPI.setDataMode(SPI_MODE0);
0018
0019 delay(500);
0020 max7219write( 0x0F, 0x00 ); // display test , normal operation
0021 max7219write( 0x09, 0xFF ); // decode mode , decode digit 0 to 7
0022 max7219write( 0x0A, 0x08 ); // intensity , 0x01=dark .... 0x0F=bright
0023 max7219write( 0x0B, 0x07 ); // scan limit , display 0 to 7
0024 max7219write( 0x0C, 0x01 ); // shutdown mode register , normal operation
0025 }
0026
0027 void loop()
0028 {
0029 max7219write( 0x09, 0xFF ); // DIGIT 0-7 : Code
0030 // display "12345678"
0031 max7219write( 1, 1 );
0032 max7219write( 2, 2 );
0033 max7219write( 3, 3 );
0034 max7219write( 4, 4 );
0035 max7219write( 5, 5 );
0036 max7219write( 6, 6 );
0037 max7219write( 7, 7 );
0038 max7219write( 8, 8 );
0039 delay(2000);
0040
0041 // display "9-EHLP "
0042 max7219write( 1, 9 );
0043 max7219write( 2, 10 );
0044 max7219write( 3, 11 );
0045 max7219write( 4, 12 );
0046 max7219write( 5, 13 );
0047 max7219write( 6, 14 );
0048 max7219write( 7, 15 );
0049 max7219write( 8, 15 );
0050 delay(2000);
0051
0052 // display "1234Abcd"
0053 max7219write( 0x09, 0x0F ); // DIGIT 0-3 : Code DIGIT 4-7 : No decode
0054 max7219write( 1, 1 );
0055 max7219write( 2, 2 );
0056 max7219write( 3, 3 );
0057 max7219write( 4, 4 );
0058 max7219write( 5, B01110111 );
0059 max7219write( 6, B00011111 );
0060 max7219write( 7, B00001101 );
0061 max7219write( 8, B00111101 );
0062 delay(2000);
0063 }
0064
0065
0066 void max7219write( byte high_byte, byte low_byte )
0067 {
0068 digitalWrite( LOADpin, LOW );
0069 SPI.transfer( high_byte );
0070 SPI.transfer( low_byte );
0071 digitalWrite( LOADpin, HIGH );
0072 }
SPIの時の波形。SPIそのものは高速。関数の呼び出しオーバーヘッドの方が大きい。
上の波形の全体図。8桁分のデータ送信に要する時間は0.1msと十分に速い
カスケード接続するとデータ送信時間がカスケード段数だけ増えるがMPUのI/Oピンは3本のままでよい。写真は8桁のLEDを作るのが面倒だったので3桁のLEDで代用
カスケード接続の回路図
0001 /*---------------------- 2012-01-06 written by iizuka -----*/
0002 /* MAX7219 TEST CASCADE */
0003 /*----------------------------------------------------------*/
0004 #define LOADpin 10
0005 #define DINpin 11
0006 #define CLKpin 13
0007
0008 void setup() {
0009 pinMode(LOADpin,OUTPUT);
0010 pinMode(DINpin, OUTPUT);
0011 pinMode(CLKpin, OUTPUT);
0012 digitalWrite(LOADpin,HIGH);
0013 digitalWrite(DINpin, LOW );
0014 digitalWrite(CLKpin, LOW );
0015 delay(1);
0016
0017 max7219write( 0x0F, 0x00, 0x0F, 0x00 ); // display test , normal operation
0018 max7219write( 0x09, 0xFF, 0x09, 0xFF ); // decode mode , decode digit 0 to 7
0019 max7219write( 0x0A, 0x06, 0x0A, 0x06 ); // intensity , 0x01=dark .... 0x0F=bright
0020 max7219write( 0x0B, 0x07, 0x0B, 0x02 ); // scan limit , main -> display 0 to 7 sub -> 0 to 2
0021 max7219write( 0x0C, 0x01, 0x0C, 0x01 ); // shutdown mode register , normal operation
0022 }
0023
0024 void loop()
0025 {
0026 // display "01234567" "89-"
0027 max7219write( 1, 0, 1, 8 );
0028 max7219write( 2, 1, 2, 9 );
0029 max7219write( 3, 2, 3, 10 );
0030 max7219write( 4, 3, 0, 0 );
0031 max7219write( 5, 4, 0, 0 );
0032 max7219write( 6, 5, 0, 0 );
0033 max7219write( 7, 6, 0, 0 );
0034 max7219write( 8, 7, 0, 0 );
0035 delay(2000);
0036
0037 // display "-9876543" "210"
0038 max7219write( 1, 10, 1, 2 );
0039 max7219write( 2, 9, 2, 1 );
0040 max7219write( 3, 8, 3, 0 );
0041 max7219write( 4, 7, 0, 0 );
0042 max7219write( 5, 6, 0, 0 );
0043 max7219write( 6, 5, 0, 0 );
0044 max7219write( 7, 4, 0, 0 );
0045 max7219write( 8, 3, 0, 0 );
0046 delay(2000);
0047 }
0048
0049
0050 void max7219write( byte addrmain, byte datamain, byte addrsub, byte datasub )
0051 {
0052 digitalWrite( LOADpin, LOW );
0053 shiftOut( DINpin, CLKpin, MSBFIRST, addrsub );
0054 shiftOut( DINpin, CLKpin, MSBFIRST, datasub );
0055 shiftOut( DINpin, CLKpin, MSBFIRST, addrmain );
0056 shiftOut( DINpin, CLKpin, MSBFIRST, datamain );
0057 digitalWrite( LOADpin, HIGH );
0058 delayMicroseconds(1);
0059 }