Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //GERADOR DE FUNÇÕES
- #include <16f877a.h>
- #use delay (clock=20000000)
- #fuses HS, NOWDT, PUT, BROWNOUT, NOLVP
- #define LCD_DB4 PIN_D4
- #define LCD_DB5 PIN_D5
- #define LCD_DB6 PIN_D6
- #define LCD_DB7 PIN_D7
- #define LCD_E PIN_E1
- #define LCD_RS PIN_E0
- #include "lcd.c"
- int8 k=1, ct_p = 0;
- int16 freq, per, temp;
- float freq_k;
- int1 flag=0;
- int16 x=0,y=0;
- #int_ccp1 //Interrupção Captura do CCP1
- void capture_isr()
- {
- ++ct_p;
- per = get_timer1();
- set_timer1(0);
- }
- void atualiza_lcd()
- {
- switch (x)//seleção da forma de onda
- {
- case 0:
- lcd_putc("\f ONDA SENOIDAL");
- output_high(pin_b3);
- output_low(pin_b4);
- break;
- case 1:
- lcd_putc("\f ONDA QUADRADA");
- output_high(pin_b4);
- output_low(pin_b3);
- break;
- case 2:
- lcd_putc("\f ONDA TRIANGULAR");
- output_high(pin_b3);
- output_high(pin_b4);
- break;
- default:
- x=0;
- output_low(pin_c0);
- output_low(pin_c1);
- }
- switch (y) // seleção da escala desejada
- {
- case 0:
- lcd_putc(" \n 1Hz a 100Hz");
- output_high(pin_b3);
- output_low(pin_b4);
- break;
- case 1:
- lcd_putc(" \n 100Hz a 500Hz");
- output_high(pin_b3);
- output_low(pin_b4);
- break;
- case 2:
- lcd_putc("\n 500Hz a 4KHz");
- output_high(pin_b3);
- output_low(pin_b4);
- break;
- default:
- y=0;
- output_high(pin_b3);
- output_low(pin_b4);
- }
- if (freq <= 1000)
- {
- lcd_gotoxy(15,0);
- printf(lcd_putc," Freq: %lu Hz ",freq); //Impressão no LCD
- }
- else if (freq > 1000) // Divide fre. por 1000 e imprime prefixo k
- {
- lcd_gotoxy(15,0);
- printf(lcd_putc," Freq: %.2f kHz ",freq_k); //Impressão no LCD
- }
- }
- void main()
- {
- lcd_init(); //Inicializa LCD
- setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Configura TMR1
- setup_ccp1(CCP_CAPTURE_RE);
- enable_interrupts(int_ccp1); //Habilita interrupção externa em RB0
- enable_interrupts(global); //Habilitação geral de interrupção
- while (TRUE)
- {
- if (ct_p)
- {
- freq = 625000.0/per;
- freq_k = 625.0/per;
- ct_p = 0;
- }
- if(k==1) //imprime a frequência
- {
- atualiza_lcd();
- }
- //leitura dos pinos de entrada para seleção da forma de onda e escala
- if(!input(pin_b0)&& (flag==0))
- {
- x++;
- flag=1;
- }
- if(!input(pin_b1)&& (flag==0))
- {
- y++;
- flag=1;
- }
- else if(input(pin_b0)&& input(pin_b1))
- {
- flag=0;
- }
- if (temp>0)
- {
- atualiza_lcd();
- delay_ms(10);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment