Codigo:
//***********************************************
//* Termometro digital
//* Por Daniel G - by RaDoN (30/4/05)
//* *********************************************
//* - Conección Display C.C.:
//* * RC0 -> Led (punto), RC1 -> G ... RC7 -> A
//* - Multiplexado displays 7 seg:
//* * RB4 -> 1er Dígito, RB3 -> 2o Dígito
//* RB0 -> Led Inidicador, RB5 -> Zumbador
//* RB7 -> 1er pulsador, RB6 -> 2o pulsador
//* - Entradas analogicas RA0 & RA1
//***********************************************
#include "16F876.h"
#fuses NOLVP,XT,NOWDT,NOPROTECT,PUT
#use delay (clock=4000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#byte port_a = 5
#byte port_b = 6
#byte port_c = 7
int i, zumbador=1, canal=0, flag_estado=1;
const int estado[4] = {0x1C,0xFC,0x6E,0x60};
#int_RB
void control_rb(void) {
const int c = 0x1A;
const int canales[2] = {0x60, 0xDA};
output_bit(PIN_B0,0);
output_bit(PIN_B5,0);
if(input(PIN_B7) == 0) {
if(canal == 0) {canal = 1;}
else {canal = 0;}
for(i=1;i<=100;++i) {
port_c = c;
output_bit(PIN_B4,1);
delay_ms(10);
output_bit(PIN_B4,0);
port_c = canales[canal];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }
set_adc_channel(canal);
delay_us(30);} // Tiempo de adquisición
if(input(PIN_B6) == 0) {
if(flag_estado == 0) {
flag_estado = 1;
for(i=1;i<=100;++i) {
port_c = estado[2];
output_bit(PIN_B4,1);
delay_ms(10);
output_bit(PIN_B4,0);
port_c = estado[3];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }
set_adc_channel(canal);
delay_us(30);}
else {
flag_estado = 0;
for(i=1;i<=100;++i) {
port_c = estado[0];
output_bit(PIN_B4,1);
delay_ms(10);
output_bit(PIN_B4,0);
port_c = estado[1];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }
set_adc_channel(canal);
delay_us(30);} }
}
void main(void) {
int sw=1, temperatura, unidades, decenas;
const int digitos[10]={0xFD,0x61,0xDB,0xF3,0x67,0xB7,0xBF,0xE1,0xFF,0xF7};
set_tris_a(0x0B); // RA0,RA1 y RA3 como entradas
port_b_pullups(TRUE); // Resistencias de polarización del puerto B
set_tris_b(0xC0); // RB7,RB6,RB2 & RB1 como entradas, RB3:5 & RB0 salidas
set_tris_c(0x00); // Puerto C entero como salida
setup_adc_ports(AN0_AN1_VSS_VREF); // RA0 y RA1 entradas analógicas
// RA3 referencia voltaje de entrada (2.5V)
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(30); // Tiempo de adquisición
while(1) {
temperatura = read_adc();
decenas = (int)temperatura/10;
unidades = (int)temperatura-(decenas*10);
if(canal == 0) {
if(temperatura < 15) {
if(sw == 1) { sw = 0;}
else { sw = 1;}
if(flag_estado == 1 && sw == 1) {
output_bit(PIN_B5,1);}
if(sw ==1) { output_bit(PIN_B0,1);}
for(i=1;i<=15;++i) {
if(decenas != 0) {
port_c = digitos[decenas];
output_bit(PIN_B4,1);
delay_ms(10);}
else {delay_ms(10);}
output_bit(PIN_B4,0);
port_c = digitos[unidades];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0);}
output_bit(PIN_B0,0);
output_bit(PIN_B5,0);}
if(temperatura >= 15 & temperatura <= 30) {
for(i=1;i<=15;++i) {
if(decenas != 0) {
port_c = digitos[decenas];
output_bit(PIN_B4,1);
delay_ms(10);}
output_bit(PIN_B4,0);
port_c = digitos[unidades];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }}
if(temperatura > 30) {
if(sw == 1) { sw = 0;}
else { sw = 1;}
if(flag_estado == 1 && sw == 1) {
output_bit(PIN_B5,1);}
if(sw ==1) { output_bit(PIN_B0,1);}
for(i=1;i<=15;++i) {
if(decenas != 0) {
port_c = digitos[decenas];
output_bit(PIN_B4,1);
delay_ms(10);}
else {delay_ms(10);}
output_bit(PIN_B4,0);
port_c = digitos[unidades];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0);}
output_bit(PIN_B0,0);
output_bit(PIN_B5,0);}
} // fin: if(canal == 0);
if(canal == 1) {
for(i=1;i<=15;++i) {
if(decenas != 0) {
port_c = digitos[decenas];
output_bit(PIN_B4,1);
delay_ms(10);}
output_bit(PIN_B4,0);
port_c = digitos[unidades];
output_bit(PIN_B3,1);
delay_ms(10);
output_bit(PIN_B3,0); }}
}} // fin while