You are on page 1of 3

////////////////////////////////////////////////////////////////////////////////

//
Programa Projeto Tacmetro ( Conta-giros )
//
//
Microcontrolador PIC16f628A
//
//
Compilador mikroC PRO for PIC ver 5.60
//
//
Autor: Jeferson Alves Oliveira
//
//
Site: http://eletricamentefalando.blogspot.com.br/
//
////////////////////////////////////////////////////////////////////////////////
// Declara as Variveis Globais ************************************************
sbit LCD_RS at RB1_bit;
// Determina o bit de instrues ou dado
sbit LCD_EN at RB2_bit;
// Determina o bit de "enable" do LCD
sbit LCD_D4 at RB7_bit;
// Determina pino de dados do LCD
sbit LCD_D5 at RB6_bit;
// Determina pino de dados do LCD
sbit LCD_D6 at RB5_bit;
// Determina pino de dados do LCD
sbit LCD_D7 at RB4_bit;
// Determina pino de dados do LCD
sbit
sbit
sbit
sbit
sbit
sbit

LCD_RS_Direction
LCD_EN_Direction
LCD_D4_Direction
LCD_D5_Direction
LCD_D6_Direction
LCD_D7_Direction

at
at
at
at
at
at

TRISB1_bit;
TRISB2_bit;
TRISB7_bit;
TRISB6_bit;
TRISB5_bit;
TRISB4_bit;

//
//
//
//
//
//

Direo
Direo
Direo
Direo
Direo
Direo

dos
dos
dos
dos
dos
dos

pinos
pinos
pinos
pinos
pinos
pinos

do
do
do
do
do
do

LCD
LCD
LCD
LCD
LCD
LCD

// Declara as variveis *******************************************************


const char character[] = {4,10,14,17,17,17,14,0};
unsigned char txt[10];
unsigned int pulsos = 0;
unsigned int total = 0;
int timer = 0;
// Prottipos de funes *******************************************************
void CustomChar(char pos_row, char pos_char);
void interrupt();
void RPM();
// Inicio *********************************************************************
void main()
{
// Configura as Portas *********************************************************
TRISA = 0b00100000;
// define PORTA como ssesssss
TRISB = 0b00001000;
// define PORTB como ssssesss
INTCON.GIE = 1;
// Habilita chave geral das interrupes
INTCON.PEIE = 1;
// Habilita Interrupo dos perifricos
PIE1.TMR1IE = 1;
// Habilita interrpes de TMR1
PIE1.CCP1IE = 1;
// Habilita Interrupo do mdulo CCP
T1CON = 0b00110001;
// Liga TIMER1, prescaler 1:8, Clock interno
CCP1CON = 0b00000101;
// CCP1 em modulo CAPTURA e borda de SUBIDA
//CCP1CON = 0b00000100;
// CCP1 em modulo CAPTURA e borda de DESCIDA
PIR1.CCP1IF = 0;
// Limpa a flag para nova captura
PIR1.TMR1IF = 0;
// Limpa a flag do TIMER1 para uma nova contagem
// Atribuio ******************************************************************
TMR1H = 0b00001011;
// Inicializa os registradores do TMR1
TMR1L = 0b11011011;
// (65535 - 3035) x (1 (Fosc / 4)) x Prescaler
// Configura LCD ***************************************************************
Lcd_Init();
// Inicializa o LCD
Lcd_Cmd(_LCD_CLEAR);
// Limpa o display
Lcd_Cmd(_LCD_CURSOR_OFF);
// Desliga o Cursor

Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,5,"Jeferson");
Lcd_Out(2,5,"Projetos");
Delay_ms(2000);

// Limpa o display
// Escreve o texto na primeira linha
// Escreve o texto na segunda linha

Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,4,"Tacmetro");
CustomChar(1,7);
Lcd_Out(2,3,"Conta-giros");
Delay_ms(2000);

//
//
//
//

Limpa o
Escreve
Escreve
Escreve

display
o texto na primeira linha
o Caractere
o texto na segunda linha

Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,4,"Tacmetro");
CustomChar(1,7);
Lcd_Out(2,3,"RPM = ");

//
//
//
//

Limpa o
Escreve
Escreve
Escreve

display
o texto na primeira linha
o Caractere
o texto na segunda linha

// Loop ************************************************************************
do {
if (timer == 2)
{
timer = 0;
RPM();
}
else if (timer > 2)
{
timer = 0;
PORTB.F0 = 1;
// Em caso de erro de leitura liga o led(pino 6)
Delay_ms(20);
PORTB.F0 = 0;
}
} while(1);
}
// Funes *********************************************************************
void CustomChar(char pos_row, char pos_char){
char i;
Lcd_Cmd(64);
for (i = 0; i<=7; i++) Lcd_Chr_CP(character[i]);
Lcd_Cmd(_LCD_RETURN_HOME);
Lcd_Chr(pos_row, pos_char, 0);
}
void interrupt()
{
if(PIR1.CCP1IF)
{
PIR1.CCP1IF = 0;
pulsos ++;
}
else if(PIR1.TMR1IF)
{
PIE1.TMR1IE = 0;
PIE1.CCP1IE = 0;
TMR1H = 0b00001011;
TMR1L = 0b11011011;
timer ++;
PIR1.TMR1IF = 0;
PIE1.CCP1IE = 1;
PIE1.TMR1IE = 1;
}

// Limpa a flag para nova captura

// Desabilita interrpes de TMR1


// Desabilita interrupo - perifricos CCP1
// Inicializa os registradores do TMR1
// Limpa a flag do TIMER1
// Habilita interrupo - perifricos CCP1
// Habilita interrpes de TMR1

}
void RPM()
{
total = pulsos * 60;
WordToStr(total, txt);
Lcd_Out(2,9,"
");
Lcd_Out(2,9,txt);
pulsos = 0;
}

// Converte em texto para impresso


// Limpa a segunda linha
// Imprime valores no display

You might also like