Alguem me ajuda. Please !!!!

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Alguem me ajuda. Please !!!!

Mensagempor gilliard » 01 Set 2008 09:23

:D Falae Pessoal, tudo bem ?!?!? :D

Pessoal, preciso da ajuda de vocês, pois faço faculdade federal, e não posso ser reprovado, senão, perderei minha bolsa, e não tenho condições de pagar uma faculdade, já rodei a internet inteira, e ninguem me ajuda, só preciso terminar meu projeto para mostrar para o professor, me ajudem amigos !!!! Alguma alma caridosa me ajude, já estou desesperado. Vocês são cheios de experiências em programação para PIC, me ajudem para eu não perder a faculdade.

Eu preciso terminar meu programa em linguagem C para microcontrolador 18F4520, estou desenvolvendo um projeto, com base no compilador MikroC.

Estou desenvolvendo um sistema de fechadura eletrônica, para mostrar na faculdade, pois é um projeto de dificil implementação, por isso que o professor pediu.

Minha duvida é:

Eu criei um sistema de varredura de teclado matriz, onde as teclas digitadas, são exibidas em um LCD 16x2, modo 8 bits, estou utilizando um PIC 18F4520.

O professor pediu para implementar nesse codigo que eu criei, um sistema de senha, onde o o sistema já possua uma senha de fábrica padrão, e atravez da tecla de * ( asterisco ), o usuário entra no modo gravação, onde ele pode mudar a senha de fabrica.

Alguém me ajuda, a aprender a fazer isso ?!?!?

Segue o programinha que criei até agora.

Código: Selecionar todos
//********** Inicio da configuração do LCD 16x2 **********//
void inicializa_lcd(void){
   Lcd8_Config(&PORTE,&PORTD,2,1,0,7,6,5,4,3,2,1,0); // Configura portas //
   Lcd8_Cmd(Lcd_Clear); // Limpa o LCD 16x2 //
   Lcd8_Cmd(LCD_BLINK_CURSOR_ON); // Apaga o cursor do LCD 16x2 //
   delay_ms (100); // Da um delay de 100 milisegundos //
}
//********** Fim da configuração do LCD 16x2 **********//

//********** Inicio da rotina do LCD 16x2 **********//
void lcd(char var1[5] , char avanca){

   trisd= 0;              //configura portd como saida

   if (avanca==0){ // Se for igual a zero, escreve na casa seguinte

       Lcd8_cmd(Lcd_Clear);
       Lcd8_out(1,1,"SENHA:");
       Lcd8_out_cp(var1);
       }

   if (avanca==1) { // Se for igual a 1 escreve o caractere no LCD

      Lcd8_out_cp(var1);
      trisd= 255;            //configura portd como entrada
      }
      }

//********** Fim da rotina do LCD 16x2 **********//

//********** Inicio da configuração principal **********//
void main() {
   adcon1= 0x06;          //define pinos AD como I/O de uso geral
   trisd= 255;            //configura portd como entrada
   trisa= 0;              //configura porta como saida
   inicializa_lcd(void);  //chama subrotina de inicialização do lcd
   lcd(" ",0);
   trisb= 0;              //configura portb como saida
   trisd= 255;            //configura portd como entrada
   portb= 255;            //portb em FF
   portd= 255;            //portd em FF
   do {
      portb.f0= 0;        //habilita primeira coluna  do teclado
      if (portD.f0 == 0)
         lcd("10",1);
      else if (portD.f1 == 0)
         lcd("7",1);
      else if (portD.f2 == 0)
         lcd("4",1);
      else if (portD.f3 == 0)
         lcd("1",1);

      portb.f0= 1;        //desabilita primeira coluna do teclado
      portb.f1= 0;        //habilita segunda coluna do teclado
      if (portD.f0 == 0)
         lcd("11",1);
      else if (portD.f1 == 0)
         lcd("8",1);
      else if (portD.f2 == 0)
         lcd("5",1);
      else if (portD.f3 == 0)
         lcd("2",1);

      portb.f1= 1;        //desabilita segunda coluna do teclado
      portb.f2= 0;        //habilita terceira coluna do teclado
      if (portD.f0 == 0)
         lcd("12",1);
      else if (portD.f1 == 0)
         lcd("9",1);
      else if (portD.f2 == 0)
         lcd("6",1);
      else if (portD.f3 == 0)
         lcd("3",1);

      portb.f2= 1;        //desabilita terceira coluna do teclado
      delay_ms(100);
   }  while(1);
}

//********** Fim da configuração principal **********//


Desde já, muito obrigado galera, conto com a ajuda de vocês.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor joao » 01 Set 2008 10:36

Pode me explicar o que essa linha faz?

Código: Selecionar todos
      if (portD.f0 == 0)
         lcd("10",1);


Ela foi retirada do seu código. O que "10" representa?

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor joao » 01 Set 2008 11:06

De qualquer maneira, vou te ajudar um pouco, já que nao sou um ótimo programador em mikroC

Veja esta parte do código:
Código: Selecionar todos
      else if (portD.f1 == 0)
         lcd("7",1);


O que ele faz?
Manda imprimir a palavra 7 no LCD.
Certo?

Então, como é uma senha, vc tem que imprimir um * na senha e nao a senha!
logo,
Código: Selecionar todos
      else if (portD.f1 == 0)
         lcd("*",1);  //Tá vendo que to mandando imprimir o *?


Mas pera lá!
E o que eu faço agora que eu perdi o valor?!?!?!?!?
Vc salva em um CHAR!

Cria um char com o tamanho da sua senha no começo do main:

Código: Selecionar todos
char senha[6] = ""; // a senha vai ter 6 caracteres e inicializa com nada!
int numtecla=0; //Para saber quantas teclas ele apertou


Agora, voltando o código que imprime o *:
Código: Selecionar todos
      else if (portD.f1 == 0)
      {
           senha[numtecla++]= '7';
           lcd("*",1);  //Tá vendo que to mandando imprimir o *?
      }


agora, no final do loop vc pode fazer a validacao deste tipo:
Código: Selecionar todos
if (numtecla == 6)
{
     if( //valida a senha)
           //senha correta!
           //mostra no LCD!!! E sai do loop ou faz qq coisa!
     else
          // Limpa LCD e zera a variavel senha e numtecla novamente!
}



Nãodá para passar tudo pronto né! vc só precisa dar uma boa lida no que o pessoal vai escrever, TENTAR IMPLEMENTAR, e dai pedir mais ajuda!

Que o pessoal responde!

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor gilliard » 01 Set 2008 15:14

:D Opa !!!! To muito feliz pelas dicas !!!! :D

João: Obrigado pela força, e responde sua pergunta, eu moifiquei as teclas com os numeros 10, 11 e 12. Por *, 0 e # !!!!

E referente a validar a senha, na parte

Código: Selecionar todos
 if( //valida a senha)


é justamente a parte que não sei fazer rrssss.

Dede já, muito obrigado a todos !!!!
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor joao » 02 Set 2008 05:07

O problema que eu sei C e não mikroC. Mas parece que isso que eu vou passar aqui é possivel. Tem que testar.

Em C, vc teria uma variavel do tipo:

Código: Selecionar todos
char *senhacorreta = "123456"; //Criando a senha, pode ser no começo do main.


e dai lá na parte de baixo:
Código: Selecionar todos
if (numtecla == 6)
{
     if( !strcmp(&senha, senhacorreta) ) //valida a senha
     {
           //senha correta!
           //mostra no LCD!!! E sai do loop ou faz qq coisa!
     }
     else
     {
          // senha incorreta
          // Limpa LCD e zera a variavel senha e numtecla novamente!
      }
}


Acho que agora ficou fácil heim!
Tenta ai e mande as suas perguntas agora de maneira mais cada vez mais especifica e com o seu código. Ok?
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor gilliard » 02 Set 2008 15:47

:D Quero agradecer a todos os colegas, que estão me ajudando, e a todos que leram esse tópico, mas não conseguiram me ajudar !!!!

Meu amigo João.

Segue o novo código, com as modificações que o senhor me recomendou, mas agora esta pedindo, para eu definir PONTEIROS,
nos trechos das teclas com asterisco.

:arrow:
Código: Selecionar todos
 senha[numtecla++]='0';


Li sua explicação sobre ponteiros, em um tópico neste forum, mas não entendi o funcionamento e aonde declarar, pois estou aprendendo ainda !!!! Aliás João, parabens pela sua forma de explicar, muito bem detalhada, parabens !!!! João porfavor me ajude a definir os ponterios em meu codigo, e veja se declarei as variaveis e funções, e todo o codigo esta bem comentado, conforme recomendado.

Código: Selecionar todos
char senhacorreta = 12345;  // Criando a senha, pode ser no começo do main
char senha;
char numtecla;

//********** Inicio da configuração do LCD 16x2 **********//
void inicializa_lcd(void){
   Lcd8_Config(&PORTE,&PORTD,2,1,0,7,6,5,4,3,2,1,0); // Configura portas //
   Lcd8_Cmd(Lcd_Clear); // Limpa o LCD 16x2 //
   Lcd8_Cmd(LCD_BLINK_CURSOR_ON); // Apaga o cursor do LCD 16x2 //
   delay_ms (100); // Da um delay de 100 milisegundos //
}
//********** Fim da configuração do LCD 16x2 **********//

//********** Inicio da rotina do LCD 16x2 **********//
void lcd(char var1[5] , char avanca){

   trisd= 0;              //configura portd como saida

   if (avanca==0){

       Lcd8_cmd(Lcd_Clear);       // limpa display LCD 16x2
       Lcd8_out(1,1,"SENHA:");    // exibe a palavra SENHA
       Lcd8_out_cp(var1);         // mostrar o resultado da var1 no LCD 16x2
       }

   if (avanca==1) {

      Lcd8_out_cp(var1);
      trisd= 255;            //configura portd como entrada
      }
      }

//********** Fim da rotina do LCD 16x2 **********//

//********** Inicio da configuração principal **********//
void main() {
   adcon1= 0x06;          //define pinos AD como I/O de uso geral
   trisa= 0;              //configura porta como saida
   trisb= 0;              //configura portb como saida
   trisc.rc1 = 0;         //configura PORTC, pino RC 1 como saida
   trisd= 255;            //configura portd como entrada
   inicializa_lcd(void);  //chama subrotina de inicialização do lcd
   lcd(" ",0);
   trisb= 0;              //configura portb como saida
   trisd= 255;            //configura portd como entrada
   portb= 255;            //portb em FF
   portd= 255;            //portd em FF
   do {

//********** Inicio da primeira coluna **********//

      portb.f0= 0;        //habilita primeira coluna  do teclado
      if (portD.f0 == 0)
          lcd("*",1);      //exibe no LCD o caractere *
      else if (portD.f1 == 0)
      {
       senha[numtecla++]='7'; //exibe no LCD o caractere 7
          lcd("*",1);
      }
      else if (portD.f2 == 0)
      {
       senha[numtecla++]='4'; //exibe no LCD o caractere 4
          lcd("*",1);
      }
      else if (portD.f3 == 0)
      {
       senha[numtecla++]='1'; //exibe no LCD o caractere 1
          lcd("*",1);
      }

      portb.f0= 1;        //desabilita primeira coluna do teclado

//********** Fim da primeira coluna **********//

//********** Inicio da segunda coluna **********//

      portb.f1= 0;        //habilita segunda coluna do teclado
      if (portD.f0 == 0)
      {
       senha[numtecla++]='0'; //exibe no LCD o caractere 0
          lcd("*",1);
      }
      else if (portD.f1 == 0)
      {
       senha[numtecla++]='8'; //exibe no LCD o caractere 8
          lcd("*",1);
      }
      else if (portD.f2 == 0)
      {
       senha[numtecla++]='5'; //exibe no LCD o caractere 5
          lcd("*",1);
      }
      else if (portD.f3 == 0)
      {
       senha[numtecla++]='2'; //exibe no LCD o caractere 2
          lcd("*",1);
      }

      portb.f1= 1;        //desabilita segunda coluna do teclado

//********** Fim da segunda coluna **********//

//********** Inicio da tericeira coluna **********//

      portb.f2= 0;        //habilita terceira coluna do teclado
      if (portD.f0 == 0)
      {
       senha[numtecla++]='#'; //exibe no LCD o caractere #
          lcd("*",1);
      }
      else if (portD.f1 == 0)
      {
       senha[numtecla++]='9'; //exibe no LCD o caractere 9
          lcd("*",1);
      }
      else if (portD.f2 == 0)
      {
       senha[numtecla++]='6'; //exibe no LCD o caractere 6
          lcd("*",1);
      }
      else if (portD.f3 == 0)
      {
       senha[numtecla++]='3'; //exibe no LCD o caractere 3
          lcd("*",1);
      }

      portb.f2= 1;        //desabilita terceira coluna do teclado

//********** Fim da terceira coluna **********//

      delay_ms(100);      //executa um delay de 100 milisegundos

//********** Inicio da Validação da senha ( Verdadeiro ou Falso )**********//

if (numtecla == 6){
   if(!strcmp(&senha == &senhacorreta){ // Se &senha igual a &senhacorreta
   lcd8_out(1,1,"SENHA CORRETA !!!!"); // Exibe no " LCD SENHA CORRETA "
   portc.rc1 =~ portc.rc1; // Fica tocando o buzzer que esta no PORTC pino RC1
   }
   else
   if(!strcmp(&senha != &senhacorreta){ // Se &senha diferente de &senhacorreta
   lcd8_out(1,1,"SENHA INCORRETA !!!!");// Exibe no " LCD SENHA INCORRETA "
   portb.rb0 =~ portb.rb0; // Fica piscando um led que esta no PORTB no pino RB 0
   }

//********** Fim da Validação da senha ( Verdadeiro ou Falso ) **********//

   }
   }  while(1);           //loop infinito

}

//********** Fim da configuração principal **********//


:D Agradeço a todos, pois estou aprendendo muito com todos vocês. :D
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor joao » 03 Set 2008 08:19

Caro Giliard,

Vc não sabe nada de ponteiros?
Nadica de nada?
Dai fica dificil explicar heim...

Se eu fizer isso:

Código: Selecionar todos
char ponteiro;

ele está guardando apenas 1 posicao na memoria, certo?

Mas eu preciso mais do que uma posicao na memoria. Por exemplo, eu preciso de 6.
Código: Selecionar todos
char ponteiro[6];

O que está contecendo aqui que agora eu reservei 6 espaços, logo posso guardar mais do que apenas um caracter.

Por isso que no codigo que vc postou esta errado.
Mude de:
Código: Selecionar todos
char senhacorreta = 12345;  // Criando a senha, pode ser no começo do main
char senha;


para
Código: Selecionar todos
char senhacorreta[] = "12345";  // Criando a senha, pode ser no começo do main
char senha[6];

Apenas explicando que a senhacorreta vc sabe que eh 123456 como uma string. Entao por isso que vc cria como " " e nao com ' '. A gente só usa ' 'se for para apenas 1 caracter. Para um conjunto de caracter é " ".
E em senha vc apenas está falando que precisa de 6 espaços para a senha.
Logo vc acessa ela como:
senha[0]
senha[1]
senha[2]
senha[3]
senha[4]
senha[5]

Por isso que estava dando erro, porque vc nao declarou que vc queria 6 posicoes. Declarou que vc queria apenas um char de 1 posicao.

outra coisa:
Código: Selecionar todos
if (numtecla == 6){
   if(!strcmp(&senha == &senhacorreta){ // Se &senha igual a &senhacorreta
   lcd8_out(1,1,"SENHA CORRETA !!!!"); // Exibe no " LCD SENHA CORRETA "
   portc.rc1 =~ portc.rc1; // Fica tocando o buzzer que esta no PORTC pino RC1
   }
   else
   if(!strcmp(&senha != &senhacorreta){ // Se &senha diferente de &senhacorreta
   lcd8_out(1,1,"SENHA INCORRETA !!!!");// Exibe no " LCD SENHA INCORRETA "
   portb.rb0 =~ portb.rb0; // Fica piscando um led que esta no PORTB no pino RB 0
   }


Pense no que um if faz e no que um else faz. if é usado para fazer uma verificacao, certo? logo, strcmp está comparando 2 strings e retorna 0 se a mesmas sao identicas. senao ele retorna outro valor. Veja no manual do mikroC. Mas 0 em C é false. E vc quer que ele entre neste if. Certo? entao vc nega o resultado com a exclamacao ! . Dessa maneira vc está querendo entrar no if caso a variavel seja verdadeira.

Se vc tiver tendo errors no strcmp, tente verificar o simbolo & deles, talvez nao seja necessário.

Agora eu faço uma pergunta para vc:
Porque vc está fazendo o else if no codigo acima? Me explique o que um else faz, o que um else if faz e o que aconteceria se tivesse um else apenas ao inves de um else if.
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor gilliard » 03 Set 2008 14:35

:D Primeiramente, obrigado mais uma vez pela excelente atenção, e perfeita explicação, é muuuito boa sua explicação, clara para leigos, e objetiva, o senhor é um excelente professor :D

Então: Respondendo a pergunta do senhor.

Na Linguagem C, existe estruturas de controle, que podemos utilizar caso queremos que a maquina efetue repetidas operações ou tome decisões.

O comando IF que no português significa ( SE ), se usarmos somente IF, você esta pedindo ao microcontrolador que se ISSO for verdadeiro ou falso, faça SOMENTE ISSO, não oferecendo ao microcontrolador opções de decisões.

Exemplo:

Se o porto B tiver nivel lógico 0, inverte a sequencia dos leds, fazendo eles piscarem.

Código: Selecionar todos
void main (){
trisb = 1; // Define portb como saida
if (trisb=0)
(trisb =~ trisb);
}


No caso os comandos IF ELSE, oferecemos ao microcontrolador, opções de decisões, se ISSO for verdadeiro, faça ISSO. se ISSO for falso, faça ISSO !!!!

Espero estar certo.

Vou fazer aqui as modificações, e posto de novo para ver os erros.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor joao » 03 Set 2008 19:34

Vc só esqueceu de me explicar o seu código:
Código: Selecionar todos
if (numtecla == 6){
   if(!strcmp(&senha == &senhacorreta){ // Se &senha igual a &senhacorreta
   lcd8_out(1,1,"SENHA CORRETA !!!!"); // Exibe no " LCD SENHA CORRETA "
   portc.rc1 =~ portc.rc1; // Fica tocando o buzzer que esta no PORTC pino RC1
   }
   else
   if(!strcmp(&senha != &senhacorreta){ // Se &senha diferente de &senhacorreta
   lcd8_out(1,1,"SENHA INCORRETA !!!!");// Exibe no " LCD SENHA INCORRETA "
   portb.rb0 =~ portb.rb0; // Fica piscando um led que esta no PORTB no pino RB 0
   }


1 - O que o else if está fazendo neste caso?
2 - O que acontece se vc trocar o else if para apenas um simples else?
3 - Sabe a diferença entre o else if e else? Veja o que vc escreveu que vc vai entender o porque estou te perguntando tanto sobre o else e o else if. Veja bem essa parte do codigo:
Código: Selecionar todos
 else
   if(!strcmp(&senha != &senhacorreta){ // Se &senha diferente de


Vai fazendo o código ai e tentando aprender com ele...
De nada adianta vc passar se nao entender o que funciona...
Acredite...
Se nao aprender agora, só vai acabar piorando no futuro...

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor gilliard » 03 Set 2008 20:16

:D Falae João, tudo bem ?!?!? :D Estou aprendendo muito com o senhor, ter alguem com paciência, para dar essas explicações passo a passo, é muito importante, para pessoas que estejam aprendendo, que nem eu estou !!!!

Então, eu entendi o porque da sua pergunta sobre IF e ELSE. Notei que tinha um IF a mais no meu codigo !!!!

João, eu fiz algumas mudanças no meu codigo, e ele compilou direitinho, e gravei no kit de desenvolvimento para testar, mas eu digito a senha certa, mas não acontece nada !!!! Falta algo ainda ?!?!?

Éu estava pensando, acho que esta faltando acrescentar um comando, que define uma tecla, para avisar o microcontrolador, quando eu já estiver inserido minha senha !!!! Pois acho que o microcontrolador não consegue comparar, enquanto eu digito, né !!!!

Segue meu código modificado !!!!

Código: Selecionar todos
char senhacorreta[] = "12345";  // Criando a senha, pode ser no começo do main
char senha[6];
char numtecla;

//********** Inicio da configuração do LCD 16x2 **********//
void inicializa_lcd(void){
   Lcd8_Config(&PORTE,&PORTD,2,1,0,7,6,5,4,3,2,1,0); // Configura portas //
   Lcd8_Cmd(Lcd_Clear); // Limpa o LCD 16x2 //
   Lcd8_Cmd(LCD_BLINK_CURSOR_ON); // Apaga o cursor do LCD 16x2 //
   delay_ms (100); // Da um delay de 100 milisegundos //
}
//********** Fim da configuração do LCD 16x2 **********//

//********** Inicio da rotina do LCD 16x2 **********//
void lcd(char var1[5] , char avanca){

   trisd= 0;              //configura portd como saida

   if (avanca==0){

       Lcd8_cmd(Lcd_Clear);       // limpa display LCD 16x2
       Lcd8_out(1,1,"SENHA:");    // exibe a palavra SENHA
       Lcd8_out_cp(var1);         // mostrar o resultado da var1 no LCD 16x2
       }

   if (avanca==1) {

      Lcd8_out_cp(var1);
      trisd= 255;            //configura portd como entrada
      }
      }

//********** Fim da rotina do LCD 16x2 **********//

//********** Inicio da configuração principal **********//
void main() {
   adcon1= 0x06;          //define pinos AD como I/O de uso geral
   trisa= 0;              //configura porta como saida
   trisb= 0;              //configura portb como saida
   trisc.rc1 = 0;         //configura PORTC, pino RC 1 como saida
   trisd= 255;            //configura portd como entrada
   inicializa_lcd(void);  //chama subrotina de inicialização do lcd
   lcd(" ",0);
   trisb= 0;              //configura portb como saida
   trisd= 255;            //configura portd como entrada
   portb= 255;            //portb em FF
   portd= 255;            //portd em FF
   do {

//********** Inicio da primeira coluna **********//

      portb.f0= 0;        //habilita primeira coluna  do teclado
      if (portD.f0 == 0)
          lcd("*",1);      //exibe no LCD o caractere *
      else if (portD.f1 == 0)
      {
       senha[numtecla++]='7'; //exibe no LCD o caractere 7
          lcd("*",1);
      }
      else if (portD.f2 == 0)
      {
       senha[numtecla++]='4'; //exibe no LCD o caractere 4
          lcd("*",1);
      }
      else if (portD.f3 == 0)
      {
       senha[numtecla++]='1'; //exibe no LCD o caractere 1
          lcd("*",1);
      }

      portb.f0= 1;        //desabilita primeira coluna do teclado

//********** Fim da primeira coluna **********//

//********** Inicio da segunda coluna **********//

      portb.f1= 0;        //habilita segunda coluna do teclado
      if (portD.f0 == 0)
      {
       senha[numtecla++]='0'; //exibe no LCD o caractere 0
          lcd("*",1);
      }
      else if (portD.f1 == 0)
      {
       senha[numtecla++]='8'; //exibe no LCD o caractere 8
          lcd("*",1);
      }
      else if (portD.f2 == 0)
      {
       senha[numtecla++]='5'; //exibe no LCD o caractere 5
          lcd("*",1);
      }
      else if (portD.f3 == 0)
      {
       senha[numtecla++]='2'; //exibe no LCD o caractere 2
          lcd("*",1);
      }

      portb.f1= 1;        //desabilita segunda coluna do teclado

//********** Fim da segunda coluna **********//

//********** Inicio da tericeira coluna **********//

      portb.f2= 0;        //habilita terceira coluna do teclado
      if (portD.f0 == 0)
      {
       senha[numtecla++]='#'; //exibe no LCD o caractere #
          lcd("*",1);
      }
      else if (portD.f1 == 0)
      {
       senha[numtecla++]='9'; //exibe no LCD o caractere 9
          lcd("*",1);
      }
      else if (portD.f2 == 0)
      {
       senha[numtecla++]='6'; //exibe no LCD o caractere 6
          lcd("*",1);
      }
      else if (portD.f3 == 0)
      {
       senha[numtecla++]='3'; //exibe no LCD o caractere 3
          lcd("*",1);
      }

      portb.f2= 1;        //desabilita terceira coluna do teclado

//********** Fim da terceira coluna **********//

      delay_ms(300);      //executa um delay de 100 milisegundos

//********** Inicio da Validação da senha ( Verdadeiro ou Falso )**********//

if (numtecla == 6){
   if(!strcmp(senha, senhacorreta)){ // Se &senha igual a &senhacorreta
   lcd8_out(1,1,"SENHA CORRETA !!!!");// Exibe no " LCD SENHA CORRETA "
   delay_ms(100);
   }
   else
   lcd8_out(1,1,"SENHA INCORRETA !!!!");// Exibe no " LCD SENHA INCORRETA "
   delay_ms(100);
   }

//********** Fim da Validação da senha ( Verdadeiro ou Falso ) **********//
   }

   while(1);           //loop infinito
}

//********** Fim da configuração principal **********//


:D Onrigado pela sua atenção, Professor Jóao !!!! :D
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Djalma Toledo Rodrigues » 03 Set 2008 22:12

Então esta faltando a tecla <Enter> e a <Corrige> também. rsrsrs

Se todas as Senhas tiverem igual número de caractéres, <Enter> é dispensável não é ?

Abraço e boa senha.
.
----------------------------------------------------------------------
Falar em Senha, parece que programador não tem mãe
Agente vai ao caixa eletrônico introduz cartão , retira cartão, digita senha, digita código de segurança, aí o terminal taska a decisão:
" Terminal temporariamente indisponível" . PQP!
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Djalma Toledo Rodrigues » 03 Set 2008 22:52

lcd8_out(1,1,"SENHA INCORRETA !!!!");// Exibe no " LCD SENHA INCORRETA "


Quando a instrução for clara, intelegível, não há necessidade de comentário, veja aí que ficou redundante

Abraço e bom comentário
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor joao » 04 Set 2008 06:14

Então, se sempre for o mesmo tamanho a senha, vc pode usar o que está, porque existe um contador de numero de teclas pressionadas.

char senhacorreta[] = "12345"; // Criando a senha, pode ser no começo do main
char senha[6];
char numtecla;

acho que ao invéz de numtecla, deveria mudar o nome dele para contatecla, ou seja, ele vai contar a quantidade de teclas pressionadas.
O problema eh que vc nao inicializou ela e tambem vc criou ela como char, mas na verdade é um inteiro, porque ela serve para contar a quantidade de teclas.
Por isso que ela deve comecar em 0.
logo
Código: Selecionar todos
char numtecla;

muda para:
Código: Selecionar todos
int numtecla = 0;


entendeu até ai?

Por isso que para cada uma das teclas que a pessoa pressionou vc está fazendo isso:
Código: Selecionar todos
       senha[numtecla++]='7'; //exibe no LCD o caractere 7


porque dai ele vai fazer os seguinte:
numtecla vale 0 na primeira vez.
entao ele vai guardar em senha[0] = '7'
mas ele está fazendo um numtecla++. Entao, assim que ele fizer o comando acima, ele incrementa numtecla em +1. O que faz com que ela vá para 1.
Logo, na segunda tecla pressionada, teremos o que?
teremos o mesmo comando sendo executado:
Código: Selecionar todos
       senha[numtecla++]='3'; //exibe no LCD o caractere 7

Mas agora numtecla é 1. Logo teremos senha[1] = '3' e depois deste comando, incrementamos numtecla em +1, o que faz ela valer 2.
Entao, temos:
Código: Selecionar todos
       senha[0]='7';
       senha[1]='3';
 


entendeu a idéia de como funciona?

Por isso que vc está fazendo o
Código: Selecionar todos
if (numtecla == 6){


Porque se if é 6, quer dizer que vc realmente tem 6 numeros digitados.

Acho que resolvendo o problema da criacao da variavel numtecla vc vai conseguir rodar.


E agora mais uma pergunta.
Como dá para fazer para comparar a senha sempre que a pessoa pressionada o #? Entendeu? Ao invez de verificar se a pessoa digitou 6 digitos, como que faz para ele verificar quando a pessoa precionar o #? Se vc conseguir entender isso, vai ver que nao precisamos mais ter uma senha com numero de digitos fixos, como por exemplo em 6.

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor joao » 04 Set 2008 06:20

outra coisa...
Olha tambem os seus comentarios...
Olhe isso de exemplo:
Código: Selecionar todos
senha[numtecla++]='3'; //exibe no LCD o caractere 7


Voce está realmente exibindo no LCD com este comando?

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor gilliard » 04 Set 2008 08:54

:D Falae Professor João, e Djalma, tudo bem com vocês ?!?!? :D

Djalma: Valew pela força amigo, e referente a meus comentários, é que eu comentei, até comandos simples, porque tem colegas que estão aprendendo linguagem C, para microcontrolador, e eles não sabem ainda o basico, por estarem aprendendo, então eles olham os comentários, e entendem a lógica do programa, entendeu amigo ?!?!?

Professor João: Mais uma vez, fiquei impressionado com sua facilidade em explicar conceitos de programação, não são muitos dos foruns, que conseguem explicar com tanta clareza. Muito obrigado pela força que vem me dando.

Professor João: Eu arrumei a parte do CHAR para INT, mas não funcionou ainda, tentei até colocar 6 numeros na minha senha, e tambem não funcionou, não sei oque pode estar acontecendo!!!! Será que não são parenteses ou chaves, ou algum comando que esteja faltando ou errado ?!?!?

Valew amigos, e um otimo dia a todos !!!!
Editado pela última vez por gilliard em 04 Set 2008 10:00, em um total de 2 vezes.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x