/******************************************************************************
Nome do Arquivo : main.c
Descrição : Cronometro
Ambiente : WOKWI e RP2040 C/C++ SDK
Responsável : Nathan Santana Soares
*****************************************************************************/
/******************************************************************************
HEADER-FILES (Somente os arquivos necessários nesse arquivo)
******************************************************************************/
#include <stdio.h>
#include <string.h>
#include "pico/stdlib.h"
#include "display_lcd.h"
#include "hardware/irq.h"
#include "hardware/timer.h"
#include "hardware/gpio.h"
/*****************************************************************************/
/******************************************************************************
Variaveis Globais
******************************************************************************/
#define OUT_H 1
#define OUT_L 0
#define LED 28
#define LED_2 27
#define CHAVE_VERDE 15
#define CHAVE_VERMELHO 14
#define OUT 1
#define IN 0
#define ALARM_NUM 0
#define ALARM_IRQ TIMER_IRQ_0
#define DELAY 1000000
uint16_t valor_cronometro = 0;
//uint8_t toggle = 1;
//uint8_t trava_1 = 0;
//uint8_t trava_2 = 0;
//uint8_t inicio = 1;
uint8_t controle_cronometro = 0b1111; //4°bit primeira escrita,3°bit libera escrita no lcd, 2°bit libera a funcao parar contagem, 1°bit trava_1 libera a funcao começar contagem.
/*****************************************************************************/
/******************************************************************************
Prototipos das funções
******************************************************************************/
void alarm_irq(void)
{
printf("Interrupção Aconteceu \n");
hw_clear_bits(&timer_hw->intr, 1u << ALARM_NUM);
uint64_t target = timer_hw->timerawl + DELAY;
timer_hw->alarm[ALARM_NUM] = (uint32_t) target;
valor_cronometro++;
controle_cronometro |= 0b0100;
printf("Valor do Cronometro: %d\n", valor_cronometro);
}
void system_init(void);
void button_callback(uint gpio);
/*****************************************************************************/
/******************************************************************************
Funcao: void main(void)
Entrada: Nenhuma (void)
Saída: Nenhuma (void)
Descrição: Função principal
*****************************************************************************/
void main(void)
{
unsigned char texto_linha_um[17] = "FATEC S.A. 2025";
unsigned char texto_linha_dois[19] = "Microcontrolador";
unsigned char texto_contagem[17] = "Cronometro";
stdio_init_all();
printf("Hello, Wokwi!\n");
sleep_ms(250);
system_init();
posicao_cursor_lcd(1, 0);
escreve_frase_ram_lcd(texto_linha_um);
posicao_cursor_lcd(2, 0);
escreve_frase_ram_lcd(texto_linha_dois);
sleep_ms(2000);
DesligaCursor();
gpio_set_irq_enabled_with_callback(CHAVE_VERDE, GPIO_IRQ_EDGE_FALL, true, (gpio_irq_callback_t)&button_callback);
gpio_set_irq_enabled_with_callback(CHAVE_VERMELHO, GPIO_IRQ_EDGE_FALL, true, (gpio_irq_callback_t)&button_callback);
while (true)
{
if (controle_cronometro&0b0100)
{
printf("Escrita no LCD!\n");
LIMPA_DISPLAY();
posicao_cursor_lcd(1, 3);
escreve_frase_ram_lcd(texto_contagem);
posicao_cursor_lcd(2, 7);
escreve_inteiro_lcd(valor_cronometro);
controle_cronometro &= 0b1011;
}
sleep_ms(5);
}
}
/******************************************************************************
Funcao: void system_init(void)
Entrada: Nenhuma (void)
Saída: Nenhuma (void)
Descrição: Inicializa sistema (microcontrolador e periféricos)
*****************************************************************************/
void system_init(void)
{
gpio_init(LED);
gpio_set_dir(LED, OUT);
gpio_init(LED_2);
gpio_set_dir(LED_2, OUT);
gpio_init(CHAVE_VERDE);
gpio_set_dir(CHAVE_VERDE, IN);
gpio_pull_up(CHAVE_VERDE);
gpio_init(CHAVE_VERMELHO);
gpio_set_dir(CHAVE_VERMELHO, IN);
gpio_pull_up(CHAVE_VERMELHO);
printf("System Init!\n");
sleep_ms(250);
init_lcd();
}
void button_callback(uint gpio)
{
if ((gpio == CHAVE_VERDE) && (controle_cronometro&0b0001))
{
valor_cronometro = 0;
printf("Button Green pressed!\n");
uint64_t target = 0;
hw_set_bits(&timer_hw->inte, 1u << ALARM_NUM) ;
hw_clear_bits(&timer_hw->intr, 1u << ALARM_NUM);
irq_set_exclusive_handler(ALARM_IRQ, alarm_irq) ;
irq_set_enabled(ALARM_IRQ, true);
target = timer_hw->timerawl + DELAY;
timer_hw->alarm[ALARM_NUM] = (uint32_t) target;
//trava_1 = 1;
//trava_2 = 0;
controle_cronometro &= 0b1110;
controle_cronometro |= 0b0010;
if(controle_cronometro&0b1000)
{
controle_cronometro &= 0b0111;
}
else
{
controle_cronometro |= 0b0100;
}
}
if ((gpio == CHAVE_VERMELHO) && (controle_cronometro&0b0010))
{
printf("Button Red pressed!\n");
irq_set_enabled(ALARM_IRQ, false);
hw_clear_bits(&timer_hw->inte, 1u << ALARM_NUM);
//hw_clear_bits(&timer_hw->intr, 1u << ALARM_NUM);
//trava_1 = 0;
//trava_2 = 1;
controle_cronometro &= 0b1101;
controle_cronometro |= 0b0001;
}
}