thanks for help...
how i can do for show the fianl design and the software made it??
Posted on: December 15, 2007, 04:59:04 16:59 - Automerged
This is the software:
//Cabeceras para diferentes dispositivos y opciones
#include <16f877a.h> //pic a utilizar
#device ADC=8
#fuses XT,NOWDT,NOPROTECT,PUT,nobrownout,nolvp //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#include<keypad4x4.c> //libreria manejo keypad
#include<lcd2.c> //libreria manejo lcd 8bits
#use fast_io(B)
#use fast_io(C)
#use i2c(MASTER, SDA=PIN_c4, SCL=PIN_c3, slow)
//funciones
void hora(void);
void tanques(void);
void imprimir(void);
void ajustes(void);
void toma_adc(void);
//variables globales
char c; //variable donde se almacena tecla pulsada
char y=1; //indice columnas
signed char x=1;
int w;
int tank0=0x00; // variable ke guarda dato de adc canal 0
int tank1=0x00; // variable ke guarda dato de adc canal 1
float var01;
float var02;
int16 retardo; //Cada cuando actualiza lectura en LCD
//Dato en registro ds, a mandar o leer
int seconds,minutes,hours,day,date,month,year,control;
//Registros DS1307
#define ds_seconds 0x00
#define ds_minutes 0x01
#define ds_hours 0x02
#define ds_day 0x03
#define ds_date 0x04
#define ds_month 0x05
#define ds_year 0x06
#define ds_control 0x07
///PROGRAMA
void main(void)
{
retardo=250; //ms a tardar entre lectura y lectura
//Justo cuando prende circuito, la fecha que establece es la siguiente
seconds= 0x00;
minutes= 0x20;
hours = 0x12; //modo 24 hrs
day = 0x2; //1 es domingo
date = 0x19;
month = 0x11;
year = 0x07;
control= 0x00; //OUT=0 SQWE=0 RS0-1=0 no hay onda cuadrada
//Establece fecha y hora
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que empiece en registro ds_seconds
//Aquà establece fecha y hora respecto a la puesta arriba
i2c_write(seconds);
i2c_write(minutes);
i2c_write(hours);
i2c_write(day);
i2c_write(date);
i2c_write(month);
i2c_write(year);
i2c_write(control);
i2c_stop(); //Ya puso la hora y fecha
//El RTC ya está marcando el tiempo y fecha
lcd_init(); //inicializa lcd
w = 41;
while(w != 0){ //bucle...
lcd_gotoxy(x,y); //cursor para escribir mensaje
lcd_putc("FUEL CONTROL"); //muestra por pantalla el mensaje
delay_ms(150);
x++; //incremento indice de filas
if(x>16){ //¿ya se ha mostrado mensaje entero por 1ºfila?
x=-8; //SI -> indice fila x=-8
y++; //incremento indice columnas
if(y>2) //¿ya se ha mostrado mensaje por 2º columna?
y=1; //SI -> restauro indice columna
}
lcd_putc("\f"); //borra pantalla
w = w-1;
}
for(;
{ //bucle...
lcd_putc("[A]HORA
TANQUE\n[C]IMPR.[D]SETUP"); //presentacion
do{ //espera hasta...
c=kbd_getc();
}while(c==0); //...pulsar una tecla
if(c=='A') //Mostrar hora actual
hora();
if(c=='B') //Mostrar contenido de los tanques
tanques();
if(c=='C') //Imprimir reporte de mediciones
imprimir();
if(c=='D') //ajustar parametros del sistema
ajustes();
} //...infinito
}
void hora(void){
for(;{ //bucle...
lcd_putc("\f");
do{ //espera hasta...
delay_ms(retardo); //Usuario lee
//Obtiene datos de DS1307
i2c_start(); //Inicia I2C
i2c_write(0xd0); //Direcciona DS1307 write
i2c_write(ds_seconds); //Indica que ponga registro en ds_seconds
i2c_stop();
i2c_start();
i2c_write(0xd1); //Lee DS1307
seconds = i2c_read();
minutes = i2c_read();
hours = i2c_read();
day = i2c_read();
date = i2c_read();
month = i2c_read();
year = i2c_read(0); //no ack
i2c_stop();
//Representa datos en la LCD
printf(lcd_putc,"\f%2x-%2x-20%2x\n",date,month,year); //dd-mm-year
printf(lcd_putc,"%2x:%2x:%2x",hours,minutes,seconds); //23:59:59
delay_ms(100);
c=kbd_getc();
}while(c==0); //...pulsar una tecla
if(c=='*' || c=='#'){ //si se pulsa * o # se sale de la funcion
break; //salir de funcion nueva_clave
lcd_putc("\f");
}
} //...inifinito
lcd_putc("\f");
}
void tanques(void){
for(;{ //bucle...
lcd_putc("\f");
do{ //espera hasta...
setup_adc(ADC_CLOCK_INTERNAL); //configura el converso
setup_adc_ports( RA0_RA1_RA3_ANALOG ); //entrada 0,1 y 3 como analogicas
toma_adc();
lcd_gotoxy(1,1);
lcd_putc("Tanque0=\nTanque1="); //presentacion
lcd_gotoxy(10,1);
printf(lcd_putc,"%1.2f",var01);
//lcd_putc(tank0); //presentacion
lcd_gotoxy(10,2);
//lcd_putc(tank1); //presentacion
printf(lcd_putc,"%1.2f",var02);
c=kbd_getc();
}while(c==0); //...pulsar una tecla
if(c=='*' || c=='#'){ //si se pulsa * o # se sale de la funcion
break; //salir de funcion nueva_clave
lcd_putc("\f");
}
} //...inifinito
lcd_putc("\f");
}
void toma_adc(void){
// Lectura de los canales 0 y 1
set_adc_channel(0);
delay_ms(1);
tank0=read_adc();
var01=(float)tank0/12;
delay_ms(10); //para que se estabilice
set_adc_channel(1);
delay_ms(1);
tank1=read_adc();
var02=(float)tank1/12;
delay_ms(10); //para que se estabilice
}
void imprimir(void){
for(;{ //bucle...
lcd_putc("\f");
lcd_putc("Imprimir"); //presentacion
do{ //espera hasta...
c=kbd_getc();
}while(c==0); //...pulsar una tecla
if(c=='*' || c=='#'){ //si se pulsa * o # se sale de la funcion
break; //salir de funcion nueva_clave
lcd_putc("\f");
}
} //...inifinito
lcd_putc("\f");
}
void ajustes(void){
for(;{ //bucle...
lcd_putc("\f");
lcd_putc("[1]Fecha [2]Tanq\n[3]B.mem [4]Pass"); //presentacion
do{ //espera hasta...
c=kbd_getc();
}while(c==0); //...pulsar una tecla
if(c=='*' || c=='#'){ //si se pulsa * o # se sale de la funcion
break; //salir de funcion nueva_clave
lcd_putc("\f");
}
} //...inifinito
lcd_putc("\f");
}