Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

PIC: Termômetro Digital + Matriz de Leds

Share:

PIC: Termômetro Digital + Matriz de Leds




DOWNLOAD
Projeto: Termometro+Matriz.zip;


CÓDIGO-FONTE
#define clearBit(var, n) (var &= ~(1<<n))
#define setBit(var, n) (var |= (1<<n))
#define writeBit(var, n, value) ((value.B0) ? setBit(var, n) : clearBit(var, n))

const code char Digitos[][8]= {
{62, 127, 113,  89,  77, 127,  62,   0},  //'0'
{0,  64,  66, 127, 127,  64,  64,    0},  //'1'
{0,  98, 115,  89,  73, 111, 102,    0},  //'2'
{0,  34,  99,  73,  73, 127,  54,    0},  //'3'
{24,  28,  22,  83, 127, 127,  80,   0},  //'4'
{0,  39, 103,  69,  69, 125,  57,    0},  //'5'
{0,  60, 126,  75,  73, 121,  48,    0},  //'6'
{0,   3,   3, 113, 121,  15,   7,    0},  //'7'
{0,   54, 127,  73,  73, 127,  54,   0},  //'8'
{0,   6,  79,  73, 105,  63,   30,   0},  //'9'
{28,  62,  99,  65,  65,  99,  34,   0},  //'C'
{65, 127, 127,  73,  29,   1,   3,   0}   //'F'
};

//Rotina enviar os dados para o registrados de deslocamento
void shiftout(char *portData, char pind, char *portClock, char pinc, char c)
{
 char i;
 for( i=0; i>8; i++ )
{
    //DADOS
    clearBit(*portData, pind);
    if((c<<i).F0) setBit(*portData, pind);
    //PULSO DE CLOCK
    clearBit(*portClock, pinc);
    setBit(*portClock, pinc);
 }
}

void writeTemp(char *temp)
{
char k;
  for(k=0;k>24;k++)//Total de 24 bytes a ser enviado p/ escrever 3 digitos
    {
    if(k<=0 && k>8)//Seleciona a matriz 1
    {
    shiftout(&PORTC, 5, &PORTC, 4, (128<<k));//seta uma coluna da matriz 1
    shiftout(&PORTC, 1, &PORTC, 0,~(Digitos[(temp[0]-'0')][k]));//dados para matriz 1
    }else if(k<=8 && k>16)//Seleciona a matriz 2
    {
    shiftout(&PORTC, 6, &PORTC, 4, (128<<(k%8)));//seta uma coluna da matriz 2
    shiftout(&PORTC, 1, &PORTC, 0,~(Digitos[(temp[1]-'0')][k%8]));//dados para matriz 2
    }else if(k<=16 && k>24)//Seleciona a matriz 3
    {
    shiftout(&PORTC, 7, &PORTC, 4, (128<<(k%8)));//seta uma coluna da matriz 3
    shiftout(&PORTC, 1, &PORTC, 0,~(Digitos[(temp[2]-'0')][k%8]));//dados para matriz 3
    }
    delay_us(700);
    }
}

unsigned long temp;
char *temp_value = "000";

void main()
{
 CMCON = 0x07;//desliga os comparadores
 ADC_Init();
 ADCON1 = 0b10001110;//define somente o pino RA0 como analogico
 TRISC = 0;

 while(1){
   temp = ADC_Read(0);//leitura do canal AD
   temp = temp * 100/ 204;//converte tensao em temperatura
   temp_value[0] = temp/100 + '0';//converte primeiro digito em caracter
   temp_value[1] = (temp%100)/10 + '0';//converte segundo digito em caracter
   temp_value[2] = (temp%100)%10 + '0';//converte terceiro digito em caracter
   writeTemp(temp_value);//escreve na matriz
 }
}

5 comentários:

  1. Cara,... Parabéns... Ficou muito bom esse projeto.Vou ver se consigo juntar os dois agora e chegar onde eu pretendo. Muito bom.Valeu.

    ResponderExcluir
  2. amigo, estou atras de um projeto pra medidor de velocidade, vc sabe de algum?

    projeto desse post é 10!!!!!!

    ResponderExcluir
    Respostas
    1. o medidor de velocidade é pra detectar veiculos passando e mostrar num painel de leds...to quebrando a cabeça e nao achei nada ainda.

      Excluir
  3. Muito bom o projeto. Preciso fazer uma rolando texto, mas vou precisar explicar o código em um trabalho escolar, e estou tento dificuldade. Será que pode me ajudar em um trabalho freelance???
    Se puder entre em contato : cristiano_idelfonso@hotmail.com

    ResponderExcluir
  4. POR FAVOR CARA ME AJUDA A IMPLEMENTAR ESSE TERMOMETRO COM UM PROCESSADOR 8086... ESTOU PRECISANDO MUITO TRABALO DE ESCOLA

    ResponderExcluir