Vai al contenuto
PLC Forum


Termometro Con 16f876 - ho sviluppato il programma.. consigli per il miglioramento?


Simons

Messaggi consigliati

salve a tutti. E' da un po' che lavoro dietro a un progettino di un semplice termometro con ad590 e pic16f876 multiplexando 3 display 7 segmenti...

ho sviluppato il programma in C con CCS compiler...

purtroppo sono un po' alle prime armi con queste cose e il prog è un po' confusionato..

utilizzo la porta C come 7 segmenti, la porta B come enable per i display, inoltre il bit 7 della porta B come "meno" per le temperature negative.

questo è il programma... mi sapete dare qualche consiglio per il miglioramento? grazie mille a tutti

(se il codice non è di facile comprensione posso aggiungere dei commenti) :)

#include "adconvert.h"


BOOLEAN neg;
int decimali;
float tOut(float ad)
{
float OUTPUT;
int tmp;

   if(ad<341)
   {

      OUTPUT=(abs(((ad*1000)*58.651026)-22497145.66))/1000000; 

      tmp=OUTPUT;
      decimali=(OUTPUT-tmp)*10;
      neg=1;
   }
   if(ad>=341)
   {
      OUTPUT=(abs(((ad*1000)*58.651026)-22497145.66))/1000000;
      tmp=OUTPUT;
      decimali=(OUTPUT-tmp)*10;
      neg=0;
   }
return OUTPUT;
}

void DisplayOutput(int portb, int portc)
{
output_b(portb);
output_c(portc);
}

void main()
{
unsigned char DisplayMatrix[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int uni,dec,cent,i;
float value,tmp,read;

PicInit();

set_tris_b(0x00);
set_tris_c(0x00);



   while(1)
   {
      read=0;
      tmp=0;
      value=0;
      for(i=0;i<10;i++)
      {
        read+=read_adc();
      }
      
      tmp=read/10;
      value=tOut(tmp);
      cent=(value/100);
      dec=((value-(cent*100))/10);
      uni=((value-((cent*100)+(dec*10))));

         if(neg==1)
         {

            DisplayOutput(0x81,~DisplayMatrix[dec]);
            DisplayOutput(0x82,~DisplayMatrix[uni]^0x80);
            DisplayOutput(0x84,~DisplayMatrix[decimali]);
            output_b(0x80);
         }else{

            DisplayOutput(0x01,~DisplayMatrix[dec]);
            DisplayOutput(0x02,~DisplayMatrix[uni]^0x80);
            DisplayOutput(0x04,~DisplayMatrix[decimali]);
            output_b(0x00);
         }

   }

}

:) grazie

Link al commento
Condividi su altri siti


avevo già visto quello schema... io però uso display a 7 segmenti direttamente pilotati dalla porta senza codice bcd. e poi non conosco il compilatore che usa quel codice :(

io uso CCS compiler...

ciao :)

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...