#include "htc.h"
#include "pic.h"
__CONFIG (XT & WDTDIS & PWRTEN & UNPROTECT);
#define _XTAL_FREQ 4000000
#define DS RB7
#define DSIO TRISB7
#define DP RA4
#define bs(var, bitno) ((var) |= 1UL << (bitno))
#define bc(var, bitno) ((var) &= ~(1UL << (bitno)))
#define DT 5 //длительность импульса подсветки разряда динамической индикации

unsigned char DS_DAT, sgn, UST, HIS=1;
unsigned char cnt,cnt1, des, ed;
bit hlf=0, minus=0, rdt=0, npt=0, key=0, opr=0, dspr;
unsigned char number[] = 
{
  0b11000000, //0
  0b11111001, //1
  0b10100100, //2
  0b10110000, //3   
  0b10011001, //4
  0b10010010, //5 
  0b10000010, //6
  0b11111000, //7   
  0b10000000, //8
  0b10010000,  //9
  0b10111111,  //-
  0b11111111  // blank
};



void init (){
	OPTION=0b01000111;
	PORTA=0b00010000;
	PORTB=255;
	TRISA=0b00000000;
	TRISB=0b10000000;
	UST=eeprom_read(0);
	if (UST>9) UST=6;

}

void conv (void){
	des=DS_DAT/10;
//ed=DS_DAT%10;
	ed=DS_DAT-des*10;
	npt=0;
	if (des>0) npt=1;

		
}
void DS_TX (unsigned char dsd){
	unsigned char b;

	for (b=1; b<9; b++){
		DS=0;
	__delay_us(10);
		if (dsd&0b00000001) DS=1;
		dsd=dsd>>1;
	__delay_us(50);
	DS=1;

		}
}
void DS_RST (){
	DSIO=0;
	DS=0;
	__delay_us(520);
	DSIO=1;
	dspr=0;
	for (unsigned char a=0; a<100; a++){
			if (DS==0) {dspr=1; break;}
			}	
	__delay_us(520);
	DSIO=0;
}

unsigned char DS_RX(void){
	unsigned char a, b;
	for (b=0; b<8; b++){
	DS=0;
	DSIO=1;
	__delay_us(10);
	a=a>>1;
	if (DS==1) a=a|(1<<7);
	__delay_us(50);
	DSIO=0;
	}
	return a;	
}

void DS18S20(void){

	if (rdt==0) {
		DS_RST ();
		DS_TX (0xCC);
		DS_TX (0x44);
		rdt=1;
		__delay_ms(1);
		}	
		else {
			DS_RST ();
			DS_TX (0xCC);
			DS_TX (0xBE);
			rdt=0;


			DS_DAT=DS_RX();
			sgn=DS_RX();

//			DS_RST();

			hlf=0;
			if ( (DS_DAT&0b00000001) && !(sgn&0b00000001) ) hlf=1;
			if (!(DS_DAT&0b00000001) && (sgn&0b00000001)) hlf=1;
	
			DS_DAT=DS_DAT>>1;

			minus=0;
			if (sgn&0b10000000) {
				DS_DAT=127-DS_DAT;
				minus=1;
				}
			
 			}		

	conv();
cnt=0;
}

void main(){
	init ();
mn:
//	TRISB0=0;
	cnt=0;
	rdt=0;
	while (1) {



	if (npt==0) {if (hlf==1) PORTB=number[5];
						else PORTB=number[0];
						}
					else {PORTB=number[ed]; DP=!(hlf);}
	if (dspr==0) PORTB=number[10];
//	DP=1;
	RA0=1;
	__delay_ms(DT);
	RA0=0;	
								

	DP=1;
	if (npt==0) {PORTB=number[ed]; 	DP=0;}
					else PORTB=number[des];
	if (dspr==0) {PORTB=number[10]; DP=1;}		
	RA1=1;
	__delay_ms(DT);
	RA1=0;								
	

	if (minus==0) PORTB=number[11]; 					
				else PORTB=number[10];
	if (dspr==0) PORTB=number[10];
	DP=1;
	RA2=1;
	if (opr==1) {DS18S20(); opr=0; __delay_ms(1.56);}
			else __delay_ms(DT);
	RA2=0;
				
	if (DS_DAT>=(UST+HIS)) RA3=1;
	if (DS_DAT<(UST-HIS)) RA3=0;
				
	TRISB0=1;
	if (RB0==0)	goto ut;
	TRISB0=0;

	cnt++;
	if (cnt==111) opr=1;
	}

ut:
	TRISB0=0;
	cnt=0;
	cnt1=0;
	while(1){
	
	TRISB0=1;
	while (RB0==0) 	__delay_ms(100);
	TRISB0=0;
	
	PORTB=number[UST];
	RA0=1;
	__delay_ms(DT);
	RA0=0;	
			
	PORTB=255;							
	RA1=1;
	__delay_ms(DT);
	RA1=0;								
	
	PORTB=0b00000111;
	RA2=1;
	__delay_ms(DT);
	RA2=0;

	TRISB0=1;
	if (RB0==0) {UST++; if (UST==10) UST=2; cnt=0; cnt1=0; key=1;
	__delay_ms(100);
	while (RB0==0);	
	__delay_ms(100);}
	TRISB0=0;

	__delay_ms(1);
	cnt++;
	if (cnt==255) cnt1++;
	if (cnt1==2) {
			if (key==1) {eeprom_write (0, UST); key=0;} 
			goto mn;}
	
	}

}