//温度計
//日付：2011/02/28
//PIC：PIC12F683
//製作者：KK

#include<12f683.h>
#device ADC=10
#fuses INTRC_IO,BROWNOUT,NOWDT,NOCPD,NOPROTECT,NOMCLR
#use delay(clock=4MHz)

//ポート定義
#byte	GP=5

#bit	CLK=GP.0
#bit	STB=GP.5
#bit	PSW=GP.3
#bit	DATA=GP.4

#define Vref 4.00	//基準電圧

//関数宣言
void psw_ch(void);

//変数宣言
unsigned char disp[13]={	//7セグメントLED文字・数字表示用配列
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67,	//0123456789
0x39,0x71,0x40	//CF-
};
unsigned long sig[4]={0,0,0,0};
signed long dat=0,ad=0,ad_data=0,ad_data2=0,kashi=0,kashi2=0;
unsigned int a=0,p=0,send=0,segment=0,led_sig=1;
unsigned int cnt1=0;
float ad_fl,kashi_fl;

//メイン関数
void main(void){
	//ポート初期設定
	set_tris_a(0x0e);
	//A/D変換設定
	setup_adc_ports(sAN2 | VSS_VREF);
	setup_adc(ADC_CLOCK_DIV_32);
	//timer0割り込み設定
	setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
	enable_interrupts(INT_TIMER0);
	enable_interrupts(GLOBAL);
	//初期化
	GP=0x00;
	
	while(TRUE){
		set_adc_channel(2);
		ad=read_adc();
		
		ad_fl = (float)ad * (Vref/1023);
		ad_data = (ad_fl*10) + 0.5;
		
		kashi_fl = 1.8 * ad_data + 32;
		kashi = kashi_fl + 0.5;
		kashi2 = (kashi_fl/10) + 0.5;
		delay_ms(200);
	}
}

//割り込み処理
#INT_TIMER0
void timer(void){
	set_timer0(6);	//1ms割り込み
	
	//スイッチ状態確認関数呼び出し
	psw_ch();
			
	//シフトレジスタ信号送信
	STB=1;
	CLK=0;
	
	dat = ((led_sig)) + (sig[segment] << 4);	//送信データをまとめる
	
	for(send=0;send<12;send++){			//12bitデータ送信
		CLK=0;
		DATA=(dat >> send) & 0x01;
		CLK=1;
	}
	STB=0;
	CLK=0;
	
	//7セグメントLEDダイナミック点灯
	switch(segment){
		case 0:
			segment++;
			led_sig=1;
			break;
		case 1:
			segment++;
			led_sig=2;
			break;
		case 2:
			segment++;
			led_sig=4;
			break;
		case 3:
			segment=0;
			led_sig=8;
			break;
	}
	
	
	if(!a){
		sig[0]=disp[ad_data % 10];
		if(ad_data>9){
			sig[1]=disp[ad_data / 10];
		}
		else{
			sig[1]=0x00;
		}		
		sig[2]=disp[12];
		sig[3]=disp[10];
	}
	else{
		sig[0]=disp[kashi % 10];
		if(kashi>9){
			if(kashi>99){
				sig[1]=disp[(kashi-100) / 10];
			}
			else{
				sig[1]=disp[kashi / 10];
			}	
		}
		else{
			sig[1]=0x00;
		}
		if(kashi<100){
			sig[2]=disp[12];
		}
		else{
			sig[2]=disp[kashi2 / 10];
		}	
		sig[3]=disp[11];
	}	
				
	//カウンタ
	cnt1++;
}

//スイッチ状態確認
void psw_ch(void){
	switch(p){
		case 0:
			if(!PSW){
				p=1;
			}
			cnt1=0;
			break;
		
		case 1:	//チャタリング対策
			if(cnt1<=10 && PSW){
				p=0;
			}
			else if(cnt1>10 && !PSW){
				p=2;
			}
			break;
		
		case 2:
			if(PSW){
				p=3;
			}
			cnt1=0;
			break;				
		
		case 3:	//チャタリング対策
			if(cnt1<=10 && !PSW){
				p=2;
			}
			else if(cnt1>10 && PSW){
				p=4;
			}
			break;
						
		case 4:
			p=0;
			a=~a;
			break;
	}
}