Resolução feita em CCS C Compiler
#include <16F877A.h>
#fuses xt, nowdt, noprotect, put, brownout
#use delay(clock = 4M)
#define RS PIN_E0
#define EN PIN_E1
void Inicializa(void);
void Lcd_Inst(char dado);
void Lcd_Dado(char dado);
int16 periodo1, periodo2;
int32 periodo;
boolean flag = 0;
void main(){
Inicializa();
Lcd_Inst(0x82);
printf(lcd_dado, "\fPeriodo\n");
while(TRUE){
//TODO: User Code
Lcd_Inst(0xC2);
printf(lcd_dado, "TEMPO = %lu us", periodo);
}
}
#int_ccp1
void ccp1_int(){
if (flag == 0){
periodo1 = CCP_1;
flag = 1;
}else{
periodo2 = CCP_1;
periodo = ((periodo2 - periodo1) * 2);
Set_Timer1(0);
flag = 0;
}
}
void Inicializa(void){
Setup_Timer_1(T1_INTERNAL|T1_DIV_BY_2);
Setup_ccp1(CCP_CAPTURE_RE);
Enable_Interrupts(GLOBAL);
Enable_Interrupts(INT_CCP1);
Lcd_Inst(0x38);
delay_ms(1);
Lcd_Inst(0x38);
Lcd_Inst(0x0C);
Lcd_Inst(0x06);
Lcd_Inst(0x01);
delay_ms(1);
}
void Lcd_Inst(char dado){
Disable_Interrupts(GLOBAL);
output_low(RS);
output_d(dado);
delay_cycles(2);
output_high(EN);
delay_ms(1);
output_low(EN);
Enable_Interrupts(GLOBAL);
}
void Lcd_Dado(char dado){
Disable_Interrupts(GLOBAL);
output_high(RS);
output_d(dado);
delay_cycles(2);
output_high(EN);
delay_ms(1);
output_low(EN);
Enable_Interrupts(GLOBAL);
}
Software: Proteus 7.9 |
Créditos para: https://docplayer.com.br/84893568-Omicrocontrolador-pic16f877a-apresenta-dois-modulos.html
Nenhum comentário:
Postar um comentário