/*NiMH充電池・直列充電器*/ /*単3x2本、Startスイッチにより満充電まで充電実行*/ //2024/2/20:7セグ温度計を参考に作成 by T.Inoue #include __CONFIG(UNPROTECT&LVPDIS&BORDIS&PWRTEN&WDTDIS&HS); #define _XTAL_FREQ 4000000 //4MHz ioport(); v_count(); sevenseg(); int a,b,c; int STROBE=0x04; int POINT1,POINT2,POINT3; long value,v1,v2,v3; int segment_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x40,0x80}; main() { while(1) { if(RC3 == 0) break; //Start } ioport(); b=3; while(b>0) { RA2=0; //充電on a=20; while(a>0) //ループa { c=250; while(c>=0) //ループc { c=c-1; if(c==0) { a=a-1; ADCS1=1; //Frc/32 A/D変換クロック ADCS0=0; ADFM=1; // A/D変換結果データは右詰めにする ADON=1; // A/Dコンバータを電源ONにする /*電圧測定*/ CHS2=0; //AN0ピンでvolt0の電圧をAD変換する CHS1=0; CHS0=0; GODONE=1; // A/D変換開始 __delay_us(60); // 60us待つ while(GODONE); //A/D変換が終わるまで待つ value=(ADRESH*256)+ADRESL; // A/D変換結果をvalueに書く v_count(); //7seg桁数字計算 ADCON0=0; break; } sevenseg(); //7seg電圧表示 } } } } ioport() { TRISA=0x03; /* b00000011 RA0,1,2ピンはアナログ入力ピンRA3,4,5はデジタルI/Oピン */ TRISB=0x00; /* b00000000 RB0-7ピンは出力ピン */ TRISC=0x08; /* b00001000 RC0-2ピンは出力ピン RC3は入力ピン*/ PCFG3=0; //AN0、1はアナログ,AN2はデジタル PCFG2=1; PCFG1=0; PCFG0=0; CMCON=0x07; // b00000111 コンパレータはoff } v_count() { value /=2.05; //電圧に換算1024/500=2.05 v3=value/100; v2=(value-v3*100)/10; v1=value-v3*100-v2*10; if(value >= 300){ //3.0V以上 RA2 = 1; //充電off充電完了 b=b-1; } } sevenseg() { if((STROBE<<=1)==0x08) { STROBE=0x01; POINT1=v1; PORTB=segment_data[POINT1]; //1桁 PORTC=STROBE; __delay_ms(3); PORTC=0; __delay_us(500); } if(STROBE==0x02) { POINT2=v2; PORTB=segment_data[POINT2]; //2桁 PORTC=STROBE; __delay_ms(3); PORTC=0; __delay_us(500); } if(STROBE==0x04) { POINT3=v3; PORTB=segment_data[POINT3]; //3桁目 PORTC=STROBE; __delay_ms(3); PORTB=segment_data[11]; //小数点on __delay_ms(3); PORTC=0; __delay_us(500); } }