Está en la página 1de 18

INSTITUTO TECNOLÓGICO

DE LÁZARO CÁRDENAS

PRÁCTICA 1.3.

ALUMNOS: JAIME HUMBERTO GARCÍA VALLE 20560102

ARTURO JOREL AYALA CRUZ 20560024

CARRERA: INGENIERÍA ELECTRÓNICA

PROFESOR: M.C. JULIO CÉSAR GALLO SÁNCHEZ

MATERIA: APLICACIONES DE MICROCONTROLADORES

UNIDAD 1: MICROCONTROLADORES

CD Y PTO. LÁZARO CÁRDENAS MICHOACÁN MARTES, 19 DE SEPTIEMBRE DE 2023


71S Aplicaciones de Microcontroladores Ingeniería Electrónica

ÍNDICE

Introducción .......................................................................................................................... 1

Material ................................................................................................................................. 3

Equipo .................................................................................................................................... 3

Desarrollo .............................................................................................................................. 4

Funcionamiento del código ................................................................................................. 4

Prueba del programa ........................................................................................................... 9

Código del programa .......................................................................................................... 13

Conclusión ........................................................................................................................... 15

Bibliografía .......................................................................................................................... 16

i
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Introducción

En este documento se presenta el desarrollo de la tercera práctica realizada en la primera


unidad de la materia de Aplicaciones de los Microcontroladores, la cual debe consistir de un
reloj digital realizado utilizando una LCD y su respectiva librería de uso (lcd.c) que se incluye
en el compilador CCS.

El reloj deberá de mostrar la hora, minutos y segundos, deberá ser posible el cambio entre
formato de 24 horas y 12 horas por medio de un botón y además tendrá otros dos botones
que permitan aumentar la hora y los minutos para que el usuario pueda ajustar la hora
adecuada. Para una mejor comodidad del usuario el reloj deberá de realizar la conversión de
las horas al pasar de formato de 24 horas a formato de 12 horas y viceversa, de modo que al
cambiar de formato el usuario no tenga que volver a ajustar la hora adecuada.

Esta práctica deberá de poderse llevar a cabo utilizando ciertos procedimientos lógicos
tratados con anterioridad en el curso, como la detección de los pulsos de botón, la
segmentación de los retardos y el uso de diferentes formatos de variables. Es por ello que se
espera que sea una muy buena práctica para consolidar los conocimientos sobre lo aprendido
en la presente unidad y siente las bases para la realización de un proyecto de aplicación de la
Unidad. El diagrama eléctrico propuesto para la práctica se muestra en la Figura 1.

1
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

5V

RESET 5V
39kΩ

10kΩ
MCLR/Vpp/RE3 1 40 RB7
RA0 2 39 RB6
RA1 3 38 RB5
HORAS RA2 4 RB4
37
5V
RA3 5 36 RB3

PIC18F45K50
MINUTOS RA4 6 35 RB2
5V
RA5 7 34 RB1 220Ω
4.7kΩ RE0 8 33 RB0
MODO
5V RE1 9 32 VDD 5V 5V
4.7kΩ RE2 10 31 VSS
VDD 11 30 RD7
5V
VSS 12 29 RD6 VSS VDD V0 RS RW E D0 D1 D2 D3 D4 D5 D6 D7 A K
4.7kΩ 5V
RA7 13 28 RD5
RA6 14 27 RD4
RC0 15 26 RC7
RC1
RC2
16
17
25
24
RC6
D+
LCD 16X02
VUSB3V3 18 23 D-
RD0 19 22 RD3
RD1 20 21 RD2

Figura 1.- Diagrama eléctrico propuesto para la práctica.

2
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Material

1. Tarjeta de evaluación µvva (Miuva) con PIC18F45K50.


2. Cable Dupont.
3. Cable Micro USB.
4. LCD 16x2.
5. 3 botones pulsadores.
6. 3 resistores de 4.7 kΩ.
7. Protoboard

Equipo

1. Computadora con los softwares MPLAB IDE, CCS y PICkit 2 instalados.

3
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Desarrollo

Funcionamiento del código

Lo primero que se realiza es añadir los archivos de cabecera y definir los pines del
Microcontrolador donde irá conectado cada pin de la LCD, lo cual es necesario para el
funcionamiento de la librería “lcd.c” que se agrega después de estas declaraciones debido a
que necesita de ellas definidas antes de ejecutarse. Además, se definen los pines en los que
irán conectados los botones.

#include "18F45k50.h"
#fuses NOWDT
#use delay(internal=48MHz)

#define LCD_ENABLE_PIN PIN_D4


#define LCD_RS_PIN PIN_D5
#define LCD_RW_PIN PIN_C2
#define LCD_DATA4 PIN_D0
#define LCD_DATA5 PIN_D1
#define LCD_DATA6 PIN_D2
#define LCD_DATA7 PIN_D3
#define BUTTON_HORA PIN_A0
#define BUTTON_MIN PIN_A1
#define BUTTON_MODE PIN_A2
#include "lcd.c"

Se definen las variables horas, min y seg para guardar en ellas los valores correspondientes
al tiempo que se estará mostrando en el reloj, las variables mode y bmode permitirán guardar
el formato actual de hora y el formato anterior de hora, necesario para la conversión horaria,
la variable “apm” guardará si la hora mostrada en el formato de 12 horas es “am” o “pm”, la
variable bhoras guardará siempre la hora anterior para saber cuándo cambiar entre “am” y

4
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

“pm” y la variable “aux” será necesaria para que el cambio entre “am” y “pm” se realice
también cuando sea el usuario el que manualmente esté aumentando la hora.

unsigned int horas = 0, min = 0, seg = 0, mode = 0, bmode


= 1;
unsigned int apm = 1,i, bhoras, aux;

Se inicia la función principal y se mandan algunos mensajes de bienvenida y se configuran


los pines donde irán los botones como entrada.

void main(void){
lcd_init();
lcd_putc("\f PRACTICA 3");
delay_ms(5000);
lcd_putc("\f RELOJ");
delay_ms(2000);
lcd_putc('\f');
output_float(BUTTON_HORA);
output_float(BUTTON_MIN);
output_float(BUTTON_MODE);

Se inicia el ciclo infinito. El primer If tiene la finalidad de estar checando el valor de los
segundos para que cuando llegue a 60 se reinicie a 0 y los “min” incrementen en 1, indicando
que ha pasado un minuto. El segundo If cumple básicamente la misma función, este
incrementa la variable “horas” cuando “min” ha llegado a 60 y reinicia esta a 0.

for(;;){
if(seg >= 60){seg = 0;min++;}
if(min >= 60){min = 0;bhoras=horas;horas++;}

5
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Cuando la variable “mode” sea 1, significará que el reloj se encuentra en formato de 12 horas
por lo que en el siguiente If se le da el tratamiento adecuado cuando esto ocurre. Si “horas”
llega a 13 esta deberá reiniciarse a 1, si “horas” es 12 pero la hora anterior es 11 significa que
debe haber un cambio “am-pm” o viceversa por lo que se togglea el valor de “apm” que
contiene el meridiano en el que se encuentra el reloj y se establecen dos diferentes formas de
imprimir la hora. Cuando “apm” sea 1 se desplegará la hora junto con “pm”, cuando sea 0 se
desplegará la hora junto “am”.

if(mode){
if(horas>=13){horas=1;}
if(horas>=12 && bhoras==11){apm=!apm;}
if(apm)
printf(lcd_putc," %02u:%02u:%02u
pm",horas,min,seg);
else
printf(lcd_putc," %02u:%02u:%02u
am",horas,min,seg);
}

En cambio, cuando la variable “mode” valga cero significa que está en formato de 24 horas,
de manera que solo se establece el límite de “horas” en 24 y se resetea en 0 cuando esto
ocurra.

else{if(horas >= 24){horas = 0;}


printf(lcd_putc," %02u:%02u:%02u ",horas,min,seg);}

El ciclo for de 5 iteraciones servirá para poder testear los valores de los botones 5 veces en
cada segundo. El primer If testea cuando “BUTTON_HORA” se presiona, esto para guardar
la hora actual en “bhoras”, aumentar la variable “horas” y establecer la variable “aux” en 1
para que indique cada que se aumentó la hora, pero no se excedió de 12. El siguiente If testea
cuando al incrementar la variable “horas” el valor llegó a 12, por lo que se togglea “apm”
para detectar el cambio de meridiano y considerarlo en caso de que el modo de 12 horas esté
seleccionado para el siguiente ciclo, en este caso la variable se resetea a 0 indicando que ya

6
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

hubo un cambio de 11 a 12 en “horas”. El último If testea “BUTTON_MIN” para en caso de


ser presionado incrementar la variable “min”.

for(i=1;i<=5;i++)
{
if(input(BUTTON_HORA)){
bhoras=horas;horas++;aux=1;
if(horas>=12 && bhoras==11){apm=!apm;aux=0;}}
else if(input(BUTTON_MIN)){min++;}

Si “BUTTON_MODE” se presiona, lo que se hará es guardar el modo actual en la variable


“bmode” lo que será útil para la conversión horaria y “mode” se togglea indicando el cambio
de modo. Los siguientes If realizan lo siguiente: Si el modo actual “mode” es 0 y el modo
anterior “bmode” es 1 significa que se cambió de formato de 12 horas a 24 horas, por lo que
el siguiente If detecta si la hora actual se encuentra en “pm” ya que es el meridiano en el que
las horas del formato de 12 horas no coincide con el de 24 horas, por lo que si “apm” es 1 y
“horas” se encuentra entre 1 y 11 a la variable horas se le suma 12 para pasar a formato de
24 horas.

También es necesario cambiar las “12 am” a “00” por lo que cuando “apm” sea 0 y “horas”
sea 12, se establecerá “horas” como 0. Cuando “mode” sea 1 y “bmode” sea 0 significa que
se pasó de formato de 24hrs a formato de 12hrs, por lo que si “horas” es mayor que 12 se le
restará a esta 12 y se pondrá “apm” en 1 para indicar “pm”, si “horas” es 12 simplemente se
seleccionará “pm” poniendo “apm” en 1, si “horas” es 0 se asignará a “horas” el valor “12”
y se pondrá el meridiano “am” colocando “apm” en 0, cualquier otro valor de la hora quedará
igual y solo se seleccionará “am” por medio de colocar “apm” en 0. El While final se utiliza
para esperar a que el botón de modo se deje de presionar.

7
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

else if(input(BUTTON_MODE))
{
bmode=mode;mode = !mode;
if(!mode && bmode){if(apm && horas>=1 &&
horas<12){horas+=12;}
else if(!apm && horas==12){horas=0;}
}
if(mode && !bmode){if(horas>12){horas-
=12;apm=1;}
else if(horas == 12){apm=1;}
else if(horas == 0){horas=12;apm=0;}
else{apm=0;}
while(input(BUTTON_MODE));
}

El For que itera 5 veces se termina con un retardo de 200ms, para que al hacer las 5 iteraciones
se complete el minuto. Las últimas líneas que se ejecutarán en cada iteración del ciclo infinito
consisten en colocar el puntero de la LCD en la posición (1,1) para que se sobreescriba sobre
los mensajes anteriores. El If comprueba si el botón “BUTTON_HORA” provocó un cambio
en la hora de 11 a 12 utilizando la variable “aux”, si no hubo cambio la variable “aux” debe
establecerse en 0 de nueva cuenta, si sí hubo se guarda el valor actual de “horas” en “bmode”
y se termina el programa.

delay_ms(200);
}
lcd_gotoxy(1,1);seg++;if(aux){aux=0;}else{bhora=
horas;
}
}
}

8
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Prueba del programa

Primeramente, se descarga el programa en la tarjeta Miuva, mostrada la Figura 2, y se realizan


las conexiones correspondientes para comprobar su funcionamiento empleando la LCD
16x02 (Figura 3) y 3 botones pulsadores, tal como se muestran en la Figura 4.

Figura 2.- Tarjeta de evaluación µvva (Miuva) con PIC18F45K50.

Figura 3.- LCD 16X02.

9
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Figura 4.- Esquema de conexiones para la tarjeta Miuva con LCD y botones.

Como se puede apreciar en la Figura 5, se fijó el reloj a las 13 horas, es decir, está en modo
24 horas. Al presionar el tercer botón (modo), se cambia el formato a 12 horas y marca la 1
pm, como se muestra en la Figura 6. Por otro lado, en la Figura 7 se presenta la hora en
formato 12 horas configurado en tiempo real antes del mediodía.

10
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Figura 5.- Configuración de reloj a formato 24 horas.

Figura 6.- Configuración de reloj a formato 12 horas.

11
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Figura 7.- Configuración de reloj en tiempo real.

12
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Código del programa

#include "18F45k50.h"
#include "18F45k50.h"
#fuses NOWDT
#use delay(internal=48MHz)

#define LCD_ENABLE_PIN PIN_D4


#define LCD_RS_PIN PIN_D5
#define LCD_RW_PIN PIN_C2
#define LCD_DATA4 PIN_D0
#define LCD_DATA5 PIN_D1
#define LCD_DATA6 PIN_D2
#define LCD_DATA7 PIN_D3
#define BUTTON_HORA PIN_A0
#define BUTTON_MIN PIN_A1
#define BUTTON_MODE PIN_C0
#include "lcd.c"
unsigned int horas = 0, min = 0, seg = 0, mode = 0, bmode = 1;
unsigned int apm = 1,i, bhoras, aux;
void main(void){
lcd_init();lcd_putc("\f PRACTICA 3");
delay_ms(5000);
lcd_putc("\f RELOJ");
delay_ms(2000);
lcd_putc('\f');
output_float(BUTTON_HORA);
output_float(BUTTON_MIN);
output_float(BUTTON_MODE);
for(;;){
if(seg >= 60){seg = 0;min++;}
if(min >= 60){min = 0;bhoras=horas;horas++;}
if(mode){
if(horas>=13){horas=1;}
if(horas>=12 && bhoras==11){apm=!apm;}
if(apm)
printf(lcd_putc," %02u:%02u:%02u
pm",horas,min,seg);
else
printf(lcd_putc," %02u:%02u:%02u
am",horas,min,seg);
}
else{if(horas >= 24){horas = 0;}
printf(lcd_putc," %02u:%02u:%02u
",horas,min,seg);}
for(i=1;i<=5;i++)
{

if(input(BUTTON_HORA)){bhoras=horas;horas++;aux=1;if(horas>=12 &&
bhoras==11){apm=!apm;aux=0;}}

13
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

else if(input(BUTTON_MIN)){min++;}
else if(input(BUTTON_MODE))
{
bmode=mode;mode = !mode;
if(!mode && bmode){if(apm && horas>=1 &&
horas<12){horas+=12;}
else
if(!apm && horas==12){horas=0;}
}
if(mode && !bmode){if(horas>12){horas-
=12;apm=1;}
else if(horas
== 12){apm=1;}
else
if(horas == 0){horas=12;apm=0;}

else{apm=0;}
}
while(input(BUTTON_MODE));
}
delay_ms(200);
}
lcd_gotoxy(1,1);seg++;if(aux){aux=0;}else{bhoras=horas;}
}
}

14
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Conclusión

La práctica presentada en este documento ha resultado ser una herramienta valiosa para el
desarrollo del razonamiento lógico en la programación de microcontroladores, especialmente
en lo que respecta al uso de funciones relacionadas con las entradas digitales. Además,
constituyó el primer desafío que exigía la correcta utilización de la librería "lcd.c", lo que
contribuyó significativamente a fortalecer nuestros conocimientos sobre su manejo. Hasta
ese momento, solo habíamos trabajado con programas sencillos que consistían en desplegar
simples datos constantes.

Este programa representó un excelente ejercicio de programación en lenguaje C en general.


Fue necesario emplear de manera precisa las funciones disponibles en este lenguaje para
asegurarnos de que el programa funcionara de manera impecable en los distintos modos de
tiempo (ya sea en formato de 24 horas o 12 horas) y para permitir la conversión de horas
entre ambos formatos, siendo este último aspecto el desafío más complejo de programar.

La importancia de que este programa funcionara a la perfección radica en que será la base
del proyecto de la unidad 1, por lo cual se buscó que este programa funcionara lo mejor
posible en términos de poder registrar, mostrar y modificar la hora, para que a la hora de
realizar el proyecto solo se agreguen ciertas funcionalidades de establecer alarmas y activar
alguna salida digital en función de dicha alarma. Para concluir, se considera que el programa
realizado para esta práctica está en óptimas condiciones para ser la base del proyecto de la
unidad 1.

15
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica

Bibliografía

1. Fabricante: Microchip.
Título: PIC18(L)F2X/45K50 Datasheet.
Editorial: Microchip.

2. Autor: Julio Cesar Gallo Sánchez.


Título: Programando el Microcontrolador PIC18F4550 en Leguaje C con el
compilador CCS en MPLAB.
Edición: 1era Edición.

3. Autores: Eduardo García Breijo.


Título: Compilador C CCS y simulador PROTEUS para Microcontroladores PIC.
Edición: Primera Edición.
Editorial: Alfaomega.

16
Reporte Práctica 1.3

También podría gustarte