/************************************************************************ * MAX7219_8x8LedMatrix2_TEST: * * 8x8 LEDマトリックス・モジュール 2個カスケード接続 * アスキーコード指定で、文字列(2文字)を表示してみる。 * * * 8x8 LEDマトリックス・モジュール:M7SEGX1R-7219B"aitendo" * * PIC18F14K50 * 8MHz 内部クロックをPLLで4倍し32MHzクロックにて動作 * Tcy= 1/(32M/4)= 125nS * * 初期作成日:2020/1/31 N.Ishii * <更新履歴> * 200204 * ポインタ使用に戻す。 * 表示デモ追加 *************************************************************************/ #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 /// LED Message char LedMsg1[] = "AB"; char LedMsg2[] = "A "; char LedMsg3[] = " B"; char LedMsg4[] = "yz"; char LedMsg5[] = "イシ"; char LedMsg6[] = "ヲン"; char LedMsg7[] = "ポ"; //-------------------------------------------------------------------------------------- //******************* プロトタイプ *********************************** void Send_x2_MAX7219(unsigned char adrs, unsigned char HiData, unsigned char LoData); void LedMatrix2_StrDisp(char *str); 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初期化:上位桁・下位桁共に同じパラメータを書込む。 Send_x2_MAX7219(0x0F, 0, 0); // display test reg - normal operation for (i=1; i <= 8; ++i) Send_x2_MAX7219(i, 0, 0); // clear data reg Send_x2_MAX7219(0x09, 0, 0); // decode moode reg - no decode Send_x2_MAX7219(0x0A, 0x0F, 0x0F); // intensity reg - maximum brightness Send_x2_MAX7219(0x0B, 0x07, 0x07); // scan limit reg - 8digit Send_x2_MAX7219(0x0C, 0x01, 0x01); // shutdown reg - normal operation -> Scan Start /// 表示デモ while(1) { LedMatrix2_StrDisp(LedMsg1); // "AB"表示 delay_ms(1000); LedMatrix2_StrDisp(LedMsg2); // "A "表示 delay_ms(1000); LedMatrix2_StrDisp(LedMsg3); // " B"表示 delay_ms(1000); LedMatrix2_StrDisp(LedMsg4); // "yz"表示 delay_ms(1000); LedMatrix2_StrDisp(LedMsg5); // "イシ"表示 delay_ms(1000); LedMatrix2_StrDisp(LedMsg6); // "ヲン"表示 delay_ms(1000); LedMatrix2_StrDisp(LedMsg7); // "ポ"表示 delay_ms(1000); } } //----------------------------------------------------------------------------------------------------------- /****************************************************************** * MAX7219へのデータ送信(2個カスケード接続専用関数) * * <引数> * adrs:レジスタ・アドレス(共通) * HiData:上位桁ledの表示データ * LoData:下位桁ledの表示データ *******************************************************************/ void Send_x2_MAX7219(unsigned char adrs, unsigned char HiData, unsigned char LoData) { char i, j; unsigned char data; unsigned char adrs_temp; adrs_temp= adrs; LOAD_PIN_Lo; for (j=0; j<2; ++j) { if (j == 0) data= HiData; else { data= LoData; adrs= adrs_temp; } // 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); } /**************************************************** * 文字列表示関数(2個カスケード接続専用) * *****************************************************/ void LedMatrix2_StrDisp(char *str) { char i; for (i=0; i<8; ++i) { Send_x2_MAX7219(i+1, Font8x8[*str-0x20][i], Font8x8[*(str+1) - 0x20][i]); } } /***************************************************** * mS 単位の遅延 ******************************************************/ void delay_ms(int ms){ while(ms-- > 0)__delay_ms(1); }