/** * * A/D変換値(温度)を7 セグLEDに表示 * * PIC16F88 クロック:内蔵8MHz * * * RB1 A, RB2 B, RB3 C, RB4 D, RB5 E, RB6 F, RB7 G * 7セグLEDのピン対応は16,15,3,2,1,18,17 * RA4,RA5 プッシュSW, RA0,RB0 LED * 電源:5.0V * * Devvice Flags: * _CP_OFF _CCP1_RB3 _DEBUG_OFF _WRT_ENABLE_OFF * _CPD_OFF _LVP_OFF _BODEN_OFF _MCLR_OFF _PWRTE_ON * _WDT_OFF _INTRC_IO _IESO_ON__CFG2 _FCMEN_ON__CFG2 * * MikroC v7.0.0.3 * 書き込み時の注意 *CONFIGエラーが出た場合はPICプログラマで *CFG2 のPCMEM と IESO をDISABLE にすること。 */ //********************************************************************** //使用変数の定義 int cnt0; //TMR0用のカウンタ int cnt1; //TMR1用のカウンタ int cnt_20min; //20分用カウンタ unsigned short int cnt_1hour; //1時間用カウンタ unsigned short int cnt_1day; unsigned short int data[24]; unsigned short int day_max[7]; unsigned short int day_min[7]; int const LED_SEG[11] = {0x7E,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xce,0x80}; unsigned int port; unsigned int nowData; int maxData; int minData; unsigned short int port_b; unsigned short int ten; //十の位 unsigned short int one; //一の位 unsigned short int m; unsigned short int n; unsigned short int t; void interrupt(); void dynamic(); void main() { //マイコンの初期化 PORTA = 0b00000000; //PORTAの中身をきれいにする PORTB = 0b00000000; //PORTBの中身をきれいにする OSCCON = 0b01110000; //内臓クロック8MHzに設定 //A/D変換clock設定 0.125us*16倍=2.0us at 8MHz > 1.6us ADCON1.ADCS2=1; ADCON0.ADCS1=0; ADCON0.ADCS0=1; ADCON1.VCFG1 = 1;//基準電圧入力ポートをRA3に設定 ADCON1.VCFG0 = 0; // A/D利用PORTの設定 // ANALOG=1, DIGITAL=0 // ANSEL = 0b0000100; //RA2のみアナログ使用、他は全てデジタル使用 TRISA = 0b00111100; //RA2,3,4,5のみ1:入力に設定、他は0:出力 TRISB = 0b00000000; //PORTB 8ヶ全て出力に設定 Sound_Init(&PORTA, 1); //マイコンの初期化終わり PORTA.F0 = 1; Delay_ms(500); PORTA.F0 = 0; //タイマー0の設定について //8MH→0.125us, 1命令サイクルでは0.125x4=0.5us //プリスケーラを32 //30 x 0.5us x 32 = 0.48ms //タイマー1の設定について //8MH→0.125us, 1命令サイクルでは0.125x4=0.5us //プリスケーラを8 //5000 x 0.5us x 8 = 20ms OPTION_REG = 0x82; // TMR0プリスケーラ: 1/32 TMR0 = -20; // Timer0 Interval 0.32mS (@8MHz) INTCON.T0IE = 1;//タイマ0 オン PIE1.TMR1IE = 1; //タイマ1割り込みイネーブル PIR1.TMR1IF = 0; //フラグをクリア T1CON.T1CKPS1 = 1;// プリスケール1/8 T1CON.T1CKPS0 = 1; TMR1L = 119; TMR1H = 236; //(65535-5000)をセット 0.125 X 4 X 8 X 5000 = 20ms // TMR1L = 5; TMR1H = 255; //(65535-250)をセット 0.125 X 4 X 8 X 500 = 2ms //20倍速実験用 T1CON.TMR1ON = 1;//タイマ1 オン INTCON.PEIE = 1;// タイマー1の場合必要! INTCON.GIE = 1; //全体割り込み許可 ////////////変数の初期化 ten = 0; //誤動作防止のための初期値 one = 0; nowData = 0; cnt0 = 0; cnt1 = 0; cnt_20min = 0; cnt_1hour = 0;cnt_1day = 0; ////////////LEDなどのテスト Sound_Play(100, 20); //サウンドテスト PORTA.F0 = 1;PORTB.F0 = 1; //LEDテスト Delay_ms(50); PORTA.F0 = 0;PORTB.F0 = 0; PORTA.F6 = 1; PORTB.F1 = 1; Delay_ms(30); PORTB.F1 = 0; PORTB.F2 = 1; Delay_ms(30); PORTB.F2 = 0; PORTB.F3 = 1; Delay_ms(30); PORTB.F3 = 0; PORTB.F4 = 1; Delay_ms(30); PORTB.F4 = 0; PORTB.F5 = 1; Delay_ms(30); PORTB.F5 = 0; PORTB.F6 = 1; Delay_ms(30); PORTB.F6 = 0; PORTB.F7 = 1; Delay_ms(30); PORTB.F7 = 0; PORTA.F6 = 0; for (n = 0; n < 24; n++) { //data初期値に99を代入 data[n] = 99; } for (n = 0; n < 7; n++) { //data初期値に99を代入 day_max[n] = 99;day_min[n] = 99; } maxData = 99; minData = 99; //*************************************** /////////ここからメインのループ////////// //*************************************** do { //////////////アナログデータの取得(0~1023) if(cnt1 >= 100){ //間隔2秒(=20msec * 100回 ) port = ADC_Read(2); //RA2値をアナログデジタル変換 Delay_us(50); //50us待機 nowData = (port * 243)/1000; ten = nowData/10; one = nowData%10; cnt1 = 0; //カウンタリセット                  } ////////////////1時間ごとの処理 if ( cnt_1hour >= 3) { //20分X 3 Sound_Play(100, 50); for (n = 23; n > 0; n--) { //データ格納場所をずらす data[n] = data[n-1]; } data[0] = nowdata; maxData = data[0]; minData = data[0]; for (n = 0; n < 24; n++) { //最大値を求める if ((data[n] > maxData) && (data[n] !=99)) { maxData = data[n]; } } for (n = 0; n < 24; n++) { if (data[n] < minData) { minData = data[n]; } } cnt_1day++; cnt_1hour = 0; for (n = 0; n < 10; n++) { PORTB.F0 = 1; Delay_ms(10); PORTB.F0 = 0;Delay_ms(50);//LEDの点滅 } ////////////////24時間ごとの処理 if ( cnt_1day >=24 ) { for (n = 6; n > 0; n--) { //データ格納場所をずらす day_max[n] = day_max[n-1]; day_min[n] = day_min[n-1]; PORTB.F0 = 1; Delay_ms(10); PORTB.F0 = 0;Delay_ms(100);//LEDの点滅 } day_max[0] = maxData; //その時の最大、最小温度を格納 day_min[0] = minData; cnt_1day = 0; } } ////////////////ダイナミック点灯制御 if ( cnt1 <=50 ) { // 点灯時間を1秒にする dynamic(); } ////////////////スイッチ F4 押された場合の処理 if ( PORTA.F4 == 0) { PORTA.F6 = 0; PORTA.F7 = 0; dynamic(); Delay_ms(200); if ( PORTA.F4 == 0) { //長押しの場合は//24時間分1時間ごとの温度をを表示 for ( t=0; t<24; t++) { ten = data[t]/10; one = data[t]%10; Sound_Play(100, 30); for ( n = 0; n<30; n++) { for ( m = 0; m<200; m++) { dynamic(); } } PORTA.F6 = 0; PORTA.F7 = 0; } } else { //長押しで無い場合は24時間中の最大、最小値を表示 for ( m = 1; m <100; m= m+8) { //サウンド Sound_Play(3*m, 20); } ten = maxData/10; one = maxData%10; //最大値 PORTB.F0 = 1; Delay_ms(200); PORTB.F0 = 0;//オレンジLED点滅 for ( n = 0; n<180; n++) { for ( m = 0; m<200; m++) { dynamic(); } } PORTA.F6 = 0; PORTA.F7 = 0; Sound_Play(100, 50); //サウンド ten = minData/10; one = minData%10; //最小値 PORTA.F0 =1; Delay_ms(200); PORTA.F0 =0;//グリーンLED点滅 for ( n = 0; n<180; n++) { for ( m = 0; m<200; m++) { dynamic(); } } PORTA.F6 = 0; PORTA.F7 = 0; for ( m = 1; m <100; m= m+8) { //サウンド Sound_Play(3*m, 20); } } } ////////////////スイッチ F5 押された場合の処理 if ( PORTA.F5 == 0) { Delay_ms(200); if ( PORTA.F5 == 0) { //長押しの場合は7日分の最大値、最小値を表示 for ( t=0; t<7; t++) { ten = day_max[t]/10; one = day_max[t]%10; Sound_Play(100, 20); PORTB.F0 = 1; Delay_ms(200); PORTB.F0 = 0;//オレンジLED点滅 for ( n = 0; n<40; n++) { for ( m = 0; m<200; m++) { dynamic(); } } Delay_ms(200); ten = day_min[t]/10; one = day_min[t]%10; Sound_Play(100, 20); PORTA.F0 = 1; Delay_ms(200); PORTA.F0 = 0;//グリーン点滅 for ( n = 0; n<40; n++) { for ( m = 0; m<200; m++) { dynamic(); } } PORTA.F6 = 0; PORTA.F7 = 0; Delay_ms(200); } } else { //長押しで無い場合は24時間前の温度を表示 for (n = 0; n < 5; n++) { PORTB.F0 = 1; Delay_ms(10); PORTB.F0 = 0;Delay_ms(50);//LEDの点滅 PORTA.F0 = 1; Delay_ms(10); PORTA.F0 = 0;Delay_ms(50);//LEDの点滅 } ten = data[23]/10; one = data[23]%10; Sound_Play(100, 20); for ( n = 0; n<200; n++) { for ( m = 0; m<200; m++) { dynamic(); } } PORTA.F6 = 0; PORTA.F7 = 0; Delay_ms(200); } for ( m = 1; m <100; m= m+8) { Sound_Play(3*m, 20); } } } while(1); } //*************************************** /////////メインのループ終わり////////// //*************************************** void interrupt(){ if (INTCON.T0IF == 1) { //TMR0 をチェック INTCON.T0IF = 0; cnt0++; TMR0 = -30; } if (PIR1.TMR1IF == 1) { //TMR1 をチェック PIR1.TMR1IF = 0; cnt_20min++; if (cnt_20min >= 60000) { cnt_1hour++; cnt_20min = 0; } cnt1++; TMR1L = 119; TMR1H = 236; // TMR1L = 5; TMR1H = 255; //20倍速実験用 } } void dynamic() { if ( cnt0 == 0 ) { PORTB = LED_SEG[ten]; } if ( cnt0 == 20 ) { PORTA.F6 = 1; } if ( cnt0 == 25 ) { PORTA.F6 = 0; } if ( cnt0 == 45 ) { PORTB = LED_SEG[one]; } if ( cnt0 == 65 ) { PORTA.F7 = 1; } if ( cnt0 == 70 ) { PORTA.F7 = 0; } if ( cnt0 >= 90 ) { cnt0 = 0; } }