Ir ao conteúdo

Sbpaiva

Membro Júnior
  • Posts

    1
  • Cadastrado em

  • Última visita

Reputação

0
  1. Pessoal, estou desenvolvendo uma calculadora usando PIC, os dígitos estão aparecendo na display LCD e tal, mas não tô conseguindo que as operações sejam feitas. Por favor, me ajudem! O código é mostrado abaixo: #include <16f876.h> #use delay(clock=4000000) #fuses HS,NOWDT,PUT #define baud_rate 19200 #include <rs232.c> #bit pino_tx = 0x07.6 #bit pino_rx = 0x07.7 #bit dir_tx = 0x87.6 #bit dir_rx = 0x87.7 // configuração dos pinos do LCD #define lcd_enable pin_c1 // pino enable do LCD #define lcd_rs pin_c0 // pino rs do LCD //#define lcd_rw pin_c2 // pino rw do LCD #define lcd_d4 pin_a0 // pino de dados d4 do LCD #define lcd_d5 pin_a1 // pino de dados d5 do LCD #define lcd_d6 pin_a2 // pino de dados d6 do LCD #define lcd_d7 pin_a3 // pino de dados d7 do LCD #include <mod_lcd.c> // Definições da matriz do teclado #define COL1 pin_b4 #define COL2 pin_b5 #define COL3 pin_b6 #define COL4 pin_b7 #define LIN1 pin_b3 #define LIN2 pin_b2 #define LIN3 pin_b1 #define LIN4 pin_b0 struct stecla { int cod_tecla : 7; int nova : 1; } tecla; char varre_teclas (void) { int tecla; output_high(COL1); // ativa a primeira coluna output_low(COL2); output_low(COL3); output_low(COL4); if (input(LIN1)) tecla = 55; if (input(LIN2)) tecla = 52; if (input(LIN3)) tecla = 49; if (input(LIN4)) tecla = 80; output_low(COL1); output_high(COL2); // ativa a segunda coluna if (input(LIN1)) tecla = 56; if (input(LIN2)) tecla = 53; if (input(LIN3)) tecla = 50; if (input(LIN4)) tecla = 48; output_low(COL2); output_high(COL3); // ativa a terceira coluna if (input(LIN1)) tecla = 57; if (input(LIN2)) tecla = 54; if (input(LIN3)) tecla = 51; if (input(LIN4)) tecla = 61; output_low(COL3); output_high(COL4); // ativa a quarta coluna if (input(LIN1)) tecla = 47; if (input(LIN2)) tecla = 42; if (input(LIN3)) tecla = 45; if (input(LIN4)) tecla = 43; return (tecla); } struct stecla trata_teclas (void) { // constantes de temporização do teclado // ciclos de filtragem de tecla const int c_filtro = 10; // ciclos antes de iniciar a auto-repetição const int c_ini_autorep = 50; // ciclos entre cada repetição de tecla const int c_autorep = 20; static boolean filtro, ini_autorep; static int tempo_filtro, tempo_ini_autorep, tempo_autorep; static int tecla_anterior; int tecla_atual; struct stecla tecla_pres; tecla_atual = varre_teclas(); if (tecla_atual) { if (tecla_atual == tecla_anterior) { if (filtro) { tempo_filtro --; if (!tempo_filtro) { tempo_filtro = c_filtro; filtro = 0; tecla_pres.cod_tecla = tecla_atual; tecla_pres.nova = 1; ini_autorep = 1; } } else if (ini_autorep) // se filtro = 0 { tempo_ini_autorep --; if (!tempo_ini_autorep) { tempo_ini_autorep = c_ini_autorep; ini_autorep = 0; } } else // se ini_autorep = 0 { tempo_autorep --; if (!tempo_autorep) { tecla_pres.cod_tecla = tecla_atual; tecla_pres.nova = 1; tempo_autorep = c_autorep; } else tecla_pres.nova = 0; } } else // tecla_atual != tecla_anterior { tecla_anterior = tecla_atual; filtro = 1; ini_autorep = 0; } } else { tecla_pres.nova = 0; tecla_anterior = 0; filtro = 0; ini_autorep = 0; tempo_autorep = c_autorep; tempo_filtro = c_filtro; tempo_ini_autorep = c_ini_autorep; } return (tecla_pres); } main() { lcd_ini (); // inicializa display rs232_inicializa(); // inicializa pinos RS232 while (true) { tecla = trata_teclas(); if (tecla.nova) // caso exista tecla pressionada { rs232_transmite (tecla.cod_tecla); // envia a tecla // apresenta no display LCD lcd_escreve(tecla.cod_tecla); if(tecla.cod_tecla==80) { lcd_escreve("\f"); } } delay_ms(10); // tempo entre varreduras } }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!