Skip to content

Instantly share code, notes, and snippets.

@Microcontrolandos
Last active February 18, 2019 18:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Microcontrolandos/1363ad6bb0c6fe1cb0d5 to your computer and use it in GitHub Desktop.
Save Microcontrolandos/1363ad6bb0c6fe1cb0d5 to your computer and use it in GitHub Desktop.
/*
Projeto: Timer utilizando o PIC16F628A e display LCD
Autor: Tiago
Compilador: MikroC PRO PIC
Clock: INTOSC 4MHz
Blibliotecas Utilizadas: LCD
Criado em: 29/12/12 por Tiago
Modificado em: 22/01/15 por Tiago
- Adicionado pisca-pisca do caracter ':' no display LCD
- Alterado e movido o código que decrementa os segundos e minutos para a rotina de interrupção
*/
/* Pinos do LCD */
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
/* Variáveis */
char cnt;
short minutos, segundos;
char flags = 0;
/* Interrupção do timer0 a cada 8ms */
void interrupt()
{
TMR0 = 131; //carrrega TMR0 com o valor 131
INTCON.T0IF = 0;//limpa a flag de interrupção
if( flags.B0 )
{
cnt++;
if( cnt >= 125 ) //8ms * 125 = 1s
{
cnt = 0;
segundos--;
if( segundos < 0 )
{
segundos = 59;
minutos--;
if( minutos < 0 )
{
PORTB.F6 = 1;
minutos = 0;
segundos = 0;
flags.B0 = 0;
}
}
}
}
}
void main()
{
CMCON = 0b11111111;//Desliga comparador analogico
OPTION_REG = 0b00000101; //Configura o timer0 ( prescaler 1:64 )
INTCON.GIE = 1; //Habilita interrupcap global
INTCON.T0IE = 1; //Habilita interrupcao do timer0
TMR0 = 131; //Carrega TMR0 com o valor 131 ( 256 - 125 )
TRISB = 0b00000000;//Define todas os pinos da PORTA como saidas
TRISA = 0b11111111;//Define todas os pinos da PORTB como entradas
PORTB.B6 = 0; //Define o pino RB6 com nivel logico 0
Lcd_Init(); //Inicializa o display
Lcd_Cmd( _LCD_CLEAR ); //Limpa o display
Lcd_Cmd( _LCD_CURSOR_OFF ); //Desativa o cursor do display
while( 1 )
{
if( !PORTA.B2 ) //Ajuste dos segundos habilitado. Botao liberado.
{
if( PORTA.B0 ) flags.B1 = 1; //Botao Ajuste foi pressionado
if( !PORTA.B0 && flags.B1 ) //Botao Ajuste foi liberado
{
flags.B1 = 0;
segundos++;
if( segundos >= 60 ) segundos = 0;
}
}
else //Ajuste dos minutos habilitado. Botao pressionado.
{
if( PORTA.B0 ) flags.B1 = 1; //Botao Ajuste foi pressionado
if( !PORTA.B0 && flags.B1 ) //Botao Ajuste foi liberado
{
flags.B1 = 0;
minutos++;
if( minutos >= 60 ) minutos = 0;
}
}
if( PORTA.B1 ) flags.B2 = 1; //Botao Start/Pause foi pressionado
if( !PORTA.B1 && flags.B2 ) //Botao Start/Pause foi liberado
{
flags.B2 = 0;
if( PORTB.B6 )
PORTB.B6 = 0;
else if( ( minutos > 0 ) && ( segundos > 0 ) )
flags.B0 = ~flags.B0;
}
Lcd_Out( 1, 5, "Timer" );
Lcd_Chr( 2, 5, minutos / 10 + '0' );
Lcd_Chr_CP( minutos % 10 + '0' );
if( flags.B0 && segundos.B0 ) //Faz o simbolo ':' piscar a cada segundo
Lcd_Chr_CP( ' ' );
else
Lcd_Chr_CP( ':' );
Lcd_Chr_CP( segundos / 10 + '0' );
Lcd_Chr_CP( segundos % 10 + '0' );
Delay_ms( 100 );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment