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 :confused:
 

Adjuntos

  • programa.rar
    14.3 KB · Visitas: 98
Última edición por un moderador:
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');
                        }
                  
                  
                  }
              
               }
}
 
Última edición por un moderador:
@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 :apreton:
 
Última edición por un moderador:
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();
}
 
Última edición por un moderador:
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?
 
Atrás
Arriba