Boa noite,
Sou novo aqui, técnico em eletrônica, um especialista em placas de circuito eletrônicos e gosto muito conhecer projetos em mikroc, peguei aqui um codigo na net em mikroc de um cronometro com hs min segundos e milessimos, mas quem postou o codigo não deu respostas as perguntas nas postagens, e assim dificultando estudo do projeto, este é o código, fiz a placa e funcionou perfeitamente,com pic 16f628a gostaria se alguém poderia me ajudar, o disparo do cronometro você tem que apertar o botao e soltar ai começa o cronometro, e para o cronometro parar tenho que apertar de novo e soltar o botão,, gostaria de saber se poderia iniciar o cronometro apertando o botão e ao solta lo o cronometro iria parar, certo que alguém possa me dar aprendizado nesse sentido fico grato desde já.
sbit LCD_RS at RB6_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_RS_Direction at TRISB6_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
sbit Zerar at PORTB.B7;
unsigned MicroSegundos at TMR1L;
typedef struct
{
char minutos;
char segundos;
unsigned mSegundos;
}Cronometro;
Cronometro Crono = {0,0,0};
//1us( contagem dos microsegundos )
void Timer1_Init()
{
T1CON = 0b00000000; //Prescaler 1:1 e stop
}
//1ms
void Timer0_Init()
{
OPTION_REG = 0x81; //prescaler 1:4
TMR0 = 6; // (4/clock) * (256 - 6) * 4 = 1ms
TMR0IE_Bit = 0; //stop
}
void Interrupt()
{
if( TMR0IF_Bit )
{
TMR0IF_Bit = 0;
TMR0 = 6;
MicroSegundos = 0;
Crono.mSegundos++;
if( Crono.mSegundos >= 1000 )
{
Crono.mSegundos = 0;
Crono.segundos++;
if( Crono.segundos >= 60 )
{
Crono.segundos = 0;
Crono.minutos++;
if( Crono.minutos >= 99 )
{
Crono.minutos = 0;
}
}
}
}
else if( INTF_Bit ) // Iniciar/Pausar
{
INTF_Bit = 0;
TMR0IF_Bit = 0;
TMR0 = 6;
TMR0IE_Bit = ~TMR0IE_Bit;
TMR1ON_Bit = ~TMR1ON_Bit;
}
}
void main()
{
char flag = 0;
#define zerar_flag flag.B1
CMCON = 7;
Lcd_Init();
Lcd_Cmd( _LCD_CURSOR_OFF );
Lcd_Out( 1, 5, " m s ms us" );
TRISB.B7 = 1;
GIE_bit = 1;
PEIE_Bit = 1;
INTE_Bit = 1;
MicroSegundos = 0;
Timer0_Init();
Timer1_Init();
while(1)
{
if( Zerar ) zerar_flag = 1;
if( !Zerar && zerar_flag )
{
zerar_flag = 0;
Crono.minutos = 0;
Crono.segundos = 0;
Crono.mSegundos = 0;
MicroSegundos = 0;
}
Lcd_Chr( 2, 5, Crono.minutos/10 + '0' );
Lcd_Chr_CP( (Crono.minutos%10) + '0' );
Lcd_Chr_CP(':');
Lcd_Chr_CP( Crono.segundos/10 + '0' );
Lcd_Chr_CP( (Crono.segundos%10) + '0' );
Lcd_Chr_CP(':');
Lcd_Chr_CP( Crono.mSegundos/100 + '0' );
Lcd_Chr_CP( (Crono.mSegundos/10%10) + '0' );
Lcd_Chr_CP( (Crono.mSegundos%10) + '0' );
Lcd_Chr_CP(':');
Lcd_Chr_CP( MicroSegundos/100 + '0' );
Lcd_Chr_CP( (MicroSegundos/10%10) + '0' );
Lcd_Chr_CP( (MicroSegundos%10) + '0' );
}
}
cronometro.bmp