Ir ao conteúdo
  • Cadastre-se
santos.matheus

Chamada de função PIC linguagem C

Recommended Posts

Boa tarde pessoal, alguém poderia me dizer como faço para "chamar" uma função na programação de microcontroladores utilizando linguagem C e o compilador CCS. Bom, eu desenvolvi um programa para verificação de senha através de um display LCD e um teclado matricial, contudo utilizo várias vezes a lógica para ler as teclas digitadas. Queria criar uma função para a leitura dessas teclas de modo que posso simplesmente chamá-la durante o desenrolar do programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo:

#include <18F4550.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Crystal osc > 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=8000000) //meu clock

[COLOR="Red"][B]void inicia_pic(void)
{[/B][/COLOR]
SETUP_TIMER_1 (T1_INTERNAL|T1_DIV_BY_8);
SETUP_TIMER_2 (T2_DIV_BY_1,200,1);
setup_ccp1 (CCP_CAPTURE_RE);
setup_ccp2 (CCP_CAPTURE_RE);
enable_interrupts (INT_CCP1);
enable_interrupts (INT_CCP2);
enable_interrupts(INT_EXT);
ext_int_edge(1,H_TO_L);
enable_interrupts(INT_EXT1);
ext_int_edge(1,H_TO_L);
enable_interrupts (INT_TIMER1); //Habilitar Interrupções
enable_interrupts (INT_TIMER2); //Habilitar Interrupções
enable_interrupts (global);
set_timer1(3036); //Preload do timer1 64286 1ms @20Mhz e pres = 4
[COLOR="Red"][B]}[/B][/COLOR]

/*==============================
Rotina Principal:
================================*/

void main()
{
[COLOR="Red"][B]inicia_pic();[/B][/COLOR]

while (TRUE)
{
ALGUMA COISA AQUI!
}
}

Falou

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro MatheusLPS,

Muitíssimo obrigado por sua ajuda, abaixo irei postar o código com comentários do que eu pretendo fazer para que talvez você possa me auxiliar. Desde já muito obrigado.


#include <16f877a.h>
#use delay(clock=4000000)
#fuses XT

#include <lcd.c>

int digitar_senha(int i,int botao,int condicao,int confirma,int digito[],int senha_padrao[],int teste)
//função para o usuário digitar a senha
//é um avarredura usada em tres portas do pic para analisar qual botao foi digitado
//noo caso para uma senha de 4 digitos
{
teste=0;
for(i=0; i<4; i++)
{
while (condicao==0)
{output_high(pin_e1);
delay_ms(50);
if(input(pin_a3)){botao=1;condicao=1;}
if(input(pin_a4)){botao=2;condicao=1;}
if(input(pin_a5)){botao=3;condicao=1;}
output_low(pin_e1);

output_high(pin_e0);
delay_ms(50);
if(input(pin_a3)){botao=4;condicao=1;}
if(input(pin_a4)){botao=5;condicao=1;}
if(input(pin_a5)){botao=6;condicao=1;}
output_low(pin_e0);

output_high(pin_a0);
delay_ms(50);
if(input(pin_a3)){botao=7;condicao=1;}
if(input(pin_a4)){botao=8;condicao=1;}
if(input(pin_a5)){botao=9;condicao=1;}
output_low(pin_a0);
}
digito[i]=botao;
condicao=0;
delay_ms(200);
}
while(confirma==0)
//enquanto nao aperto o botao do pino e7 para confirmar a senha digitada fica em um loop infinito aguardando a confirmação
{if(input(pin_b7)) {confirma=1;}}
confirma=0;

for(i=0; i<4; i++)
{
if(digito[i]==senha_padrao[i])
//Agora analisa-se se os botões digitados foram iguais a senha padrão
//Para cada digito correto incrementa-se a variavel TESTE
//E se ela for igual a 4 a senha está correta
{teste++;}
digito[i]=0;
}
return teste;
//O valor da variável teste é necessário para continuação da função principal
}


void main (void)
{

while(true)
{
int teste;
//Tela de boas-vindas do programa
lcd_init();
printf(lcd_putc,"\t BEM-VINDO");
delay_ms(100);

//Logica para digitar uma senha
if(input(pin_e2))
{lcd_init();
printf(lcd_putc," DIGITE A SENHA");
delay_ms(100);}

//como faço para entrar na função "digitar_senha"?

if(teste==4)
{
//Senha correta
}

if(teste!=4)
{
//Senha inválida
}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Continua com dúvidas?

Você postou o código mas não informou mais nada.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe não ter informado nada. O problema é que se você perceber dentro da função digitar_senha existe uma série de procedimentos como estruturas while, for, if ...

o que acontece é que quando chamo essa função no programa principal parece que não executa nada, que o programa não entra na estrutura while e muito menos retorna o valor desejado da variável "teste".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente usar o Proteus para debugar seu programa.

Veja esse video no tempo indicado(7:50)

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×