calculadora con pic 18f4550

pues como dice mi titulo es hacer una calculadora con el pic 18f4550 yo se hacer las operaciones matemáticas y todo eso, el problemas es que necesito poder que al accionar un botón este de el resultado de la suma luego vuelva a presionar y aparezca la multiplicación y vuelva accionar y muestre la resta cabe decir que todo esto se hace con un mismo botón
les voy a dejar mi programación
Código:
#include "C:\Users\User\Desktop\calculadora\main.h"



#include <LCD.c>

void main()
{
int a=0;
int b=0;
int c=0;
int opcion;

set_tris_b(0x00);
set_tris_a(0x01);
set_tris_c(0x00);
set_tris_d(0x00);
   

lcd_init();
   while(TRUE)
   {
   if (input(PIN_A0)==0&&input(PIN_A1)==0)
 {

 
      a=a+1;
      lcd_gotoxy(2,3);
      printf (lcd_putc,"%d",a);
      delay_ms(300);
      lcd_putc('\f');
      
   
  
 }
 
 if (input(PIN_A0)==0&&input(PIN_A1)==1) 
  {
  
  
  b=b+1;
  lcd_gotoxy(5,3);
      printf (lcd_putc,"%d",b);
      delay_ms(300);
      lcd_putc('\f');
  
  }
   opcion=1+opcion;
 switch (input(PIN_A2)==0)
 {
 
 case 1 :
  
   if (input(PIN_A2)>=20)
    {
    output_high(PIN_C1);
      delay_ms(100);
      output_low(PIN_C1);
      delay_ms(100);
    }
        c=a+b;
      lcd_gotoxy(1,1);
      printf (lcd_putc,"%d",c);
      delay_ms(100);
      lcd_putc('\f');
      opcion=0;


  
  case 2:
   
      
      
      c=a*b;
    lcd_gotoxy(1,1);
      printf (lcd_putc,"%d",c);
      delay_ms(90);
      lcd_putc('\f');
    opcion=1;
      
    
 case 3:
    opcion=3;
   
   
     
      c=a-b;
    lcd_gotoxy(1,1);
      printf (lcd_putc,"%d",c);
      delay_ms(200);
      lcd_putc('\f');
     opcion=2;
      
     
  
     }
 }
   }
básicamente la calculadora hace ya todo esto pero cuando presiono el boton me aparecen los tres resultado a la vez obviamente se que a los case les falta el break pero si lo coloco solo me muestra el resultado de la operacion
utilizo pic c por si acaso
me dijeron que utilice una especie de bandera
dejo el circuito en proteus
 

Adjuntos

  • foro.rar
    15 KB · Visitas: 42
Última edición por un moderador:
Hola:
Me parece que estas iniciando con la programación puesto que estas haciendo un mal uso de las sentencias; claro, el compilador no se queja pero al leer el programa son obvios los errores.

Para responder tu inquietud, básicamente se podría utilizar un contador el cual incremente la cuenta cada vez que se active un pulsador; el valor del contador se envía al switch-case y dentro de éste se compara por ejemplo, si el valor de la cuenta es:

1 entonces suma, de lo contrario si es
2 entonces resta, de lo contrario si es
3 entonces multiplica, etc...

Cuando la cuenta supera el máximo permitido que serian el numero de operaciones, se establece el valor en 0 como por defecto.
Al pulsador le puedes poner como un pare cada vez que se pulsa, para que el switch se ejecute solo cuando se suelte el pulsador...

Saludos.
 
primero muchas gracias por responder y si te refieres a lo de los break; es que estaba probando diferentes soluciones.
con respecto a tu respuesta básicamente lo que tu me dices es lago como esto
.
.
.
opcion=opcion+1

switch (contador)
case 1:
...

break;

case2:
....

break;



case 3;
.....
break;

pero algo que no entendí muy bien es como puedo asociar cada ves que pulse el boton con el aumento del contador
se me ocurrio esto

if (input(PIN_A2)==0)
{
opcion=opcion+1;=opcion+1;
}
GRACIAS DE ANTEMANO
 
Si.

if (input(PIN_A2)==0)
{
count=count+1;


- Esperas a que se desactive el pulsador para que el switch se realice solo después de soltarlo. Puede ser con un While(PIN).
- Comparas el valor de count en el switch-case y según sea 1, 2, 3, etc realiza la suma, resta, mul, etc..
- Si count supera los valores que se pueden comparar en switch-case se regresa el valor de count a cero para volver a hacer todo.

}

Sobre los detalles u errores no solo me refiero a break, pero eso se aprende con la practica...

Un saludo.
 
oye primero infinitas gracias por responder
si no es mucho problema tienes alguna idea de como puedo comparar de que si esa respuesta es 5 o menos se encienda un led cualquiera

por si alguien la necesita lo voy a dejar por aquí es funcional pero unos cuantos errores en el uso de las sentencias
Código:
#include "C:\Users\User\Desktop\calculadora\main.h"



#include <LCD.c>

void main()
{
int a=0;
int b=0;
int c=0;
int opcion;
int puntero;

set_tris_b(0x00);
set_tris_a(0x01);
set_tris_c(0x00);
set_tris_d(0x00);
   

lcd_init();
   while(TRUE)
   {
   if (input(PIN_A0)==0&&input(PIN_A1)==0)
 {

 
      a=a+1;
      lcd_gotoxy(2,3);
      printf (lcd_putc,"%d",a);
      delay_ms(100);
      lcd_putc('\f');
      
   
  
 }
 
 if (input(PIN_A0)==0&&input(PIN_A1)==1) 
  {
  
  
  b=b+1;
  lcd_gotoxy(5,3);
      printf (lcd_putc,"%d",b);
      delay_ms(100);
      lcd_putc('\f');
  
  }
 
if (input(PIN_A2)==0)


{
opcion=opcion+1;

}
 switch (opcion)
 {
 
 case 1 :
  
   
        c=a+b;
      lcd_gotoxy(1,1);
      printf (lcd_putc,"%d",c);
      delay_ms(30);
      lcd_putc('\f');
    
 
break;

 case 2:
   
      
      
      c=a*b;
    lcd_gotoxy(1,1);
      printf (lcd_putc,"%d",c);
      delay_ms(30);
      lcd_putc('\f');
     
      
    break;

     case 3:
    
   
      c=a-b;
      lcd_gotoxy(1,1);
      printf (lcd_putc,"%d",c);
      delay_ms(30);
      lcd_putc('\f');
     
      
     break;
  
  
 }
   }
}
 
Última edición por un moderador:
Atrás
Arriba