Skip to content

Instantly share code, notes, and snippets.

@davidae1704
Created October 3, 2013 19:34
Show Gist options
  • Save davidae1704/6815739 to your computer and use it in GitHub Desktop.
Save davidae1704/6815739 to your computer and use it in GitHub Desktop.
//Frecuencimetro
//Sobre frecuencimetro en la condicion (if) en lugar de ser sobre el estado del Pin RC2 debe ser sobre la bandera del modulo //CCP1 para verificar si se hizo una captura y guardar el dato del registro de trabajo en una variable
//Codigo fuente
//Crear una interrupcion para cada tipo de evento probable: por si se llama a la interrupcion por la bandera TMR1IF , por si se //llama la interrupcion por la captura de un evento en CPP1 con CPP1IF
#include <stdio.h>
#include <stdlib.h>
#include <p18f4550.h>
#include <delays.h>
#pragma config FOSC = INTOSCIO_EC //Oscilador Interno, Puerto A RA6 activo,
#pragma config WDT = OFF //Watchdog timer apagado
#pragma config PBADEN = OFF //Parte baja del puerto B digitales
#pragma config MCLRE = ON //MCLRE Disponible
#pragma config DEBUG = ON //Modo de depuraciòn disponible
#pragma config LVP = OFF //Fuente de ISCP apagada
char Mensaje[12] = {'H', 'o', 'l', 'a', ' ', 'M', 'u', 'n', 'd', 'o', '!', 0x00};
char dato[16];
//Declaracion previa de las funciones
void LCD_Retardo_Corto();
void LCD_Retardo_Largo();
void LCD_Inicializar();
void LCD_Limpiar();
void LCD_Posicion(unsigned char x, unsigned char y);
void LCD_Caracter(unsigned char Caracter);
void LCD_Cuenta(unsigned char Caracter);
void LCD_Cadena(unsigned char *Cadena);
//Definiciones de pines de la LCD para referencia simplificada
#define LCD_RS LATE0
#define LCD_RW LATE1
#define LCD_E LATE2
#define LCD_DATA LATD
void main() {
TRISC = 0XFF; //Estableciendo el puerto C como entrada para usar el terminal de captura para CCP1(RC2)
PORTD = 0X00; //Limpiando contenido en Puerto D
TRISD = 0X00; //Estableciendo puerto D como salida
PORTE = 0X00; //Limpiando datos del puerto E
TRISE = 0X00; //Estableciendo puerto E como salida
T1CON = 0b11000100; //Configurando TMR1, sin activarlo
T3CON = 0x00; //Estableciendo el oscilador de TMR1 para el modulo CCP1
CCP1CON = 0X05; //configurando modulo de captura CCP1
GIE = 1;//habilitando interrupciones
PEIE = 1;//habilitando mascara de perifericos
CCP1IE = 1;//mascara local del modulo de captura CCP1
CCP1IP = 1;//selector de prioridad del modulo de captura CCP1
CCPR1 = 0X00; //Limpiar registro de trabajo del modulo CCP1
TMR1L = 0X00; //Limpiando parte baja del registro de trabajo de TMR1
TMR1H = 0X00; //Limpiando parte alta del registro de trabajo de TMR1
T1CON = 0b11000101; //Activando TMR1
//Inicializacion de los perifericos externos LCD_Inicializar(); //Inicializa la pantalla LCD
if (TMR1IF == 1) {
TMR1IF = 0;
if(TMR1L == 0x00 & TMR1H == 0x00){
if(CCP1IF == 1){
CCP1IF = 0;
dato=CCPR1;
}
}
}
}
Void interrupt
//Funcion usada para generar los retardos de la linea E de la pantalla LCD
void LCD_Retardo_Corto() {
Delay10TCYx(150);
}
//Funcion usada para generar los retardos de la inicializacion de la LCD
void LCD_Retardo_Largo() {
Delay10TCYx(250);
Delay10TCYx(250);
}
void LCD_Inicializar(){
//Permite un cierto tiempo para que la pantalla inicialice internamente
LCD_Retardo_Largo();
//Envia el comando de inicializacion que establece el modo de 8 bits
LCD_RS = 0; //Se enviara un comando
LCD_RW = 0; //La operacion es de escritura
LCD_DATA = 0b00110000; //Comando que establece la interfase de 8 bits
LCD_E = 1;
LCD_Retardo_Corto(); //Pulsa la linea de Enable brevemente
LCD_E = 0;
LCD_Retardo_Corto();
//Espera a que la LCD procese el comando
LCD_Retardo_Largo();
//Envia el mismo comando por segunda vez
//(los puertos retienen sus valores anteriores)
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//Espera nuevamente
LCD_Retardo_Largo();
//Envia el mismo comando por tercera vez
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//Espera nuevamente
LCD_Retardo_Largo();
//Envia el comando que activa las 2 filas y establece la fuente grande
LCD_DATA = 0b00111100;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//El siguiente comando enciende el display completo y el cursor parpadeante
LCD_DATA = 0b00001111;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//Este comando indica al LCD que escriba hacia la derecha y que no desplace
//el texto al ir escribiendo
LCD_DATA = 0b00000110;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
//Al final se limpia toda la pantalla
LCD_Limpiar();
}
//Funcion para establecer la posicion de escritura en la pantalla
void LCD_Posicion(unsigned char x, unsigned char y) {
unsigned char Direccion_DDRAM;
//Determina la direccion base de la DDRAM de acuerdo a la coordenada y
if (y == 0) Direccion_DDRAM = 0x00; //La fila 0 comienza en la direccion 0
else Direccion_DDRAM = 0x40; //La fila 1 comienza en la direccion 0x40
//Suma la coordenada x a la direccion base (aplica mascara)
Direccion_DDRAM += x & 0x0F;
//Una vez encontrada la direccion se envia el comando a la pantalla
LCD_RS = 0; //Se enviara un comando
LCD_RW = 0; //La operacion es de escritura
LCD_DATA = 0b10000000 | Direccion_DDRAM;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
}
//Funcion de impresion de un caracter simple en la pantalla
void LCD_Caracter(unsigned char Caracter) {
LCD_RS = 1; //Se enviara un dato
LCD_RW = 0; //La operacion es de escritura
LCD_DATA = Caracter; //Coloca el caracter en el bus
LCD_E = 1;
LCD_Retardo_Corto(); //Provoca una pulsacion del enable
LCD_E = 0;
LCD_Retardo_Corto();
}
//Funcion de impresion de cadenas en pantalla LCD
void LCD_Cadena(unsigned char *Cadena) {
unsigned char i;
//Para imprimir una cadena simplemente se envian los caracteres de uno en
//uno hasta que se encuentra el cero terminador
for (i = 0; Cadena[i] != 0; i++)
LCD_Caracter(Cadena[i]);
}
//Funcion de impresion de un caracter simple en la pantalla
void LCD_Cuenta(unsigned char Caracter) {
LCD_RS = 1; //Se enviara un dato
LCD_RW = 0; //La operacion es de escritura
LCD_DATA = Caracter + 0x30; //Coloca el caracter en el bus
LCD_E = 1;
LCD_Retardo_Corto(); //Provoca una pulsacion del enable
LCD_E = 0;
LCD_Retardo_Corto();
}
//Funcion de limpieza de la pantalla LCD
void LCD_Limpiar() {
//Envia el comando que hace la operacion de limpieza
LCD_RS = 0; //Se enviara un comando
LCD_RW = 0; //La operacion es de escritura
LCD_DATA = 0b00000001;
LCD_E = 1;
LCD_Retardo_Corto();
LCD_E = 0;
LCD_Retardo_Corto();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment