/**
******************************************************************************
* @file : main.c
* @author : Auto-generated by STM32CubeIDE
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2026 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
#include <stdint.h>
#include "stm32f103xb.h"
#include "stm32f103_hal.h"
#include "lcd.h"
void delay_ms(uint16_t ms);
void delay_us(uint16_t us);
const lcd_cfg_t lcd_cfg = {
.interface=LCD_INTERFACE_4BIT,
.timing=LCD_TIMING_DELAY
};
int main(void)
{
//activo los tres sets de pines
rcc_clock_enable(RCC_GPIOA);
rcc_clock_enable(RCC_GPIOC);
rcc_clock_enable(RCC_GPIOB);
//pc-13 permanece apagado
gpio_set_output(GPIOC, 13, GPIO_OUTPUT_PP, GPIO_SPEED_2MHZ);
GPIOC->ODR |= (1 << 13);
//entrada para el botón
gpio_set_input(GPIOB, 0, GPIO_INPUT_PUP);
LCD_Init(&lcd_cfg);
LCD_SetCursor(0, 0);
LCD_Print("Microcontrolador");
LCD_SetCursor(0, 1);
LCD_Print("Tarea 2.1");
while ( (GPIOB->IDR & (1 << 0)) != 0 ){
//esperamos a que sea presionado el botón
}
LCD_Send(LCD_CMD_CLEAR, LCD_MODE_CMD);
delay_ms(500);
//declaro mis variables
uint8_t dia = 8;
uint8_t mes = 3;
uint16_t anio = 2026;
uint8_t horas = 23;
uint8_t minutos = 59;
uint8_t segundos = 50;
while ( 1 )
{
//hago cálculos parciales antes de enviarlos a la función LCD_Send
uint8_t horas_dec = ((horas/10)%10);
uint8_t horas_units = (horas%10);
uint8_t minutos_dec = ((minutos/10)%10);
uint8_t minutos_units = (minutos%10);
uint8_t segundos_dec = ((segundos/10)%10);
uint8_t segundos_units = (segundos%10);
uint8_t dia_dec = ((dia/10)%10);
uint8_t dia_units = (dia%10);
uint8_t mes_dec = ((mes/10)%10);
uint8_t mes_units = (mes%10);
//mando a imprimir las variables en su formato ASCII
LCD_SetCursor(0, 0);
LCD_Print("Fecha:");
LCD_Send('0' + dia_dec, LCD_MODE_DATA);
LCD_Send('0' + dia_units, LCD_MODE_DATA);
LCD_Send('/', LCD_MODE_DATA);
LCD_Send('0' + mes_dec, LCD_MODE_DATA);
LCD_Send('0' + mes_units, LCD_MODE_DATA);
LCD_Send('/', LCD_MODE_DATA);
LCD_Send('2', LCD_MODE_DATA);
LCD_Send('0', LCD_MODE_DATA);
LCD_Send('2', LCD_MODE_DATA);
LCD_Send('6', LCD_MODE_DATA);
LCD_SetCursor(0, 1);
LCD_Print("Hora: ");
LCD_Send('0' + horas_dec, LCD_MODE_DATA);
LCD_Send('0' + horas_units, LCD_MODE_DATA);
LCD_Send(':', LCD_MODE_DATA);
LCD_Send('0' + minutos_dec, LCD_MODE_DATA);
LCD_Send('0' + minutos_units, LCD_MODE_DATA);
LCD_Send(':', LCD_MODE_DATA);
LCD_Send('0' + segundos_dec, LCD_MODE_DATA);
LCD_Send('0' + segundos_units, LCD_MODE_DATA);
delay_ms(700); // Esperamos aprox un segundo real
segundos++;
//lógica sencilla para aumento de tiempo y día
if(segundos>=60){
minutos++;
segundos=0;
if(minutos>=60){
horas++;
minutos=0;
if(horas>=24){
dia++;
horas=0;
minutos=0;
segundos=0;
}
}
}
}
}
void delay_ms(uint16_t ms) {
volatile unsigned long t = 0;
for(uint16_t i = 0; i < ms; i++)
{
for(t = 0; t < 800; t++);
}
}
void delay_us(uint16_t us)
{
for (volatile unsigned int cycles = 0; cycles < us; cycles++);
}