Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

19/12/2010 #1

Avatar de felicris

programa en css clave en display lcd
contertulios del foro

primero que todo felicitarlos por el foro esta muy bueno.

el tema es el siguiente mi profesor de robótica no pidió realizar un circuito con el pic 16f877A + lcd 2x16 + 2 señales análogas visualizadas en el lcd.

el programa que utilizo es el CSS version 4.084 y el MPLAB version 8.6 + PROTEUS 7.2
se necesita digitar una clave de 4 caracteres (uso de la lib KBD.C) y mostrar en el display con asteriscos, validar la clave digitada con 3 oportunidades de ingreso a la cuarta se bloquea.
como base se tiene el programa que visualiza los datos pulsador


Código:
#include <16F877A.h>
#use delay(clock=4000000)
#include <lcd.c>

#define use_portb_kbd TRUE
#include <kbd.c>

char e;

main(){

port_b_pullups(1);

lcd_init();

printf(lcd_putc,"Bienvenido");

delay_ms(1000);

printf(lcd_putc,"ingrese clave");
delay_ms(1000);
lcd_putc('\f');

while(1)
	e=kbd_getc();
	if(e!='\0')	{	
	lcd_putc(e);
			}
	}
}
lo que no puedo hacer es almacenar los datos mostrados en el LCD en una memoria y comparar con el valor de la clave si alguien me puede explicar como hacerlo se los agradeceria mucho
soy novato en esto de la programación.
adjunto el DSN simulado en proteus
20/12/2010 #2


Hola, te paso codigo que funciona bien en proteus.

Código:
#include <16F877A.h>
#use delay(clock=4000000)
#include <lcd.c>
#include <string.h>

#define use_portb_kbd TRUE
#include <kbd.c>
char e="";
char *clave_ing[4]={"","","",""};
int cmp;
int8 n=0;
int *clave[4]={'1','2','3','4'}; //Clave con la que se compara = 1234
main(){

port_b_pullups(1);

lcd_init();

printf(lcd_putc,"Bienvenido");
delay_ms(1000);
lcd_putc('\f');
printf(lcd_putc,"ingrese clave");
delay_ms(1000);
lcd_putc('\f');

while(1)      {
         e=kbd_getc();
         if(e!='\0')   {   
                    clave_ing[n]=e;
                    lcd_putc("*"); 
                     n++;
                                        
                      if(n==4){
                                                                  
                        if(clave[0]==clave_ing[0]){
                             if(clave[1]==clave_ing[1]){
                                 if(clave[2]==clave_ing[2]){
                                     if(clave[3]==clave_ing[3]){
                                       lcd_putc('\f');
                                       lcd_putc("Clave correcta");
                                       break; }}}}
                      
                      n=0;
                      lcd_putc('\f');
                      lcd_putc("Error");
                      delay_ms(1000);  
                      lcd_putc('\f');
                        }
                  
                  
                  }
              
               }
}
21/12/2010 #3

Avatar de felicris

ricber gracias por responder a mi consulta....

mira hice algo parecido a lo que tu posteaste que me funciono de una.... suerte la mia....

este es el programa que hice

Código:
# include <16f877a.h>
#use delay (clock = 4000000)
#include <lcd.c>
#define use_portb_kbd TRUE
#include <kbd.c>
#rom 0x2100={'7','3','2','4'}
unsigned long int adc;
main (){

char k;
int i;
int c=0;
char data[4],clave[4];
lcd_init();
kbd_init();
port_b_pullups(1);
while(true){
i=0;
printf(lcd_putc,"\fBienvenido\n");
delay_ms(1000);
printf(lcd_putc,"\ningrese clave\n");
delay_ms(1000);
printf( lcd_putc ,"\fpulsar tecla 1\n");
while(i<=3){
 k=kbd_getc();
if (k!=0)
 {data [i]=k;
  i++;
 printf(lcd_putc,"\fpulsar tecla %u\n",i+1);
}
}
c++;
if (c==3){
      while(1){
                 printf(lcd_putc,"\fbloqueado\n");
     delay_ms(1000);
     printf(lcd_putc,"\freinicie\n");
       delay_ms(1000);
   }
}   
 
for (i=0;i<=3;i++){
 clave[i]=read_eeprom(i);}
 if((data[0]==clave[0])&& (data[1]==clave[1]) && (data[2]==clave[2])&& (data[3]==clave[3])){

while(1){
 printf(lcd_putc,"\fok\n");
        setup_port_a(AN0);
        setup_adc(ADC_CLOCK_INTERNAL);
        set_adc_channel(0); // selecciona el canal 0 solamente
         adc = read_adc();
         lcd_gotoxy(1,1); 
          printf(lcd_putc, "dec=%lu",adc);
         lcd_gotoxy(1,2);
          printf(lcd_putc,"Hex=%lx",adc);
     
  
          set_adc_channel(1); // selecciona el canal 1 solamente
         adc = read_adc();
         lcd_gotoxy(10,1); 
          printf(lcd_putc, "dec=%lu",adc);
         lcd_gotoxy(9,2);
          printf(lcd_putc,"Hex=%lx",adc);
         delay_ms(500);
         
}
}  
    
else printf(lcd_putc,"\fclave incorrecta\n");
  
     delay_ms(1000);

 
}
}
desde aca gracias
22/12/2010 #4


OK, suerte con el proyecto.
03/08/2011 #5


hola compañeros yo quiero mostrar un calendario por medio de una lcd utilizando el pic16f876a con el intregrado ds1307 en proteus me funciona muy bien pero ya que lo pongo en la targeta nadamas no muestra nada aqui les dejo mi codigo haber si alguien me pudiera decir cual es mi error


Código:
#include <16F876A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
int8 hora=23;
int8 minuto=59;
int8 segundo=0;
int8 mes=12;
int8 anio=8;
int8 dia=31;
int8 dow=1;
#use standard_io(A)
#use standard_io(B)

#define LCD_ENABLE_PIN PIN_A2
#define LCD_RS_PIN PIN_A0
#define LCD_RW_PIN PIN_A1
#define LCD_TYPE 2
#define LCD_DATA4  PIN_B4                                                       ////
#define LCD_DATA5  PIN_B5                                                       ////
#define LCD_DATA6  PIN_B6                                                       ////
#define LCD_DATA7 PIN_B7

#include <LCD.C>

#include <DS_1307.c>
void ajusta_tiempo(int16 value);
void d_semana(unsigned char nr_dia);
int16 conta=0,value;
int i=1;

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();

   // TODO: USER CODE!!
DS1307_init();
 ds1307_set_date_time(dia,mes,anio,dow,hora,minuto,segundo);
for(;;)
{
 
 printf(LCD_PUTC,"HOLA");
 delay_ms(850);
 if (input(pin_b0)==1)
 {
 ajusta_tiempo(value);
 }
 else
 {
 ds1307_get_time(hora,minuto,segundo); 
ds1307_get_date(dia,mes,anio,dow);
lcd_gotoxy(1,1);               

   d_semana(dow);     

printf(LCD_PUTC,"\%02d/\%02d/\%02d\n",dia,mes,anio);
lcd_gotoxy(1,2);
printf(LCD_PUTC, "Hora->");

printf(LCD_PUTC,"\%02d:\%02d:\%02d\n", hora,minuto,segundo);
delay_ms(850);
 }
 
 if (dia<=15)
 {
 output_high(PIN_A3);
 }
 else
 {
 output_low(PIN_A3);
 }
}
}

void ajusta_tiempo(int16 value){

  
lcd_putc("\f");
   restart_WDT();                            //restaura WDT
   
   switch (conta){
      case 0:        //recibe dia
      lcd_gotoxy(1,1); 
      printf(LCD_PUTC, "dia->");
          if (input (pin_b2)==1){
          i=1+i;
          if (i>=31)
          {
          i=1;
          }
          printf(LCD_PUTC,"\%02d",i);
          delay_ms(250);
       }
    if (input (pin_b1)==1)
                  {
                  dia=i;
                  conta++;
                  delay_ms(550);
                  }                       
   
         break;
       case 1:       
       
      lcd_gotoxy(1,1); 
      printf(LCD_PUTC,"mes->");
      if (input (pin_b2)==1){
          i=1+i;
          if (i>=12)
          {
          i=1;
          }
          printf(LCD_PUTC,"\%02d",i);
          delay_ms(250);
       }
    if (input (pin_b1)==1)
     {
            mes=i;
            conta++;
            delay_ms(550);
            }
            //incrementa
        
         break;
      case 2:        //recibe año
      lcd_gotoxy(1,1); 
      printf(LCD_PUTC,"año->");
           if (input (pin_b2)==1){
          i=1+i;
          if (i>=100)
          {
          i=1;
          }
          printf(LCD_PUTC,"\%02d",i);
          delay_ms(250);
       }
            if (input (pin_b1)==1)
             {
             anio=i;
            conta++;
            delay_ms(550);
            }
           
        
         break;
      case 3:        //recibe hora
      lcd_gotoxy(1,1);  
      printf(LCD_PUTC,"hora->");
           if (input (pin_b2)==1){
          i=1+i;
          if (i>=24)
          {
          i=1;
          }
          printf(LCD_PUTC,"\%02d",i);
          delay_ms(250);
       }
            if (input (pin_b1)==1)
             {
             hora=i;
            conta++;
            delay_ms(550);
            }
              
         break;
      case 4:        //recibe minutos
           lcd_gotoxy(1,1); 
           printf(LCD_PUTC,"minuto->");
           if (input (pin_b2)==1){
          i=1+i;
          if (i>=60)
          {
          i=1;
          }
          printf(LCD_PUTC,"\%02d",i);
          delay_ms(250);
       }
    
            if (input (pin_b1)==1)
             {
             minuto=i;
            conta++;
            delay_ms(550);
            }
         break;
      case 5:
      lcd_gotoxy(1,1);   
      printf(LCD_PUTC,"dia de la semana->");
      lcd_gotoxy(1,2);
           if (input (pin_b2)==1){
          i=1+i;
          if (i>=7)
          {
          i=1;
          }
          printf(LCD_PUTC,"\%02d",i);
          delay_ms(250);
       }
            if (input (pin_b1)==1)
             {
             dow=i;
            
            lcd_putc("\f");
            lcd_gotoxy(1,1);               
              

               d_semana(dow);     
            
            printf(LCD_PUTC,"\%02d/\%02d/\%02d\n",dia,mes,anio);
            lcd_gotoxy(1,2);
            printf("Hora->");
            
            printf(LCD_PUTC,"\%02d:\%02d:\%02d\n", hora,minuto,segundo);
            conta=0;
            ds1307_set_date_time(dia,mes,anio,dow,hora,minuto,segundo);
            delay_ms(5050);
             }     
         
         break;
   }
  
}
               
void d_semana(unsigned char nr_dia){

   restart_WDT();
   switch (nr_dia){
      case 1:
         printf(LCD_PUTC,"Lunes->");
         restart_WDT();
         break;
      case 2:
         printf(LCD_PUTC,"Martes->");
         restart_WDT();
         break;
      case 3:
         printf(LCD_PUTC,"Miércoles->");
         restart_WDT();
         break;
      case 4:
         printf(LCD_PUTC,"Jueves->");
         restart_WDT();
         break;
      case 5:
         printf(LCD_PUTC,"Viernes->");
         restart_WDT();
         break;
      case 6:
         printf(LCD_PUTC,"Sábado->");
         restart_WDT();
         break;
      case 7:
         printf(LCD_PUTC,"Domingo->");
         restart_WDT();
         break;
   }
   restart_WDT();
}
04/08/2011 #6


Hola, si en proteus te funciona bien podemos pensar que el codigo
esta bien y que el problema podria estar en el hardware.
Tenes todo bien conectado y con las tensiones correctas?
04/08/2011 #7


mira no se si sea por que cambio al puerto b el display enciende pero no se ve nada
19/04/2012 #8


hola, intenta probar conectando un potenciometro al pin 3 del LCD, este te ayudara a ajustar el contraste, probablemente por eso no se vea.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.