PIC: Calculadora Simples
Esta simples calculadora utilizando o PIC16F877A, possui as quatro operações básicas (adição, subtração, divisão e multiplicação).
Também é possível realizando cálculos com números fracionados.
Projeto Calculadora;
CÓDIGO-FONTE:
/*
*Projeto: Calculadora
*MCU: PIC16F877A
*Clock: HS 8MHz
*Descrição: Simples calculadora
*Compilador: MikroC PRO PIC
*Autor: Tiago H. Melo
*/
char keypadPort at PORTD;
sbit LCD_RS at RB0_bit; sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN at RB1_bit; sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4 at RB2_bit; sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5 at RB3_bit; sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6 at RB4_bit; sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7 at RB5_bit; sbit LCD_D7_Direction at TRISB5_bit;
char teclas[] = {'7','8','9','/','4','5','6','*','1','2','3','-','.','0','=','+'};
char numero[9];
float lvalue, rvalue;
char op, flags, resultado[16];
#define CALCULO_OK flags.F0
#define NEGATIVO flags.F1
#define lcd_clear() lcd_cmd(_LCD_CLEAR);
#define LimparNumero for(i=0;i<8;i++) *(numero + i) = 0;
//esta funcao faz a varredura do teclado e retorna o valor da tecla pressionada
char keyRead(char keys[])
{
char key;
key = keypad_key_press();
if(key != 0) return keys[key-1];
return 0;
}
void main()
{
char k, pos, op, i;
keypad_init();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1)
{
k = keyRead(teclas);//leitura do teclado
if(CALCULO_OK)
{
pos = 0; //reseta posicao
CALCULO_OK = 0; //reseta calculo
lcd_clear(); //limpa display
lcd_cmd(_LCD_RETURN_HOME);
for(i=0;i<8;i++){ //limpa as variaveis
*(numero + i) = 0;
*(resultado + i) = 0;
*(resultado +i + 8) = 0;
}
}
//se a teclas pressiona for um numero
if((k>='0' && k<='9') || k=='.')
{
*(numero + pos++) = k;
if(pos >= 8) pos = 0;
lcd_Out_CP((numero+(pos-1)));
}
else if(k == '+' || k=='-' || k=='/' || k=='*')
{
op = k;
pos = 0;
lcd_chr_CP(op);
lvalue = atof(numero);
LimparNumero;
}
else if(k == '=')
{
rvalue = atof(numero);
NEGATIVO = 0;
lcd_chr_CP('=');
switch(op)
{
case '+':
lvalue += rvalue;
break;
case '-':
if(lvalue >= rvalue)
{
lvalue -= rvalue;
}
else
{
lvalue = rvalue - lvalue;
NEGATIVO = 1;
}
break;
case '/':
if(rvalue!=0)lvalue /= rvalue;
else lvalue = 0;
break;
case '*':
lvalue *= rvalue;
break;
}
//converte numero para string
floattostr(lvalue, (resultado + NEGATIVO));
if(NEGATIVO) *(resultado) = '-';
lcd_out(2, 1, resultado);
CALCULO_OK = 1;
}
delay_ms(200);
}
}


Cara muito obrigado, Vai me ajudar bastante. Mas VC por acaso teria esse código fonte em assembler?
ResponderExcluirBoa tarde.
ResponderExcluirComo seria esse código com o PIC18F4520?
como seria com o
ResponderExcluirPIC18F452
Boa tarde, por favor podem me ajudar!
ResponderExcluirComo seria o código para pic18F4520???
Por favor podem mandar para o meu email: baltazar.anselmo69@gmail.com
Alguém conseguiu fazer o programa rodar..........e se sim, qual compilador usou..........usei o mikroC e ele dá erro......
ResponderExcluirNa época que compilei este código acho que estava utilizando o MikroC 6.0.
ExcluirRealmente não deve funcionar,eu não cheguei a tentar compilar o programa, mas acredito que irá apresentar falha pois falta incluir a biblioteca do LCD e vejo que ele usa a funcao lcd_chr_CP( ) que não é declarada. Provavelmente quem postou não testou o código sòmente copiou de um site e postou aqui
ResponderExcluirSeja mais educado...não fale de coisas que você não sabe.
ExcluirAlguém tem como fornecer o código em assembler?
ResponderExcluirBOa NOite ! Pode indicar um tipo de teclado para usar neste projeto ?
ResponderExcluirOlá estou executando esse exemplo numa protoboard e esta dando um pequeno erro
ResponderExcluirNo resultado tipo 8*2 = 17.99999 como eu faço pra corrigir essa diferença ???