100% found this document useful (1 vote)
42 views15 pages

Código Medidor de Distancia

Uploaded by

daniels.montanos
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
42 views15 pages

Código Medidor de Distancia

Uploaded by

daniels.montanos
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 15

//Código lcd.

#include "lcd.h"

void Lcd_Port(char a)

(a & 1) ? (D4 = 1) : (D4 = 0);

(a & 2) ? (D5 = 1) : (D5 = 0);

(a & 4) ? (D6 = 1) : (D6 = 0);

(a & 8) ? (D7 = 1) : (D7 = 0);

void Lcd_Cmd(char a)

RS = 0;

Lcd_Port(a);

EN = 1;

__delay_ms(4);

EN = 0;

void Lcd_Clear(void)

Lcd_Cmd(0);

Lcd_Cmd(1);

void Lcd_Set_Cursor(char a, char b)

char temp, z, y;
if (a == 1)

temp = 0x80 + b - 1;

z = temp >> 4;

y = temp & 0x0F;

Lcd_Cmd(z);

Lcd_Cmd(y);

else if (a == 2)

temp = 0xC0 + b - 1;

z = temp >> 4;

y = temp & 0x0F;

Lcd_Cmd(z);

Lcd_Cmd(y);

else if (a == 3)

temp = 0x94 + b - 1;

z = temp >> 4;

y = temp & 0x0F;

Lcd_Cmd(z);

Lcd_Cmd(y);

else if (a == 4)

temp = 0xD4 + b - 1;

z = temp >> 4;

y = temp & 0x0F;


Lcd_Cmd(z);

Lcd_Cmd(y);

void Lcd_Init(void)

RS_DIR = 0;

EN_DIR = 0;

D4_DIR = 0;

D5_DIR = 0;

D6_DIR = 0;

D7_DIR = 0;

Lcd_Port(0x00);

__delay_ms(20);

Lcd_Cmd(0x03);

__delay_ms(5);

Lcd_Cmd(0x03);

__delay_ms(11);

Lcd_Cmd(0x03);

Lcd_Cmd(0x02);

Lcd_Cmd(0x02);

Lcd_Cmd(0x08);

Lcd_Cmd(0x00);

Lcd_Cmd(0x0C);

Lcd_Cmd(0x00);

Lcd_Cmd(0x06);

Lcd_Clear();

}
void Lcd_Write_Char(char a)

char temp, y;

temp = a & 0x0F;

y = a & 0xF0;

RS = 1;

Lcd_Port(y >> 4);

EN = 1;

__delay_us(40);

EN = 0;

Lcd_Port(temp);

EN = 1;

__delay_us(40);

EN = 0;

void Lcd_Write_String(const char *a)

int i;

for (i = 0; a[i] != '\0'; i++)

Lcd_Write_Char(a[i]);

void Lcd_Shift_Right(void)

Lcd_Cmd(0x01);

Lcd_Cmd(0x0C);

}
void Lcd_Shift_Left(void)

Lcd_Cmd(0x01);

Lcd_Cmd(0x08);

void Lcd_Blink(void)

Lcd_Cmd(0x00);

Lcd_Cmd(0x0F);

void Lcd_NoBlink(void)

Lcd_Cmd(0x00);

Lcd_Cmd(0x0C);

#ifdef USE_CGRAM_LCD

void Lcd_CGRAM_CreateChar(char add, const char* chardata)

switch (add)

case 0:

for (char i = 0; i <= 7; i++)

Lcd_Write_Char(chardata[i]);

break;

case 1:
for (char i = 8; i <= 15; i++)

Lcd_Write_Char(chardata[i - 8]);

break;

case 2:

for (char i = 16; i <= 23; i++)

Lcd_Write_Char(chardata[i - 16]);

break;

case 3:

for (char i = 24; i <= 31; i++)

Lcd_Write_Char(chardata[i - 24]);

break;

case 4:

for (char i = 32; i <= 39; i++)

Lcd_Write_Char(chardata[i - 32]);

break;

case 5:

for (char i = 40; i <= 47; i++)

Lcd_Write_Char(chardata[i - 40]);

break;

case 6:

for (char i = 48; i <= 55; i++)

Lcd_Write_Char(chardata[i - 48]);

break;

case 7:

for (char i = 56; i <= 63; i++)

Lcd_Write_Char(chardata[i - 56]);

break;

}
void Lcd_CGRAM_Init(void)

Lcd_Cmd(0x04);

Lcd_Cmd(0x00);

void Lcd_CGRAM_Close(void)

Lcd_Cmd(0x00);

Lcd_Cmd(0x02);

#endif

//Código lcd.h

#include <xc.h>

#define _XTAL_FREQ 20000000

//#define USE_CGRAM_LCD

#define RS LATDbits.LATD2

#define EN LATDbits.LATD3

#define D4 LATDbits.LATD4

#define D5 LATDbits.LATD5

#define D6 LATDbits.LATD6

#define D7 LATDbits.LATD7

#define RS_DIR TRISDbits.TRISD2

#define EN_DIR TRISDbits.TRISD3

#define D4_DIR TRISDbits.TRISD4


#define D5_DIR TRISDbits.TRISD5

#define D6_DIR TRISDbits.TRISD6

#define D7_DIR TRISDbits.TRISD7

void Lcd_Port(char a);

void Lcd_Cmd(char a);

void Lcd_Clear(void);

void Lcd_Set_Cursor(char a, char b);

void Lcd_Init(void);

void Lcd_Write_Char(char a);

void Lcd_Write_String(const char *a);

void Lcd_Shift_Right(void);

void Lcd_Shift_Left(void);

void Lcd_Blink(void);

void Lcd_NoBlink(void);

#ifdef USE_CGRAM_LCD

void Lcd_CGRAM_CreateChar(char add, const char* chardata);

void Lcd_CGRAM_Init(void);

void Lcd_CGRAM_Close(void);

#endif

//código hc-sr04.h

#ifndef HC_SR04_H

#define HC_SR04_H

#include <xc.h>

#define _XTAL_FREQ 48000000


#define TRIG_DIR TRISBbits.TRISB2

#define ECHO_DIR TRISBbits.TRISB3

#define TRIG_PIN LATBbits.LATB2

#define ECHO_PIN PORTBbits.RB3

void HCSR04_Init(void);

float HCSR04_Get_Distance(void);

#endif // HC_SR04_H

//código hc-sr04.c

#include "hc-sr04.h"

void HCSR04_Init(void)

TRIG_DIR = 0; // TRIG_PIN como salida

ECHO_DIR = 1; // ECHO_PIN como entrada

TRIG_PIN = 0; // TRIG_PIN inicial en 0

T1CON = 0x30; // Configuración del Timer1: prescaler 1:8, FOSC/4

T1CONbits.TMR1ON = 1; // Encender Timer1

float HCSR04_Get_Distance(void)

unsigned int timer_high;

unsigned int timer_low;

// Generar pulso en TRIG_PIN

TRIG_PIN = 1;
__delay_us(10); // Pulso de al menos 10 us

TRIG_PIN = 0;

// Esperar que ECHO_PIN se ponga en alto

while(ECHO_PIN == 0);

// Reiniciar Timer1

TMR1H = 0x00;

TMR1L = 0x00;

// Esperar que ECHO_PIN se ponga en bajo

while(ECHO_PIN == 1);

// Leer valores del temporizador

timer_low = TMR1L;

timer_high = TMR1H;

// Calcular la distancia

float time = ((timer_high << 8) + timer_low) * 0.5; // Tiempo en us

float distance = (time / 58.82); // Distancia en cm

return distance;

//Código float_str.h

#ifndef FLOAT_STR_H

#define FLOAT_STR_H

void floattostr(float numero, unsigned char *cadena, char decimales);

#endif // FLOAT_STR_H
//Código float_str.c

#include "float_str.h"

void floattostr(float numero, unsigned char *cadena, char decimales)

int largo_entera = 0, largo_n = decimales + 1, cont_for, tempo_int;

double tempo_float;

if (numero < 0)

*cadena++ = '-';

numero = -numero;

if (numero > 0.0)

while (numero < 1.0)

numero *= 10.0;

largo_entera--;

while (numero >= 10.0)

numero /= 10.0;

largo_entera++;

}
largo_n += largo_entera;

for (tempo_float = 1, cont_for = 1; cont_for < largo_n; cont_for++)

tempo_float /= 10.0;

numero += tempo_float / 2.0;

if (numero >= 10.0)

numero = 1.0;

largo_entera++;

if (largo_entera < 0)

*cadena++ = '0';

*cadena++ = '.';

if (largo_n < 0)

largo_entera -= largo_n;

for (cont_for = -1; cont_for > largo_entera; cont_for--)

*cadena++ = '0';
}

for (cont_for = 0; cont_for < largo_n; cont_for++)

tempo_int = numero;

*cadena++ = tempo_int + '0';

if (cont_for == largo_entera)

*cadena++ = '.';

numero -= tempo_int;

numero *= 10.0;

*cadena = '\0';

//Código main.c

#pragma config OSC = HS, OSCS = OFF // Configuración del oscilador

#pragma config PWRT = OFF, BOR = OFF, BORV = 20

#pragma config WDT = OFF, WDTPS = 32768

#pragma config CCP2MX = PORTC // CCP2 MUX bit: CCP2 input/output is multiplexed with
RC1

#pragma config PBADEN = OFF // PORTB A/D Enable bit: PORTB<4:0> pins are configured
as digital I/O on Reset

#pragma config LVP = OFF // Single-Supply ICSP Disable bit: Single-Supply ICSP disabled
#pragma config DEBUG = OFF // Background Debugger Enable bit: Background debugger
disabled, RB6 and RB7 are general purpose I/O pins

#define _XTAL_FREQ 20000000 // Frecuencia del oscilador de 20MHz

#include <xc.h>

#include "lcd.h" // Librería para el control de la pantalla LCD

#include "hc_sr04.h" // Librería del sensor ultrasónico HC-SR04

#include "float_str.h" // Librería para convertir float a string

char buffer[20];

void main()

ADCON1bits.PCFG = 0x0F; // Coloca todos los pines como digitales

TRISBbits.RB0 = 0;

TRISBbits.RB1 = 0;

LATBbits.LB0 = 0;

LATBbits.LB1 = 0;

HCSR04_Init(); // Inicializa el sensor ultrasónico HC-SR04

Lcd_Init(); // Inicializa la pantalla LCD

while(1)

float distancia = HCSR04_Get_Distance(); // Obtiene la distancia

Lcd_Clear();

Lcd_Set_Cursor(1,2);

Lcd_Write_String("Sensor HC-SR04");

Lcd_Set_Cursor(2,1);
floattostr(distancia, buffer, 2); // Convierte la variable float a string

Lcd_Write_String("Dist: ");

Lcd_Write_String(buffer); // Imprime el valor de la distancia

Lcd_Write_String(" cm");

if(distancia < 10)

LATBbits.LB0 = 0;

LATBbits.LB1 = 1;

else

LATBbits.LB0 = 1;

LATBbits.LB1 = 0;

__delay_ms(200);

You might also like