/************************************************************************ * MAX7219_8x8LedMatrix_TEST: * * 8x8 LEDマトリックス・モジュール:M7SEGX1R-7219B"aitendo" * * PIC18F14K50 * 8MHz 内部クロックをPLLで4倍し32MHzクロックにて動作 * Tcy= 1/(32M/4)= 125nS * * 初期作成日:2019/12/30 N.Ishii * <更新履歴> * 191231 * アスキーテーブルを作成したのでアスキーコード指定で、 * 全キャラクタを順次表示してみる。 *************************************************************************/ #include #include "Font8x8.h" #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 //-------------------------------------------------------------------------------------- char ci; char code; //******************* プロトタイプ *********************************** void send7219(unsigned char adrs, unsigned char data); void delay_ms(int ms); /***************** * メイン関数 ******************/ void main(void) { char i; 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 /// Main Loop while(1){ for (code = 0x20; code < 0xE0; code++) { // Set Font Data -> Forward MAX7219 // (Com on pulse width=0.2mS, Scan cycle=1.5mS) for (ci = 0; ci < 8; ci++) { send7219(ci + 1, Font8x8[code-0x20][ci]); } delay_ms(2000); } } } //----------------------------------------------------------------------------------------------------------- /****************************************************************** * 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); }