#include <stdint.h>
#include "stm32f103xb.h"
#include "lcd.h"
// Prototipos de delay (Única definición aquí)
void delay_ms(uint16_t ms);
void delay_us(uint16_t us);
// Variables del Reloj
int seg = 00, min = 00, hor = 00;
int dia = 5, mes = 3, anio = 2026;
int main(void) {
// Habilitar relojes
RCC->APB2ENR |= (1 << 2) | (1 << 4);
// PC14 como entrada con Pull-up (Botón)
GPIOC->CRH &= ~(0x0F << 24); // PC14 bits [27:24]
GPIOC->CRH |= (0x08 << 24); // MODE=00, CNF=10 => input pull-up/pull-down
GPIOC->ODR |= (1 << 14); // pull-up (ODR=1)
LCD_Init();
// Pantalla inicial
LCD_SetCursor(0, 0);
LCD_Print("Microcontrolador");
LCD_SetCursor(0, 1);
LCD_Print("Tarea 2.1");
// Esperar botón en PA8
while( (GPIOC->IDR & (1 << 14)) != 0 ); // espera a que se presione (baje a 0)
delay_ms(50);
while( (GPIOC->IDR & (1 << 14)) == 0 ); // espera a que se suelte (suba a 1)
LCD_Send(LCD_CMD_CLEAR, LCD_MODE_CMD);
while(1) {
seg++;
if(seg >= 60) { seg = 0; min++; }
if(min >= 60) { min = 0; hor++; }
if(hor >= 24) hor = 0;
LCD_SetCursor(0, 0);
LCD_Print("Fecha:05/03/2026");
LCD_SetCursor(0, 1);
LCD_Print("Hora: ");
LCD_Send('0' + (hor/10), LCD_MODE_DATA);
LCD_Send('0' + (hor%10), LCD_MODE_DATA);
LCD_Print(":");
LCD_Send('0' + (min/10), LCD_MODE_DATA);
LCD_Send('0' + (min%10), LCD_MODE_DATA);
LCD_Print(":");
LCD_Send('0' + (seg/10), LCD_MODE_DATA);
LCD_Send('0' + (seg%10), LCD_MODE_DATA);
delay_ms(1000);
GPIOC->ODR ^= (1 << 13); // Parpadeo de LED para ver que corre
}
}
// Implementación de delays
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++);
}