Você está na página 1de 4

/*******************************************************************************

FileName: Lista 5 - FATEC SANTO ANDRE


Dependencies: Veja a seção de includes
Processor: PIC18F4550
Compiler: MPLAB X v3.65 + XC8 1.40
Company: FATEC Santo Andre
Author:
Date: 23/10/2021
Software License Agreement: Somente para fins didaticos
*******************************************************************************
File Description: Realizar o funcionamento de um Cronometro Digital , onde o
* Botão B1 inicia a contagem , o Botão B2 para a contagem e o Botão B3 zera a
* contagem.
Change History:

* Created on 23 de Outubro de 2021, 13:56


*******************************************************************************/

// Conclusão: A vantagem principal do sistema com interrupção, na minha opinião,


// é que o programa fica muito mais curto e mais facil de entender. Também me
// permiti que eu faça as ações no momento que eu quiser , sendo mais rapido o
// tempo de ação e resposta.

// Includes do Compilador

#include <xc.h>
#include <stdio.h>
#include <p18f4550.h>

// Includes do Projeto
// Observe que usamos aspas
#include "config_4550.h" //Quando usar o PICSIM LAB
//#include "Config.h" //Quando usar a placa FATEC
#include "displayLCD.h"
#include "adc.h"

//Protótipos das Funções

void delay_ms(unsigned int tempodeAtraso);


void interrupt high_priority Interrupcoes(void);

//******************************************************************************
// Define os apelidos das variáveis do PIC

#define ledRB0 PORTBbits.RB0


#define ledRB7 PORTBbits.RB7
#define botaoB1 PORTEbits.RE0
#define botaoB2 PORTEbits.RE1
#define botaoB3 PORTEbits.RE2

// Variáveis Globais

unsigned int start = 0; // Variavel para iniciar o cronometro.


unsigned int tempo = 0; // Variavel que conta o tempo.

//******************************************************************************
void main(void)
{

const unsigned char Texto_0[] = "FATEC S.A. 2021 ";


const unsigned char Texto_1[] = " LISTA 5 ";
const unsigned char Texto_2[] = "CRONOMETRO= ";
const unsigned char Texto_3[] = "GABRIEL SANTOS ";

ADCON1 = 0x0F; // Define somente as entradas digitais


TRISB = 0b00000111; // Define todos os pinos da porta como saida
TRISE = 0b11111111; // Define todos os pinos como entrada

// Prepara o Display

PORTB = 0b11111100;
ConfiguraLCD();

// Tela de Saudação
delay_ms(1);
PosicaoCursorLCD(1, 1);
EscreveFraseRamLCD(Texto_0);
PosicaoCursorLCD(2, 1);
EscreveFraseRamLCD(Texto_1);
DesligaCursor();
delay_ms(1000);

PosicaoCursorLCD(1, 1);
EscreveFraseRamLCD(Texto_2);
PosicaoCursorLCD(2, 1);
EscreveFraseRamLCD(Texto_3);

//******************************************************************************

// Configura Interrupção Externa 0

INT0IE = 1; //Ativa interrupção Externa 0


INTEDG0 = 0; //Ativa borda de descida
IPEN = 1; //Ativa prioridade alta
INT0IF = 0; //Desliga flag de sinalização
GIE = 1; //Ativa chave geral das interrupções

// Configura Interrupção Externa 1

INT1IE = 1; //Ativa interrupção Externa 1


INTEDG1 = 0; //Ativa borda de descida
IPEN = 1; //Ativa prioridade alta
INT1IP = 1; // Alta Prioridade
INT1IF = 0; //Desliga flag de sinalização
GIE = 1;

// Configuração do Timer 0

T0CS = 0; // Seleciona o Clock Interno


PSA = 1; // Prescaler desativado
TMR0 = 53536; // Tempo de 1 ms.
TMR0ON = 1; // Habilita o meu Timer 0
TMR0IE = 1; // Seleciona o TIMER 0 como Interrupção
T08BIT = 1; // Determina o numero de bits que eu quero , no caso 8 Bits
TMR0IF = 0;

while(1)
{

PosicaoCursorLCD(1,12);
EscreveInteiroLCD(tempo); // Mostra a Contagem no Display

if (start == 1){ // Inicia a minha contagem assim que minha interrupção


// for acionada.
tempo++;
}

if (botaoB3 == 0){ //Zera totalmente a contagem do Cronometro e zera o


disparo.
start = 0;
tempo = 0;
}
}

// Conclusão: A vantagem principal do sistema com interrupção, na minha opinião,


// é que o programa fica muito mais curto , mais facil de entender, ficando de
// modo muito mais simples.

//******************************************************************************
// Esta função é usada para gerar um delay programável, cuja base de tempo
// de 1 ms. Assim, se você colocar delay_ms(500), ele esperará um tempo de 500 ms
// para seguir o programa.
//******************************************************************************
void delay_ms(unsigned int tempodeAtraso) // Gera delay para o novo compilador
{
while (--tempodeAtraso)
{
__delay_ms(1);
}
}

/*************************************************************(****************
* * Atende as interrupções externas e de tempo
* ********************************************************** */

void interrupt high_priority Interrupcoes(void)


{

if(INT0IF == 1) // Reconhecer o INT0


{
INT0IF = 0;

start = 1; // Aciona o disparo do Contador


}

if(INT1IF == 1) // Reconhecer o INT1


{

INT1IF = 0;

start = 0; // Pausa a contagem no valor que está na tela

if(INT2IF == 1) // Reconhecer o INT2


{
INT2IF = 0;
}

Você também pode gostar