// ===========================================================================================================
// Test de bucles e Interrupciones
// ===========================================================================================================
#include <18F2580.h> // Micro utilizado
#fuses INTRC_IO // Oscilador Interno con pines de IO
#fuses MCLR // Patilla de Reset habilitada
#fuses NOWDT // No Watch Dog Timer
#fuses NOPROTECT // Code not protected from reading
#fuses BROWNOUT // Reset when brownout no detectado
#fuses NOPUT // No Power Up Timer
#fuses NOCPD // No EE protection
#fuses DEBUG // Debug mode for ICD
#fuses NOWRT // Program memory not write protected
#fuses NOLVP // No Low Voltage Power
#fuses BORV21 // Reset a 2.1V
#use Delay (Clock=32000000) // Usamos 32MHz
// -----------------------------------------------------------------------------------------------------------
// Macro de los mensajes
// -----------------------------------------------------------------------------------------------------------
#define Pon_Mensaje(Cadena,Columna,Fila) \
strcpy (Buff_Mensaje
, Cadena
); \
lcd_gotoxy(Columna,Fila); \
LCD_Print_Cadena(); // Macro de impresión de cadenas
// -----------------------------------------------------------------------------------------------------------
// Variables Globales
// -----------------------------------------------------------------------------------------------------------
char Buff_Mensaje[16]; // Buffer de Cadenas
short Hay_Pulsacion; // Test del pulsador
// -----------------------------------------------------------------------------------------------------------
// Ficheros de la aplicación
// -----------------------------------------------------------------------------------------------------------
#include "Flex_Lcd.c" // Rutinas del LCD adaptadas
// -----------------------------------------------------------------------------------------------------------
// Imprime la cadena que está en Buff_Mensaje. Debe de acabar en 0x00
// -----------------------------------------------------------------------------------------------------------
void LCD_Print_Cadena() { // Imprime una Cadena
char i=0; // Contador
while(Buff_Mensaje[i] != 0) { // Hasta que acaba la cadena
lcd_putc(Buff_Mensaje[i]); // Lo pasa al Display
i++; // Prepara el siguiente
}
}
// -----------------------------------------------------------------------------------------------------------
// Detecta la señal del pulsador en RB0. Es una transición Hi -> Lo
// -----------------------------------------------------------------------------------------------------------
#INT_EXT
void Detecta_Pulsador() {
if (!input(PIN_B0)){ // Si pulsamos
disable_interrupts(INT_EXT); // Desactivamos la Interrupción
do {} while(!input(PIN_B0)); // Esperamos a que suelte
Hay_Pulsacion=true; // Se ha recibido una pulsacion
}
}
// ===========================================================================================================
// Programa Principal
// ===========================================================================================================
void main() {
int Num_Mensaje; // Numero de mensaje
setup_oscillator(OSC_32MHZ); // Oscilador Interno a 32MHz
lcd_init(); // Inicializa el LCD
output_float(PIN_B0); // Pone la línea como entrada
ext_int_edge(H_TO_L); // Configuro captura del flanco de Bajada
enable_interrupts(INT_EXT); // Activamos la interrupción del PIN B0
enable_interrupts(GLOBAL); // Activamos las interrupciones
Hay_Pulsacion=false; // De momento es falsa
// ********************************************************************************************************
// ESTE ES BUCLE QUE NO FUNCIONA COMO QUIERO. SIEMPRE SALE CON EL RESULTADO Nº4
// ********************************************************************************************************
while(Hay_Pulsacion==false) { // Hasta que haya pulsación
Num_Mensaje=0; // Ponemos el mensaje 0
Pon_Mensaje(" MENSAJE CERO ",1,1); // Mensaje Cero
delay_ms(2000); // Retardo de temporización
Num_Mensaje=1; // Ponemos el mensaje 1
Pon_Mensaje(" MENSAJE UNO ",1,1); // Mensaje Uno
delay_ms(2000); // Retardo de temporización
Num_Mensaje=2; // Ponemos el mensaje 2
Pon_Mensaje(" MENSAJE DOS ",1,1); // Mensaje Dos
delay_ms(2000); // Retardo de temporización
Num_Mensaje=3; // Ponemos el mensaje 3
Pon_Mensaje(" MENSAJE TRES ",1,1); // Mensaje Tres
delay_ms(2000); // Retardo de temporización
Num_Mensaje=4; // Ponemos el mensaje 4
Pon_Mensaje(" MENSAJE CUATRO ",1,1); // Mensaje Cuatro
delay_ms(2000); // Retardo de temporización
} // Cierra el bucle
Pon_Mensaje("Se ha pulsado en",1,1); // Mensaje del resultado
Pon_Mensaje("el mensaje n: ",1,2); // Resultado
lcd_gotoxy(14,2); // Se posiciona
lcd_putc(0x30+Num_Mensaje); // Y escribe el nº de mensaje
}