Sie sind auf Seite 1von 9

PROYECTO 4 – EJERCICIO 2

Main:

#include <xc.h>

#include <stdio.h>

#define _XTAL_FREQ 20000000

#include <pic18f4550.h>

#include "config.h"

#include "LCD.h"

#include "uart.h"

unsigned int aux;

unsigned int cuenta;

unsigned int cuenta1;

float temperatura;

char temp[20];

void main(void)

// Configuro puertos como entradas o salidas:

TRISA = 0xFF;

TRISB = 0X00;// Configura el PortA como entrada.

// Configuro puertos como entradas o salidas:

TRISCbits.TRISC7=1; //pin RX como una entrada digital.

TRISCbits.TRISC6=0; //pin TX como una salida digital.

// Inicialización del módulo EUSART PIC en el XC8 modo asíncrono, a 8bits:

TXSTAbits.TX9=0; //8 bits de datos.

TXSTAbits.TXEN=1; //Transmisión habilitada.

TXSTAbits.SYNC=0; //Transmisión Asíncrona.

TXSTAbits.BRGH=0; //Baja velocidad.

RCSTAbits.SPEN=1; //Habilita puerto serie.

//Configuro la velocidad "Baud Rate":

BAUDCONbits.BRG16=0; //modo 16 bits.


SPBRGH=0; //Byte MSB del registro de velocidad en 0.

SPBRG=15; //Byte LSB del registro de velocidad en 129 para una velocidad de 9600 baudios con oscilador de 20Mhz.

// Configuración del ADC:

ADCON1= 0x0E;

ADCON0= 0x00;

ADCON2= 0x9D; // 6TAD, FOSC/16, justificación derecha

ADCON0bits.ADON= 1; // Arranca conversion.

//Configuracion del tmr0

T0CON = 0xC2; // Ftmr0=5MHz/8=625KHz Ttmr0=1.6 uS

T1CON = 0xC9; //

RCONbits.IPEN = 0;

INTCON = 0XE0; //GIE ON, PEIE ON, T0IE ON

PIE1bits.TMR1IE=0;

cuenta = 0;

cuenta1 = 0;

// Configuración del LCD:

lcd_init();

lcd_clear_display();

__delay_ms(180);

lcd_goto(2,1);

lcd_print("TEMPERATURA:");

lcd_goto(10,2);

lcd_dato(0xDF);

lcd_print("C");

while (1) // Bucle infinito (no hace nada)

ADCON0bits.GO_DONE = 1;

while(ADCON0bits.GO_DONE ==1);

aux = ADRESH;

aux = aux << 8;

aux = aux + ADRESL;

temperatura = (aux)*(500.0/1023.0);
sprintf(temp,"%.2f ",temperatura);

Write_Text_UART(temp);

__delay_ms(5000);

// TXREG = 0; // Se coloca en el buffer de TX.

// while(TXSTAbits.TRMT==0); // Espera que se envíe.

// __delay_ms(250);

} // Fin de main

void __interrupt(high_priority) Tmr0ISR(void){

TMR0L = 6; // 0.4 ms

cuenta++;

if(cuenta==12500)

lcd_goto(4, 2);

lcd_print(temp); //Se activa a los 500ms

cuenta = 0;

INTCONbits.TMR0IF = 0;

TMR1L = 0xAF; // 10 ms

TMR1H = 0x3C;

cuenta1++;

if(cuenta1==612)

LATBbits.LB0 = ~LATBbits.LB0; //se activa a los 250ms

cuenta1 = 0;

PIR1bits.TMR1IF = 0;

}
“config.h”:

//Zona de los bits de configuración

#pragma config PLLDIV = 5 // PLL Prescaler Divide by 5 (20 MHz/5 = 4 MHZ)

#pragma config CPUDIV = OSC1_PLL2 // System Clock Postscaler (20 MHz/1 = 20 MHz)

#pragma config USBDIV = 2 // USB Clock Full-Speed (96 MHz/2 = 48 MHz)

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)

#pragma config PWRT = ON // Power-up Timer Enable bit (PWRT enabled)

#pragma config BOR = OFF // Brown-out Reset disabled

#pragma config BORV = 3 // Brown-out Reset Voltage (Minimum 2.05V)

#pragma config WDT = OFF // Watchdog Timer disabled

#pragma config CCP2MX = OFF // CCP2 MUX bit (CCP2 is multiplexed with RB3)

#pragma config PBADEN = OFF // PORTB A/D (PORTB<4:0> configured as digital I/O)

#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled)

#pragma config STVREN = ON // Stack Full/Underflow will cause Reset

#pragma config LVP = OFF // Single-Supply ICSP disabled


“LCD.h”:

/* Creada por tutorialesvirtuales.com / rgt90@hotmail.com

* Nota: Esta Libreria esta diseñada PAra una interfaz a 4 Bits

Esta primera parte debe ser modificada por el usuario, para setear los pines del Micro

*/

#define RS LATBbits.LATB4 //Se debe de definir el Pin Usado para RS

#define EN LATBbits.LATB5 //Se debe de definir el pin Usado para E

#define TRISRS TRISBbits.TRISB4 //Se define el Tris para el RS Para poderlo configurar como Salida

#define TRISEN TRISBbits.TRISB5 //Se define el Tris para el E Para poderlo configurar como Salida

#define PUERTOTRS TRISD // Se define el TRIS del puerto que se usa como interfaz en este caso el Puerto C

#define PUERTO LATD // Se define El LAT del puerto que se usa como interfaz en este caso el C

void lcd_init();

void lcd_control(char);

void lcd_dato(char);

void lcd_clear_diplay();

void lcd_cursor_home();

void lcd_print(char*);

void lcd_print_with_position(int, int, char*);

void lcd_goto(int, int);

void lcd_put_caracter(char, char[]);

void lcd_time_control();

/*

* Configuracion de Puertos

* Iniciliaza el los puertos requeridos para el LCD

* Ademas lo inicializa a 4 Bits

*/

void lcd_init() {

TRISRS = 0; //Configuramos el Pin RS como salida

TRISEN = 0; //Configuramos el Pin E como salida

PUERTOTRS = 0b00001111; //Configuramos El nibble mas significativo como Salidas (Bus de 4 Bits))

RS = 0; //Aseguramos RS en 0

EN = 0; //Aseguramos E en 0

PUERTO = 0; //Aseguramos el Puerto de datos en 0

/*

* Configuracion del control del LCD


*/

__delay_ms(50); // Tiempo de espera a que se estabilicen los puertos

lcd_control(0x02); //Asegura el Cursos del LCD Al inicio (Home)

lcd_control(0x28); //Configura el LCD a 4 Bits, 2 Lineas Y Fuente de 5*8; Lineas Esto se llama el function set

lcd_control(0x0C); //LCD Prendido, Cursor Apagado, Destello Cursor apagado; Esto se Llama Diplay on/off Control

lcd_control(0x06); //No rota el mensaje Y se incrementa el contador de direccion. Esto se Llama Entry Mode Set

/*

* Esta rutina se encarga de tomar un dato y ponerlo en el puerto de datos

* teniendo en cuenta que es a 4 bits, por lo tanto tiene que hacer cambio de ninbles

* primer se envia el nible mas significativo y luego se envia el menos significativo

*/

void lcd_control(char dato) {

RS = 0;

PUERTO = dato & 0xF0;

lcd_time_control();

PUERTO = ((dato & 0x0F) << 4);

lcd_time_control();

__delay_ms(2);

/*

* Está rutina se encarga de tomar un dato y ponerlo sobre el puerto de datos

* especificamente para escribir un caracter sobre el LCD

*/

void lcd_dato(char dato) {

RS = 1;

PUERTO = dato & 0xF0;

lcd_time_control();

PUERTO = ((dato & 0x0F) << 4);

lcd_time_control();

__delay_us(50);

/*

* Rutina encargada de limpiar el LCD


*/

void lcd_clear_display() {

lcd_control(0x01);

/*

* El puntero regresa al inicio sin modificar los datos del LCD

*/

void lcd_cursor_home() {

lcd_control(0x02);

/*

* Imprime una cadena de caractres en el LCD

*/

void lcd_print(char *dato) {

while (*dato) // Mientras no sea Null

lcd_dato(*dato); // Envio el dato al LCD

dato++; // Incrementa el buffer de dato

/*

* Imprime una cadena de caracteres en la pisicion X y Y que se le pasen

*/

void lcd_print_with_position(int x, int y, char *dato) {

char posicion;

switch (y) {

case 1: posicion = 0x80 + x;

break;

case 2: posicion = 0xC0 + x;

break;

default: posicion = 0x80 + x;

break;

lcd_control(posicion);

lcd_print(dato);
}

/*

* Pone el puntero en la posicion deseada

*/

void lcd_goto(int x, int y) {

char posicion;

switch (y) {

case 1: posicion = 0x80 + x;

break;

case 2: posicion = 0xC0 + x;

break;

default: posicion = 0x80 + x;

break;

lcd_control(posicion);

/*

* Guardar caracteres especiales. en la CGRAM

*/

void lcd_put_caracter(char adress, char caracter[]) {

int i;

lcd_control(0x40 + (adress * 8));

for (i = 0; i < 8; i++) {

lcd_dato(caracter[i]);

/*

* Genera un Pulso de control Ese pulso es un pulso de E a 1 milisegundos

*/

void lcd_time_control() {

EN = 1;

__delay_us(5);

EN = 0;

__delay_us(5);

}
“uart.h”:

char Read_UART()

while(!RCIF); //leer únicamente si el buffer no está ocupado

return RCREG;

void Read_Text_UART(char *Output, unsigned int length)

unsigned int i;

for(i=0;i<length;i++)

Output[i] = Read_UART();

void Write_UART(char data)

while(!TXIF); // escribir únicamente si el buffer no está ocupado

TXREG = data;

void Write_Text_UART(char *text)

int i;

for(i=0;text[i]!='\0';i++) //escribir hasta que el final de la cadena

Write_UART(text[i]);

Das könnte Ihnen auch gefallen