※ Hitech_Cのソースコードです。 /***************************************************** * 7Seg_LEDのテストプログラム <<10分カウントダウン>> * (カソードコモン型4桁7segLED) * 疑似I2Cインターフェース(IC:TM1640)で接続 * (スレーブアドレス無し、書込み:0ビット→7ビット) * * PIC 12F683 MPLAB IDE Ver8.84 HI-TECH C * GP4:DIN GP5:SCLK GP2:LED+ ******************************************************/ #include #define _XTAL_FREQ 4000000 // クロック周波数設定 /***** コンフィギュレーションの設定 ********/ __CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & BOREN_ON & MCLRE_ON & CP_OFF & IESO_OFF & FCMEN_OFF); #define DIN GP4 #define SCLK GP5 // 0〜9の数字 DP表示は+80h char const LED_SEG[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67 }; unsigned int Count, g_time; unsigned char s1,s2,s3,s4; unsigned char chflg; void TM_Start(void); void TM_Stop(void); void keisan(void); void S7_Hyoji(char n1,char n2,char n3,char n4); unsigned char S7_Out(char data); /******** メイン関数 ************/ void main(void){ CMCON0 = 0x07; // コンパレータオフ OSCCON = 0x60; // Set to 4MHz OPTION_REG = 0x06; // 内部プルアップ使用、プリスケーラ 1/128 INTCON = 0xC0; // GIE=1, PEIE=1; T0IE=0, T0IF=0 TRISIO = 0x00; // 全出力設定 ANSEL = 0x00; // デジタルに設定 WPU = 0x30; // GP4,5 プルアップ TMR0 = 0x64; // 初期値:100 (256-100)×128 => 20mS T0IE = 1; // Timer0 始動 /**** メインループ *****/ Count = 0; g_time = 600; // 初期値600秒(10分) chflg = 1; GP2 = 0; while(1){ if(chflg == 1){ chflg = 0;// 1秒フラグ keisan(); S7_Hyoji(s1,s2,s3,s4); GP2 ^= 1; } // 表示は遅いため割込み処理とは別に動作させる } } // 割込み処理 void interrupt Time_cnt( void ){ if (T0IF == 1){ // タイマー0の割込み発生か? TMR0 = 0x64; // タイマー0の初期化 Count++; // 割込み発生の回数をカウントする T0IF = 0; // タイマー0割込フラグをリセット if (Count >= 45){ // 割込みを45(本当は50)回カウントすると約1秒 Count = 0; g_time--; chflg = 1; // 秒数変化フラグ if(g_time==0)g_time=600; } // 0になったら初期値を入れて繰り返す } } // 計算 秒から分秒へ void keisan(void){ s1 = LED_SEG[g_time / 600]; s2 = LED_SEG[g_time % 600 / 60]; s3 = LED_SEG[g_time % 60 / 10]; s4 = LED_SEG[g_time % 10]; } // 7セグに表示 void S7_Hyoji(char n1, char n2, char n3, char n4){ TM_Start(); S7_Out(0x40); // 移動アドレスモード TM_Stop(); TM_Start(); S7_Out(0xC0); // 開始位置アドレス S7_Out(n1); // 10分 S7_Out(n2); // 分 S7_Out(n3); // 10秒 S7_Out(n4); // 秒 S7_Out(0x03); // コロン TM_Stop(); TM_Start(); S7_Out(0x8A); // 輝度 (4/16) TM_Stop(); } // Start Condiotion void TM_Start(void){ DIN = 1; SCLK = 1; DIN = 0; // 先に DIN→Low } // Stop Condition void TM_Stop(void){ SCLK = 0; // SCLK Low DIN = 0; // DIN Low SCLK = 1; // 先にSCLKをHigh DIN = 1; // 後からDIOをHigh } /*** 1バイト出力 ***/ unsigned char S7_Out(char data){ char i; for(i=0; i<8; i++){ // 8回繰り返し SCLK = 0; // SCLK Low DIN = (data>>i) & 0x01; // ビット送信 SCLK = 1; // SCLK Highに戻す } }