Created
October 3, 2013 19:34
-
-
Save davidae1704/6815739 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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