/*7seg3桁デジタル温度計(室内室外温度自動切り替え式)*/ /*参照:楽しくできるC&PIC制御実験9.1デジタル温度計,C&PIC実用回路*/ /*division1.0:2014-02-07 873A 温度senser LM35D による表示 by Takehiko Inoue*/ /*division2.1:2024-01-23 873A互換876A 温度senser MCP9700A使用によるオフセット値追加*/ /*division2.2:2024-01-26 0°C以下の(-)表示を1桁目に表示するよう追加し、測定範囲を-40°C〜50°Cとした*/ /*division2.3:2024-02-9 0°C以下の(-)表示を3桁目に表示するよう追加し、測定表示範囲を-9.9°C〜50°C、小数点を2桁目とした*/ #include __CONFIG(UNPROTECT&LVPDIS&BORDIS&PWRTEN&WDTDIS&HS); #define _XTAL_FREQ 10000000 v_count(); sevenseg(); sevenseg0(); int c,b,a,j,k; 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; } TRISA=0x03; TRISB=0x00; TRISC=0x08; while(1) { a=20; RA2=0; /*outdoor off*/ while(a>0) { /*loop 6*/ c=250; while(c>=0) /*loop 3 */ { c=c-1; if(c==0) /* loop 2 in */ { a=a-1; ADCS1=1; /*A/D hennkan Fosc/32 */ ADCS0=0; ADFM=1; /*A/D hennkankekka rigth */ ADON=1; /* A/D converter poewr ON */ CHS2=0; /* AN0 pin convert */ CHS1=0; CHS0=0; GODONE=1; /* A/D convert */ __delay_us(60); while(GODONE); value=(ADRESH*256)+ADRESL; /* result */ v_count(); ADCON0=0; break; } if(k ==1){ sevenseg(); } else { sevenseg0(); } } } j=20; while(j>=0) /*loop 4 */ { RA2 ^=1; /*RA5 ^=1;/*outdoor on toggle*/ b=250; while(b>=0) { b=b-1; if(b==0) /*loop 5 in */ { j=j-1; ADCS1=1; /*A/D hennkan Fosc/32 */ ADCS0=0; ADFM=1; /*A/D hennkankekka rigth */ ADON=1; /* A/D converter poewr ON */ CHS2=0; /* AN1 pin convert */ CHS1=0; CHS0=1; GODONE=1; /* A/D convert */ __delay_us(60); while(GODONE); value=(ADRESH*256)+ADRESL; /* result */ v_count(); ADCON0=0; break; } if(k ==1){ sevenseg(); } else { sevenseg0(); } } } } } v_count() { if(value < 513){ value = 512 - value; /*-温度表示*/ k =0; } else { value -=512; /*MCP9700A特性オフセット値2024-01-22追加*/ k =1; } __delay_us(60); v3=value/100; v2=(value-v3*100)/10; v1=value-v3*100-v2*10; } sevenseg() { if((STROBE<<=1)==0x08) { STROBE=0x01; POINT1=v1; PORTB=segment_data[POINT1]; PORTC=STROBE; __delay_ms(3); PORTC=0; __delay_us(500); } if(STROBE==0x02) { POINT2=v2; PORTB=segment_data[POINT2]; PORTC=STROBE; __delay_ms(3); PORTB=segment_data[11]; __delay_ms(3); PORTC=0; __delay_us(500); } if(STROBE==0x04) { POINT3=v3; PORTB=segment_data[POINT3]; PORTC=STROBE; __delay_ms(3); PORTC=0; __delay_us(500); } } sevenseg0() { if((STROBE<<=1)==0x08) { STROBE=0x01; POINT1=v1; PORTB=segment_data[POINT1]; PORTC=STROBE; __delay_ms(3); PORTC=0; __delay_us(500); } if(STROBE==0x02) { POINT2=v2; PORTB=segment_data[POINT2]; PORTC=STROBE; __delay_ms(3); PORTB=segment_data[11]; __delay_ms(3); PORTC=0; __delay_us(500); } if(STROBE==0x04) { PORTB=segment_data[10]; PORTC=STROBE; __delay_ms(3); PORTC=0; __delay_us(500); } }