※拡張子変更main.txt→main.c /***************************************************** * 7Seg_LEDのテストプログラム <<2分カウントダウン>> * 疑似I2Cインターフェース(IC:CT1642)で * 7seg(カソードコモン)に接続 * スレーブアドレス無し、 * 書込み:表示データは0ビット→7ビット * 〃 :桁(位置)アドレスは7ビット→4ビット * PIC 12F683 MPLAB IDE Ver8.84 HI-TECH C * GP4:SDA GP5:SCL GP2:LED+ ******************************************************/ #include #define _XTAL_FREQ 4000000 // クロック周波数設定 //#define _XTAL_FREQ 8000000 /***** コンフィギュレーションの設定 ********/ __CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & BOREN_ON & MCLRE_ON & CP_OFF & IESO_OFF & FCMEN_OFF); #define SDA GP4 #define SCL GP5 /* 0〜9の数字のデータ */ 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 keisan(void); void S7_Hyoji(char n1, char n2, char n3, char n4); void S7_write(char data,char Address); void delay_10us(unsigned char t1); // 10us遅延 /******** メイン関数 ************/ void main(void){ CMCON0 = 0x07; // コンパレータオフ OSCCON = 0x60; // Set to 4MHz // OSCCON = 0x70; // Set to 8MHz 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(); GP2 ^= 1; } S7_Hyoji(s1, s2, s3, s4); } } /* 割込み処理 */ 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]; } void S7_Hyoji(char n1,char n2,char n3,char n4){ S7_write(n1,0x7f); delay_10us(1); S7_write(n2,0xbf); delay_10us(1); S7_write(n3,0xdf); delay_10us(1); S7_write(n4,0xef); delay_10us(1); } // 7セグに表示 void S7_write(char data,char Address){ char i; for(i=0; i<4; i++){ SCL = 0; if((Address << i) & 0x80){ SDA = 1; }else{ SDA = 0; } SCL = 1; } SCL = 0; SDA = 1; for(i=0;i<6;i++){ SCL = 1; SCL = 0; } // 表示データ for(i=0; i<8; i++){ // 8回繰り返し SCL = 0; // SDA = (data>>i) & 0x01; // ビット送信 SCL = 1; // } // 後処理 SDA = 0; SDA = 1; SCL = 0; SDA = 0; SDA = 1; } // 遅延タイマ void delay_10us(unsigned char t1){ while(t1){ __delay_us(10); // 10μsec t1--; // 10μsec x time } }