Bueno alli va el programa, solo maneja el LCD, porque al hacer el control para todo lo demas que queria pues me quede sin memoria y ahora estoy trabajando en el diseño con un 876. Cuando lo tenga listo, con control de teclado, dimmer para las luces que controla e interfaz para el PC pues subo todo el proyecto.
Espero les sea útil.
Saludos a todos.
Alfredo
/////////////////////////////////////////////////////////////////////////
//// PROYECTO DE DOMOTICA ////
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
//// COMANDOS DEL PREPROCESADOR ////
/////////////////////////////////////////////////////////////////////////
#if defined(__PCM__)
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#bit lcd_rs = 5.0
#bit lcd_e = 5.1
#bit latch_ck = 5.2
#bit temp_cs = 5.3
#bit buzzer = 5.4
#byte port_a = 5
#byte port_b = 6
#byte lcd_data = 6
/////////////////////////////////////////////////////////////////////////
//// DEFINICION DE VARIABLES ////
/////////////////////////////////////////////////////////////////////////
char string[16];
int estado_control;
int horas = 12;
int minutos = 00;
int segundos = 00;
short bampm = 0;
int contemp1 = 15; // Contador Interno 15 o 20
int contemp2 = 8; // Contador Ajuste hasta 8
float temp = 26.36;
/////////////////////////////////////////////////////////////////////////
//// DEFINICION DE FUNCIONES ////
/////////////////////////////////////////////////////////////////////////
void inicializar();
void init_lcd();
void write_lcd_nibble(BYTE);
void write_lcd(SHORT, BYTE);
void lcd_gotoxy(BYTE,BYTE);
void lcd_putc(char);
void pantallaespera();
void lcd_putc(char);
void goto_lcd(BYTE,BYTE);
/////////////////////////////////////////////////////////////////////////
//// RUTINA DE INICIALIZACION ////
/////////////////////////////////////////////////////////////////////////
void inicializar() {
set_tris_a(0x00); //Todo puerto A Salidas
set_tris_b(0xF0); //RB0-3 Salidas RB4-7 Entradas
port_b = 0x00; //Inicializa señales de control
port_a = 0x0c; //Inicializa señales de control
init_lcd();
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
set_rtcc(6);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
}
/////////////////////////////////////////////////////////////////////////
//// PROGRAMA PRINCIPAL ////
/////////////////////////////////////////////////////////////////////////
main() {
inicializar();
while(TRUE){
pantallaespera();
}
}
/////////////////////////////////////////////////////////////////////////
//// RUTINAS DE INTERRUPCION ////
/////////////////////////////////////////////////////////////////////////
#INT_RTCC
void cada64ms() {
disable_interrupts(GLOBAL);
set_rtcc(6);
contemp1 = contemp1 - 1;
if (contemp1==0) {
contemp2 = contemp2 - 1;
contemp1 = 15;
if (contemp2==0){
contemp1 = contemp1 + 5;
contemp2 = 8;
}
// Rutina Aprox cada segundo - Exacta cada 8 seg.
// contemp1 se carga con 15, 15, 15, 15, 15, 15, 15, 20, 15, 15...
segundos = segundos + 1;
if (segundos==60){
minutos = minutos + 1;
segundos = 0;
}
if (minutos==60){
horas = horas + 1;
minutos = 0;
}
if (horas==13){ horas = 1; }
bampm = 0;
}
enable_interrupts(GLOBAL);
}
/////////////////////////////////////////////////////////////////////////
//// RUTINAS DE MENU ////
/////////////////////////////////////////////////////////////////////////
void pantallaespera(){
write_lcd (0, 0x80);
printf(lcd_putc, "%02u:%02u:%02u%c %02.2fC", horas, minutos, segundos, bampm, temp);
write_lcd (0, 0xc0);
printf(lcd_putc, " * * O O * "

;
}
/////////////////////////////////////////////////////////////////////////
//// RUTINAS DE MANEJO DE LCD ////
/////////////////////////////////////////////////////////////////////////
void init_lcd() {
write_lcd_nibble(0x02);
write_lcd(0, 0x0c);
write_lcd(0, 0x01);
write_lcd(0, 0x06);
}
void write_lcd_nibble(BYTE n) {
lcd_data = n;
delay_ms(1);
lcd_e = 1;
delay_ms(1);
lcd_e = 0;
delay_ms(1);
}
void write_lcd(SHORT nocom, BYTE dato) {
lcd_rs = nocom;
delay_ms(1);
write_lcd_nibble(dato >> 4);
write_lcd_nibble(dato & 0xf);
lcd_rs = 0;
}
void lcd_putc( char c) {
write_lcd(1,c); break;
}
/////////////////////////////////////////////////////////////////////////
// FIN