※元はmain.cです。(Hitech_Cのソースコード) /***************************************************** * 7Seg_LEDのテストプログラム <<2分カウントダウン>> * 疑似I2Cインターフェース(IC:TM1637)で接続 * (スレーブアドレス無し、書込み:0ビット→7ビット) * * PIC 12F683 MPLAB IDE Ver8.84 HI-TECH C * GP5:DIO GP4:CLK 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 DIO GP4 #define CLK GP5 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 S7_Start(void); void S7_Stop(void); void keisan(void); void S7_Hyoji(char n1,char n2,char n3,char n4); unsigned char S7_Out(unsigned 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 GPIO = 0x30; // GP4,5 default High TRISIO = 0x00; // 全出力設定 ANSEL = 0x00; // デジタルに設定 WPU = 0x30; // GP4,5 プルアップ TMR0 = 0x64; // 初期値:100 (256-100)×128 => 20mS T0IE = 1; // Timer0 始動 /**** メインループ *****/ Count = 0; g_time = 120; // 初期値120秒(2分) 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=120; } // 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){ S7_Start(); // スタート S7_Out(0x40); // 移動表示モード S7_Stop(); S7_Start(); S7_Out(0xC0); // 開始位置左端 S7_Out(n1); // 左端 S7_Out(n2 | 0x80);// 左から2桁目+コロン S7_Out(n3); // 左から3桁 S7_Out(n4); // 右端 S7_Stop(); S7_Start(); S7_Out(0x8A); // 明るさ指定(4/16) S7_Stop(); } /*** 通信 Start ****/ void S7_Start(void){ /* CLk,DIOは通常:High */ DIO = 0; // 先にDIO=Low } /**** 通信 Stop ****/ void S7_Stop(void){ CLK = 0; // CLK Low DIO = 0; // DIO Low CLK = 1; // 先にCLKをHigh DIO = 1; // 後からDIOをHigh } /*** I2Cで1バイト出力 ***/ unsigned char S7_Out(unsigned char data){ char i; for(i=0; i<8; i++){ // 8回繰り返し CLK = 0; // CLK Low DIO = (data>>i) & 0x01; // ビット送信 CLK = 1; // CLK Highに戻す } CLK = 0; // クロック1Low CLK = 1; // ACK(DIO):low }