/************************************************************************ * MAX7219_8x8LedMatrix_Scroll_TEST: * 8x8Ledモジュール1個で、スクロール実験を行う。 * * 参考資料:トラ技 2007年8月号 山口晶大氏の記事 * 8x8 LEDマトリックス・モジュール:M7SEGX1R-7219B"aitendo" * * PIC18F14K50 * 8MHz 内部クロックをPLLで4倍し32MHzクロックにて動作 * Tcy= 1/(32M/4)= 125nS * * 初期作成日:2020/1/5 N.Ishii * 更新年月日:2020/1/10 *************************************************************************/ #include #pragma config FOSC = IRC, PLLEN = ON, FCMEN = OFF #pragma config IESO = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV #pragma config PWRTEN = OFF, BOREN = OFF, WDTEN = OFF #pragma config HFOFST = OFF, MCLRE = ON #pragma config STVREN = ON, BBSIZ = OFF, LVP = OFF #pragma config XINST = OFF #pragma config CP0 = OFF, CP1 = OFF, CPB = OFF #pragma config WRT0 = OFF, WRT1 = OFF, WRTB = OFF, WRTC = OFF #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTRB = OFF #define _XTAL_FREQ 32000000 /// MAX7219 SPIピン定義 #define LOAD_PIN_Hi LATCbits.LATC7 = 1 #define LOAD_PIN_Lo LATCbits.LATC7 = 0 #define CLK_PIN_Hi LATCbits.LATC0 = 1 #define CLK_PIN_Lo LATCbits.LATC0 = 0 #define DATA_PIN_Hi LATCbits.LATC6 = 1 #define DATA_PIN_Lo LATCbits.LATC6 = 0 #define LED LATCbits.LATC2 // デバッグLED unsigned int ScrollBuff[8]= {0x0060, 0x0080, 0x0080, 0x0066, 0x0009, 0x0009, 0x0006, 0x0003};// " CQ" // unsigned char DispBuff[8]= {0x00, 0x00, 0x000, 0x00, 0x00, 0x00, 0x00, 0x00}; // " ":削除 200110 unsigned char DispBuff[8]; // 修正 200110 //-------------------------------------------------------------------------------------- //******************* プロトタイプ *********************************** void send7219(unsigned char adrs, unsigned char data); void delay_ms(int ms); /***************** * メイン関数 ******************/ void main(void) { char i,loop; char carry_flag= 0;; OSCCON = 0b01100000; // 内部クロック8Mhz x PLL4 UCONbits.USBEN = 0; // USBは使用しない /// アナログ入力と併用の、RB4,5に該当する /// ANSELxビットを'0'にリセット、デジタルピンとして使用する ANSELHbits.ANS10 = 0; // RB4 digital input ANSELHbits.ANS11 = 0; // RB5 digital input TRISA= 1; // RA is Input(今回は未使用) TRISB= 0b11110000; // RB4-7 is Input TRISC= 0; // RC is Output:RC0=CLK, RC6=DATA, RC7=LOAD(CS)) /// 内部プルアップ設定 INTCON2bits.RABPU = 0; // プルアップ許可(これが無いとプルアップされない) WPUB = 0b11110000; // RB4-7 is Pull-Up LED= 0; // デバッグLED 消灯 /// SPIピンの初期化 LOAD_PIN_Hi; CLK_PIN_Lo; /// MAX7219初期化 send7219(0x0f, 0x00); // display test reg - normal operation for (i=1; i <= 8; ++i) {send7219(i, 0);} // clear data reg send7219(0x09, 0x00); // decode moode reg - no decode send7219(0x0a, 0x0f); // intensity reg - maximum brightness send7219(0x0b, 0x07); // scan limit reg - 8digit send7219(0x0c, 0x01); // shutdown reg - normal operation -> Scan Start /* /// 初期状態をブランク表示にする:削除 200110 for (i=0; i<8; i++) send7219(i+1, DispBuff[i]); delay_ms(1000); */ /// MAIN LOOP while(1) { /// 最初の8回は、スクロールバッファを左シフトしながら、 /// その結果を表示バッファにコピーし表示 for (loop=0; loop < 8; loop++) { for (i=0; i < 8; i++) { ScrollBuff[i] <<= 1; DispBuff[i]= (unsigned char)(ScrollBuff[i] >> 8); } for (i=0; i<8; i++) send7219(i+1, DispBuff[i]); delay_ms(1000); } /// 以降8回は行毎に、キャリーをチェックしキャリーが立っていたらローテート用のデータに変換しながら循環表示 for (loop=0; loop < 8; loop++) { for (i=0; i<8; i++) { if ((ScrollBuff[i] & 0x8000) == 0x8000) carry_flag= 1;// シフト前に、msbをチェックし、'1'だったらキャリーを立てておく。 ScrollBuff[i] <<= 1; if (carry_flag == 1) { ScrollBuff[i] |= 0x0001; // シフト前のmsbが、'1'の場合:シフト後のlsbを強制的に、'1'にする(ローテート) carry_flag= 0; } DispBuff[i]= (unsigned char)(ScrollBuff[i] >> 8); } for (i=0; i<8; i++) send7219(i+1, DispBuff[i]); delay_ms(1000); } /// 初期状態のブランク表示に戻っている。 } /// 最初に戻って繰り返す } //----------------------------------------------------------------------------------------------------------- /****************************************************************** * MAX7219へのデータ送信 * 1ライン転送するのに実測約100uSなので、8ラインで約800uS掛っている。 *******************************************************************/ void send7219(unsigned char adrs, unsigned char data) { char i; LOAD_PIN_Lo; // write address for (i=0; i<8; ++i) { __delay_us(1); CLK_PIN_Lo; __delay_us(1); if (0x80 <= adrs) { // send address bit DATA_PIN_Hi; } else { DATA_PIN_Lo; } adrs=adrs << 1; // shift address bits __delay_us(1); CLK_PIN_Hi; } // write data for (i=0; i<8; ++i) { __delay_us(1); CLK_PIN_Lo; __delay_us(1); if (0x80 <= data) { // send data bit DATA_PIN_Hi; } else { DATA_PIN_Lo; } data=data << 1; // shift data bits __delay_us(1); CLK_PIN_Hi; } __delay_us(1); LOAD_PIN_Hi; __delay_us(1); CLK_PIN_Hi; __delay_us(1); } /***************************************************** * mS 単位の遅延 ******************************************************/ void delay_ms(int ms){ while(ms-- > 0)__delay_ms(1); }