#include <16F877A.H>
#include <regs_16f.h>
#fuses XT,NOWDT,NOLVP
#use delay(clock=4000000)
#define E RD3
#define RS RD2
#define D0 RD4
#define D1 RD5
#define D2 RD6
#define D3 RD7
void escreve_texto_display_lcd(char texto[],unsigned int8 posicao_inicial);
void escreve_digitos_display_lcd(unsigned int8 valor,unsigned int8 endereco);
void envia_byte_display_lcd(unsigned int8 dado);
void limpa_display_lcd(void);
void inicializa_display_lcd(void);
void fixa_display_lcd(void);
void pwm_variavel(unsigned int16 valor_CCPR1L);
char teclado(void);
char texto[16];
void main(void)
{
unsigned int8 digito_1,digito_2,digito_3;
unsigned int8 le_teclado;
TRISD=0b00000011;
TRISC=0b11000000;
inicializa_display_lcd();
limpa_display_lcd();
strcpy(texto," PWM dt = 0-100%");
escreve_texto_display_lcd(texto,0x80);
while(TRUE)
{
le_teclado=teclado();
digito_1=(le_teclado%100)/100;
digito_2=(le_teclado%10)/1;
digito_3=(le_teclado%1)/0.1;
escreve_digitos_display_lcd(digito_1,0x95);
escreve_digitos_display_lcd(digito_2,0x96);
escreve_digitos_display_lcd(digito_3,0x97);
strcpy(texto,"%");
escreve_texto_display_lcd(texto,0x99);
if(le_teclado==0)
{
CCP1M3=CCP1M2=0;
strcpy(texto,"pwm desligado");
escreve_texto_display_lcd(texto,0x92);
}
pwm_variavel(25*le_teclado);
}
}
void envia_byte_display_lcd(unsigned int8 dado)
{
delay_us(100);
E=0;
D0=bit_test(dado,4);
D1=bit_test(dado,5);
D2=bit_test(dado,6);
D3=bit_test(dado,7);
fixa_display_lcd();
D0=bit_test(dado,0);
D1=bit_test(dado,1);
D2=bit_test(dado,2);
D3=bit_test(dado,3);
fixa_display_lcd();
delay_us(40);
E=0;
}
void limpa_display_lcd(void)
{
RS=0;
envia_byte_display_lcd(0x01);
delay_ms(2);
RS=1;
}
void inicializa_display_lcd(void)
{
D0=D1=D2=D3=0;
E=0;
delay_ms(15);
RS=0;
envia_byte_display_lcd(0x03);
delay_ms(5);
envia_byte_display_lcd(0x03);
delay_ms(5);
envia_byte_display_lcd(0x03);
delay_ms(5);
envia_byte_display_lcd(0x02);
delay_ms(1);
envia_byte_display_lcd(0x28);
envia_byte_display_lcd(0x0C);
limpa_display_lcd();
envia_byte_display_lcd(0x06);
RS=1;
}
void fixa_display_lcd(void)
{
E=1;
delay_us(1);
E=0;
}
void escreve_digitos_display_lcd(unsigned int8 valor,unsigned int8 endereco)
{
RS=0;
envia_byte_display_lcd(endereco);
RS=1;
envia_byte_display_lcd(valor+0x30);
}
void escreve_texto_display_lcd(char texto[],unsigned int8 posicao_inicial)
{
int i=0;
while(texto[i]!=0)
{
RS=0;
envia_byte_display_lcd(posicao_inicial+i);
RS=1;
envia_byte_display_lcd(texto[i]);
i++;
}
}
void pwm_variavel(unsigned int16 valor_CCPR1L)
{
T2CKPS1=0; //preescaler de 1:4...
T2CKPS0=1; //preescaler de 1:4...
TOUTPS3=0; //postscaler de 1:1...
TOUTPS2=0; //postscaler de 1:1...
TOUTPS1=0; //postscaler de 1:1...
TOUTPS0=0; //postscaler de 1:1...
PR2=249; //para frequencia de 1kHz...
TMR2ON=1; //liga TMR2...
CCPR1L=valor_CCPR1L; //largura do pulso do PWM (parte alta, bits 9:2)...
CCP1X=0; //carrega bit 1 duty cicle...
CCP1Y=0; //carrega bit 0 duty cicle...
CCP1M3=1; //ativa saída de PWM em RC2...
CCP1M2=1; //ativa saída de PWM em RC2...
}
char teclado(void)
{
unsigned int16 tecla;
RC3=RC4=RC5=RC6=RC7=RD0=RD1=0; //determina nível lógico alto em todos os pinos da porta PO
tecla='Z'; //define a variável tecla como Z, para criar um looping até uma tecla ser clicada
while(tecla=='Z') //looping até que seja precionada uma tecla, que nunca será a letra Z
{
//varredura da primeira coluna (1,4,7,*)
RC3=1; //inicia varredura na 1 coluna
if(RC6==1) {tecla=1; delay_ms(200);} //foi clicado tecla 1
if(RC7==1) {tecla=4; delay_ms(200);} //foi clicado tecla 4
if(RD0==1) {tecla=7; delay_ms(200);} //foi clicado tecla 7
if(RD1==1) {tecla=10; delay_ms(200);} //foi clicado tecla *
RC3=0; //desabilita varredura na 1 coluna
//fim da varredura da primeira coluna
//varedura da segunda coluna (2,5,8,0)
RC4=1; //inicia varredura na 2 coluna
if(RC6==1) {tecla=2; delay_ms(200);} //foi clicado tecla 2
if(RC7==1) {tecla=5; delay_ms(200);} //foi clicado tecla 5
if(RD0==1) {tecla=8; delay_ms(200);} //foi clicado tecla 8
if(RD1==1) {tecla=0; delay_ms(200);} //foi clicado tecla 0
RC4=0; //desabilita varredura na 2 coluna
//fim da varredura da segunda coluna
//varredura da terceira coluna (3,6,9,#)
RC5=1; //inicia varredura na 3 coluna
if(RC6==1) {tecla=3; delay_ms(200);} //foi clicado tecla 3
if(RC7==1) {tecla=6; delay_ms(200);} //foi clicado tecla 6
if(RD0==1) {tecla=9; delay_ms(200);} //foi clicado tecla 9
RC6=0; //desabilita varredura na 3 coluna
//fim da varredura da terceira coluna
}
return(tecla); //retorna a tecla clicada na variável 'tecla'
}