#include "stm32f103xb.h"
#include <stdint.h>
void delay_us(uint16_t us);
void delay_ms(uint16_t ms);
void GPIO_Config(void);
void LCD_Init(void);
void LCD_Send(uint8_t value, uint8_t rs);
void LCD_Print(char *str);
void LCD_Clear(void);
void LCD_Line2(void);
void print_2digits(uint8_t value);
void print_4digits(uint16_t value);
int main(void)
{
uint8_t dia = 6, mes = 2;
uint16_t anio = 2026;
uint8_t horas = 12, minutos = 0, segundos = 0;
GPIO_Config();
LCD_Init();
LCD_Print("Microcontrolador");
LCD_Line2();
LCD_Print("Tarea 2.1");
while(1)
{
if((GPIOB->IDR & (1 << 0)) == 0)
{
delay_ms(10);
while((GPIOB->IDR & (1 << 0)) == 0);
delay_ms(10);
break;
}
}
while(1)
{
LCD_Clear();
LCD_Print("Fecha: ");
print_2digits(dia);
LCD_Send('/', 1);
print_2digits(mes);
LCD_Send('/', 1);
print_4digits(anio);
LCD_Line2();
LCD_Print("Hora: ");
print_2digits(horas);
LCD_Send(':', 1);
print_2digits(minutos);
LCD_Send(':', 1);
print_2digits(segundos);
delay_ms(1000);
segundos++;
if(segundos >= 60)
{
segundos = 0;
minutos++;
}
if(minutos >= 60)
{
minutos = 0;
horas++;
}
if(horas >= 24)
{
horas = 0;
dia++;
}
if(dia > 31)
{
dia = 1;
mes++;
}
if(mes > 12)
{
mes = 1;
anio++;
}
}
}
void GPIO_Config(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
GPIOA->CRL = 0x22222222;
GPIOA->CRH &= ~(0xFFF);
GPIOA->CRH |= (0x222);
GPIOB->CRL &= ~(0xF << 0);
GPIOB->CRL |= (0x8 << 0);
GPIOB->ODR |= (1 << 0);
}
void LCD_Init(void)
{
delay_ms(20);
LCD_Send(0x38, 0);
delay_ms(5);
LCD_Send(0x38, 0);
delay_us(150);
LCD_Send(0x38, 0);
delay_us(150);
LCD_Send(0x38, 0);
LCD_Send(0x0C, 0);
LCD_Send(0x06, 0);
LCD_Send(0x01, 0);
delay_ms(2);
}
void LCD_Send(uint8_t value, uint8_t rs)
{
if(rs)
GPIOA->BSRR = (1 << 8);
else
GPIOA->BRR = (1 << 8);
GPIOA->BRR = (1 << 9);
GPIOA->ODR &= ~(0x00FF);
GPIOA->ODR |= value;
GPIOA->BSRR = (1 << 10);
delay_us(2);
GPIOA->BRR = (1 << 10);
delay_us(100);
}
void LCD_Print(char *str)
{
while(*str)
{
LCD_Send(*str, 1);
str++;
}
}
void LCD_Clear(void)
{
LCD_Send(0x01, 0);
delay_ms(2);
}
void LCD_Line2(void)
{
LCD_Send(0xC0, 0);
}
void print_2digits(uint8_t value)
{
uint8_t dec = (value / 10) % 10;
uint8_t uni = value % 10;
LCD_Send('0' + dec, 1);
LCD_Send('0' + uni, 1);
}
void print_4digits(uint16_t value)
{
uint8_t mil = (value / 1000) % 10;
uint8_t cen = (value / 100) % 10;
uint8_t dec = (value / 10) % 10;
uint8_t uni = value % 10;
LCD_Send('0' + mil, 1);
LCD_Send('0' + cen, 1);
LCD_Send('0' + dec, 1);
LCD_Send('0' + uni, 1);
}
void delay_us(uint16_t us)
{
volatile uint32_t i;
while(us--)
{
for(i = 0; i < 8; i++);
}
}
void delay_ms(uint16_t ms)
{
volatile uint32_t i;
while(ms--)
{
for(i = 0; i < 2000; i++);
}
}