Ir ao conteúdo

Posts recomendados

Postado

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
   }
}  
 

Foto.png

  • Membro VIP
Postado

confuso... conecta o display em 4 bits e o trata como serial... leitura de tecla esquisita...etc Me auto permiti avaliar apenas a superfície ok?

 

Igual a jack - o estripador, vá por partes. 1º domine a escrita no display, 2º domine a leitura das teclas escrevendo seu valor numérico no já dominado display. Pronto! 99,9% resolvido.

 

Provavelmente tem exemplos na net. Não reinvente a roda...

 

Pisca led.. jamais queime esta etapa

Visitante
Este tópico está impedido de receber novas respostas.

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...