/*デジタル温度計(室内室外温度自動切り替え式)*/ /*参照:楽しくできるC&PIC制御実験9.1デジタル温度計,C&PIC実用回路*/ /*division1.0:2014-02-07 温度senser LM35D による表示 by Takehiko Inoue*/ /*division2.1:2024-01-23 温度senser MCP9700A使用によるオフセット値追加*/ /*division2.2:2024-02-8 0°C以下の(-)表示を4桁目に表示するよう追加し、測定範囲を-40°C〜50°Cとした*/ #include __CONFIG(UNPROTECT&LVPDIS&BORDIS&PWRTEN&WDTDIS&HS); #define _XTAL_FREQ 10000000 v_count(); display1(); display2(); int a,c; int b,j; int k; int STROBE=0x08; int POINT1,POINT2,POINT3; unsigned short value,v1,v2,v3; int segment_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x40,0x80}; main() { while(1) { if(RC4==0) break; } TRISA=0x03; TRISB=0x00; TRISC=0x10; 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; CHS1=0; CHS0=0; /* AN0 pin convert */ GODONE=1; /* A/D convert */ __delay_us(60); while(GODONE); value=(ADRESH*256)+ADRESL; /* result */ v_count(); ADCON0=0; break; } if(k==1) { display1(); } else{ display1(); display2(); } } } j=20; while(j>=0) /*loop 4 */ { RA2 =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; CHS1=0; CHS0=1; /* AN1 pin convert */ GODONE=1; /* A/D convert */ __delay_us(60); while(GODONE); value=(ADRESH*256)+ADRESL; /* result */ v_count(); ADCON0=0; break; } if(k==1)display1(); else{ display1(); display2(); } } } } } 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; } display1() { if((STROBE<<=1)==0x10) { 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); } } display2() { if(STROBE==0x08) { PORTB=segment_data[10]; PORTC=STROBE; __delay_ms(3); PORTC=0; __delay_us(500); } }