#include "stm32f10x.h"

void delay (uint16_t intpsc,uint16_t arr);
void ADC1_2_IRQHandler (void);
static volatile float temperatura = 0.0;
int main(void)
{
volatile uint32_t dly;

RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;				
RCC->APB2ENR|=RCC_APB2ENR_IOPBEN;
RCC->APB1ENR|=RCC_APB1ENR_TIM2EN;
RCC->APB1ENR|=RCC_APB1ENR_TIM3EN;
RCC->APB2ENR|=RCC_APB2ENR_ADC1EN;
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6;
	
GPIOA->CRL =0x22222220;
GPIOA->CRH =0x44444442;
GPIOB->CRL =0x44444422;
GPIOB->CRH =0x44442244;
	
	TIM3->CR1|=0x01;											
	TIM3->PSC=60000;											
	TIM3->ARR=2400;
	TIM3->CNT=0;
	
	RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6;
	
	ADC1->SMPR2|= ADC_SMPR2_SMP0;
	ADC1->CR2 |= ADC_CR2_ADON | ADC_CR2_CONT;
	for(dly = 0; dly < 5000; dly++);
	ADC1->CR2 |= ADC_CR2_ADON;
	for(dly = 0; dly < 5000; dly++);
	ADC1->CR2 |= ADC_CR2_CAL;
	for(dly = 0; dly < 5000; dly++);
	ADC1->SQR3 = 0x0;
	for(dly = 0; dly < 5000; dly++);
	
	ADC1->CR1 |= ADC_CR1_EOCIE;
	NVIC_EnableIRQ(ADC1_2_IRQn);
	
	
volatile unsigned short disp_ano [10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11111000,0b10000000,0b10011000};

volatile int temp=0;
volatile int m=0,c=0,d=0,u=0;
while (1) {
	temp=temperatura*10;	
	m=temp/1000;
	c=((temp%1000)-(temp%100))/100;
	d=((temp%100)-(temp%10))/10;
	u=temp%10;
		
			
	/*GPIOB->ODR=0x0;
	GPIOA->ODR=0xFFFF;
	GPIOB->ODR=0x02|0x0400|0x0800;
	GPIOA->ODR=(disp_ano[m]<<1);
	delay(60000,10);*/
	GPIOB->ODR=0x0;
	GPIOA->ODR=0xFFFF;
	GPIOB->ODR=0x01|0x0400|0x0800;
	GPIOA->ODR=disp_ano[c]<<1;
	delay(60000,10);
	GPIOB->ODR=0x0;
	GPIOA->ODR=0xFFFF;
	GPIOB->ODR=0x01|0x02|0x0800;
	GPIOA->ODR=disp_ano[d]<<1&0x0FE;
	delay(60000,10);
	GPIOB->ODR=0x0;
	GPIOA->ODR=0xFFFF;
	GPIOB->ODR=0x01|0x02|0x0400;
	GPIOA->ODR=disp_ano[u]<<1;
	delay(60000,10);		
	}
}
	


void delay (uint16_t psc,uint16_t arr)
{
TIM2->CR1|=0x08;											
TIM2->PSC=psc;											
TIM2->ARR=arr;
TIM2->CNT=0;
TIM2->CR1|=0x01;
volatile int done=0;
	
	while (done!=1)
	{  	
	if ((TIM2->SR & 0x0001)>0)
		{
			TIM2->SR &= ~TIM2->SR;
			done=1;
		}
	}
}
void ADC1_2_IRQHandler (void)
{

	if(((ADC1->SR & ADC_SR_EOC)==0x02)&&(TIM3->SR & 0x0001)>0)
	{
		temperatura=((ADC1->DR)/4095.0)*330;
		TIM3->SR &= ~TIM3->SR;
		TIM3->CR1|=0x01;
	}
	else {ADC1->SR &= 0x1D;}
}