※〜.txt を 〜.c に書き換えて利用 /***************************************************** * 7Seg_LEDのテストプログラム <<2分カウントダウン>> * 疑似I2Cインターフェース(IC:FD650K=TM1650)で * 7seg(カソードコモン)に接続 * (スレーブアドレス無し、書込み:7ビット→0ビット) * * 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 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 // 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(); 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(0x48); // データコマンド S7_Out(0x31); // 輝度3:8ビット制御 S7_Stop(); S7_Start(); S7_Out(0x68); // Dig1のアドレス S7_Out(n1); // 左端 S7_Stop(); S7_Start(); S7_Out(0x6A); // Dig2のアドレス S7_Out(n2); S7_Stop(); S7_Start(); S7_Out(0x6C); // Dig3のアドレス S7_Out(n3); S7_Stop(); S7_Start(); S7_Out(0x6E); // Dig4のアドレス S7_Out(n4); // 右端 S7_Stop(); } /*** 通信 Start ****/ void S7_Start(void){ /* CLk,SDAは通常:High */ SDA = 0; // 先にSDA=Low } /**** 通信 Stop ****/ void S7_Stop(void){ SCL = 0; // SCL Low SDA = 0; // SDA Low SCL = 1; // 先にSCLをHigh SDA = 1; // 後からSDAをHigh } /*** 1バイト出力(要:9ビット目SCL OFF/ON) ***/ unsigned char S7_Out(unsigned char data){ unsigned char i, BitPos; /* Data Out */ BitPos = 0x80; // ビット位置初期値(左端) for(i=0; i<8; i++){ // 8回繰り返し if((data & BitPos) != 0){// ビット出力 SDA = 1; // SDA High } else { SDA = 0; // SDA Low } SCL = 0; SCL = 1; BitPos = BitPos >> 1; // ビット位置移動 SCL = 0; // SCL Highに戻す } SCL = 0; // クロック1Low SCL = 1; // クロックHighに戻す SCL = 0; }