Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2- Conversión AD a 10 bit
Descripción:
2- Se toma el valor entero de 0-1023 y se calcula además en porcentaje, ambos valores son convertidos
en cadena y llevados al LCD
4- El dato recibido del PC, 1 caracter ASCII, es presentado en el LCD y alamacenado en la EEPROM en la
dirección 0.
5- Se lee las variables de tiempo real del DS-1307, se convierten en cadena y se presentan en el lcd,
ejemplo:"12:00:00 01/01/2000"
5- Por medio del teclado, presionando primero la tecla reloj, se habilita la programación de la hora y
fecha, haciendo oscilar el cursor del LCD en la variable correspondiente le llevamos el número deseado
desde el teclado, luego el dato es grabado en el DS-1307.
Siempre he programado en assembler y es obvio que tengo muchos vicios de este lenguaje, pero de
todos modos trataré de resolver cualquier inquietud que este ejercicio les suscite, además recibo
cualquier sugerencia, si se dé el caso, de alguna forma para mejorar un procedimiento.
Lástimosamente el puerto USB, que es mi siguiente paso, no lo domino en absoluto, pero cuando tenga
algo se los compartiré.
Un abrazo a todos los miembros del FORO.
<18F4550.h>
#device adc = 10
#use delay(clock=4000000)
#include <stdlib.h>
#define e porte,0
#define rs porte,1
//definicion de funciones
void ini_lcd_4b();
void msj1();
void teclado();
void msj_analogo();
void msj_ra0();
void conversion_ad();
void msj_analogo1();
void msj_rx();
void msj_datos_rec();
void msj_ds1307();
void leer_ds1307();
void conf_ds1307();
//variables
char registro_tec;
char datos_rec;
int cont_prg_reloj;
char analogo[5];
int16 resultado_ad;
//definicion de constantes
byte const tabla1[] = {"! Bienvenidos !"}; //Tabla que contiene el texto a mostrar
byte const tabla2[] = {"RA0 = "}; //Tabla que contiene el texto a mostrar
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//timer 1
void interrupcion_tmr1()
{
set_timer1(3042); //62.500 * 8 (prescaler) = 0,5 seg
ban_tmr1 = 1;
///////////////////////////////////////////////////////////////////////////////
write_eeprom(0,datos_rec);
///////////////////////////////////////////////////////////////////////////////
//Rutina principal
void main()
set_tris_b(0b11111111);
set_tris_d(0x0f);
set_tris_e(0);
adcon0 = (0b00000001);
adcon1 = (0b00001110);
adcon2 = (0b10000000);
//configurar el display
delay_ms(2);
ini_lcd_4b();
msj1();
delay_ms(2000);
delay_ms(2);
portd = 0;
registro_tec = '?';
msj_ra0();
msj_rx();
///////////////////////////////////////
while(true)
delay_ms(10);
teclado();
if(ban_tmr1 == 1)
{goto no_display;}
ban_tmr1 = 0;
conversion_ad();
msj_analogo1();
msj_datos_rec();
leer_ds1307();
msj_ds1307();
no_display:
delay_cycles(1);
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void msj_ds1307()
int i;
display_4b(1 , ds1307[i]);
///////////////////////////////////////////////////////////////////////////////
void msj_rx()
int i;
{
display_4b(1 , tabla_rx[i]);
///////////////////////////////////////////////////////////////////////////////
void msj_datos_rec()
display_4b(1 , datos_rec);
///////////////////////////////////////////////////////////////////////////////
void msj1()
int i;
display_4b(1 , tabla1[i]);
///////////////////////////////////////////////////////////////////////////////
void msj_ra0()
int i;
display_4b(0 , 0x80); //Dirección donde se escribirá el mensaje
display_4b(1 , tabla2[i]);
///////////////////////////////////////////////////////////////////////////////
int i;
sprintf(analogo,"%04lu",resultado_ad);
display_4b(1 , analogo[i]);
///////////////////////////////////
sprintf(analogo,"%03u%%",i);
display_4b(1 , analogo[i]);
///////////////////////////////////////////////////////////////////////////////
void ini_lcd_4b()
//todo el mensaje
delay_ms(2);
///////////////////////////////////////////////////////////////////////////////
void display_4b(short valor , int respaldo) //Rutina que envia al LCD una palabra de control o
dirección
int respaldo2;
if(valor == 0)
{bit_clear(rs);}
else
{bit_set(rs);}
portd |= respaldo2;
bit_set(e);
delay_cycles(10);
bit_clear(e);
portd |= respaldo2;
bit_set(e);
delay_cycles(10);
bit_clear(e);
delay_ms(1);
///////////////////////////////////////////////////////////////////////////////
set_adc_channel(0);
delay_us(10);
resultado_ad = read_adc();
///////////////////////////////////////////////////////////////////////////////
puerto_tec=(0xf0);
bit_clear(tec_c1);
delay_us(100);
int respaldo;
ban_tec1 = 1;
registro_tec = 'A';
cont_prg_reloj++;
respaldo = portd;
switch(cont_prg_reloj)
case 1:
ban_reloj = 1;
display_4b(0, 0x94);
break;
case 2:
display_4b(0, 0x95);
break;
case 3:
display_4b(0, 0x97);
break;
case 4:
display_4b(0, 0x98);
break;
case 5:
display_4b(0, 0x9a);
break;
case 6:
display_4b(0, 0x9b);
break;
case 7:
display_4b(0, 0x9d);
break;
case 8:
display_4b(0, 0x9e);
break;
case 9:
display_4b(0, 0xa0);
break;
case 10:
display_4b(0, 0xa1);
break;
case 11:
display_4b(0, 0xa3);
break;
case 12:
display_4b(0, 0xa4);
break;
case 13:
ban_reloj = 0;
cont_prg_reloj = 0;
conf_ds1307();
default:
portd = respaldo;
ban_tec1 = 0;
ban_tec2 = 1;
registro_tec = '3';
confi_reloj(3);
ban_tec2 = 0;
}
if((bit_test(tec_f3)==0)&&(ban_tec3==0)) //tecla presionada
ban_tec3 = 1;
registro_tec = '2';
confi_reloj(2);
ban_tec3 = 0;
ban_tec4 = 1;
registro_tec = '1';
confi_reloj(1);
ban_tec4 = 0;
bit_set(tec_c1);
///////////////////////////////////
bit_clear(tec_c2);
delay_us(100);
ban_tec5 = 1;
registro_tec = 'D';
ban_tec5 = 0;
ban_tec6 = 1;
registro_tec = '6';
confi_reloj(6);
ban_tec6 = 0;
}
if((bit_test(tec_f3)==0)&&(ban_tec7==0)) //tecla presionada
ban_tec7 = 1;
registro_tec = '5';
confi_reloj(5);
ban_tec7 = 0;
ban_tec8 = 1;
registro_tec = '4';
confi_reloj(4);
ban_tec8 = 0;
}
bit_set(tec_c2);
///////////////////////////////////
bit_clear(tec_c3);
delay_us(100);
ban_tec9 = 1;
registro_tec = 'I';
ban_tec9 = 0;
ban_tec10 = 1;
registro_tec = '9';
confi_reloj(9);
ban_tec10 = 0;
}
ban_tec11 = 1;
registro_tec = '8';
confi_reloj(8);
ban_tec11 = 0;
ban_tec12 = 1;
registro_tec = '7';
confi_reloj(7);
ban_tec12 = 0;
}
bit_set(tec_c3);
///////////////////////////////////
bit_clear(tec_c4);
delay_us(100);
ban_tec13 = 1;
registro_tec = 'B';
ban_tec13 = 0;
ban_tec14 = 1;
registro_tec = 'E';
ban_tec14 = 0;
}
ban_tec15 = 1;
registro_tec = '0';
confi_reloj(0);
ban_tec15 = 0;
int respaldo;
respaldo = portd;
ban_tec16 = 1;
registro_tec = 'S';
ban_reloj = 0;
cont_prg_reloj = 0;
display_4b(0 , 0b00001100); //Codigo para que no oscile el cursor
portd = respaldo;
ban_tec16 = 0;
bit_set(tec_c4);
///////////////////////////////////////////////////////////////////////////////
void confi_reloj(int valor) //rutina que carga en las variables de reloj el numero presionado
int respaldo;
respaldo = portd;
switch(cont_prg_reloj)
case 1:
dec_hora = valor;
display_4b(0, 0x94);
break;
case 2:
uni_hora = valor;
break;
case 3:
dec_minu = valor;
display_4b(0, 0x97);
break;
case 4:
uni_minu = valor;
display_4b(0, 0x98);
break;
case 5:
dec_seg = valor;
display_4b(0, 0x9a);
break;
case 6:
uni_seg = valor;
display_4b(0, 0x9b);
break;
case 7:
dec_dia = valor;
break;
case 8:
uni_dia = valor;
display_4b(0, 0x9e);
break;
case 9:
dec_mes = valor;
display_4b(0, 0xa0);
break;
case 10:
uni_mes = valor;
display_4b(0, 0xa1);
break;
case 11:
dec_amo = valor;
display_4b(0, 0xa3);
break;
case 12:
uni_amo = valor;
break;
default:
portd = respaldo;
///////////////////////////////////////////////////////////////////////////////
void leer_ds1307()
int respaldo;
i2c_start(); //Start
i2c_write(0b11010000); //Control
i2c_write(0b00000000); //Direccion
i2c_stop(); //Stop
i2c_start(); //Start
uni_seg = respaldo;
dec_seg = swap(respaldo);
uni_minu = respaldo;
dec_minu = swap(respaldo);
uni_hora = respaldo;
dec_hora = swap(respaldo);
dia_sem = respaldo;
uni_dia = respaldo;
dec_dia = swap(respaldo);
uni_mes = respaldo;
dec_mes = swap(respaldo);
uni_amo = respaldo;
dec_amo = swap(respaldo);
respaldo = i2c_read();
i2c_stop(); //Stop
///////////////////////////////////////////////////////////////////////////////
void conf_ds1307()
int respaldo;
i2c_start(); //Start
i2c_write(0b11010000); //Control
i2c_write(0b00000000); //Direccion
i2c_write(respaldo);
i2c_write(respaldo);
i2c_write(dia_sem);
i2c_write(respaldo);
i2c_write(respaldo);
i2c_write(respaldo);
i2c_stop(); //Stop