Ir para conteúdo
Fórum Script Brasil
  • 0

Iniciante, calculo com string!


AmarildoCunha

Pergunta

Bom dia senhores! Acabei de me registrar neste forum para solicitar ajuda. Sou iniciante em C, mas formado em eletronica. Estou desenvolvendo um projeto com PIC 16F877A para contagem de peças. Porém, necessito programar meu processador para fazer alguns calculos, coisa simples de fazer (para quem entende de programação). há duas semanas estou desenvolvendo o código em C para depois converter em Assembler com o compilador PCW. Toda a parte de eletronica esta funcionando perfeitamente. Inclusive eu faço a simulação no PROTEUS. Mas o hardware já esta pronto e funcionando.

Andei fuçando tanto na Internet que este final de semana precisei descançar, não aguentava mais ler tanta coisa. Mas não irei desistir. Eu sei que é complicado ajudar iniciantes, por isso relutei em postar alguma coisa pedindo ajuda.

Resumo do que fazer:

Meu projeto tem um LCD 16X2L, um botão para SOBE,DESCE e ENTER.

O programa vai ler o botão SOBE ou DESCE e mostrar o valor numerico de 0 a 9 no display (primeiro digito, serão 4), aperta ENTER para inserir o digito escolhido, vai para a variavek Q4, segue para o proximo,, Q3,Q2 até Q1. Aqui eu já tenho meus quatro digitos que preciso, exemplo: Quero um valor de 5000. Então eu tenho as variavel Q4=5, Q3=0,Q2=0 e Q1=0. Até aqui tudo FUNCIONA.

O que eu preciso agora e fazer uma contagem regressiva deste valor, preciso ter uma variavel com o valor 5000 para poder fazer o calculo.

É isto que não consigo fazer.

Eu experimentei tanta coisa que estou até confuso.

Eu acredito que o certo seria jogar cada variavel Q numa string e depois concatenar tudo numa só. Mãs não tive sucesso tembém.

O código abaixo está na ultima alteração que fiz, talvez um pouco bagunçado. Tanto que coloquei o manipulação de variaveis no começo para testes.

/* Código para contador de peças com display LCD e PIC16F877A.       *
 * Para ser compilada com o PICC-CCS                                    *
 * Autor: Amarildo Cunha                                                *
 * Data 10/01/2013                                                      */

#include "main.h"
#include "mod_lcd.c"
#include "string.h"
#include "stdio.h"
#include "ctype.h"
#include "stdlib.h"

// Definições de variaveis

int conta = 0; // contagem
int q1 = 1; // Armazena o primeiro digito da contagem
int q2 = 2;
int q3 = 3;
int q4 = 4;
int valor=0;
int valores[4]={5,6,5,6};
char s1[4],s2[1],s3[1],s4[1];
char tmp[5];

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#byte porta=0x05 //Endereço de memória das portas
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
#byte porte=0x09

#bit sobe=porta.0
#bit desce=porta.1
#bit pulso=porta.3
#bit enter=porta.2
#bit rele=portb.0
#bit buzz=portb.1
#bit led=portb.2


int main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   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);
   set_tris_a(0b11111111); //define as portas A como entrada
   set_tris_b(0b00000000); //Define as portas B como saída
   porta=0x00; // todos as portas com valor zerado
   portb=0x00;
   
     
   lcd_ini(); // Inicializa o LCD
   lcd_escreve ('\f'); // limpa o display
  
   // Função lcd_escreve
   //lcd_escreve ("LASER");
      
   // Imprime menssagem no LCD com a função printf
   //printf (lcd_escreve, "Teste");
   
  // while (true)   // Enquanto (true) faça
   lcd_pos_xy (1, 1); // Posiciona cursor no LCD
   printf (lcd_escreve, ": %d", conta);  // Imprime texto no LCD
   sprintf(s1,"%d",q1);
   sprintf(s2,"%d",q2);
   sprintf(s3,"%d",q3);
   sprintf(s4,"%d",q4);
   
   
   //lcd_pos_xy(10,1);
   //printf(lcd_escreve,"%s", s1); 
   strcat(s1,s2);
   //strcat(s1,s3);
   //strcat(s1,s4);
   lcd_pos_xy(1,2);
   printf(lcd_escreve,"%s", s1); //ok, mostra 4 digitos
   strcpy(valor,s1); // Copia S1 para CONTA, será usado para calculo
   //valor = atoi(s1);
   lcd_pos_xy(10,2);
   printf(lcd_escreve,"%d",valor);
   goto fim;
   
   while (true) // Rotina para entrada dos digitos
      {
      if(sobe) // se a tecla SOBE foi pressionada, 
         {
         conta=conta+1; //adiciona +1
         }
      else led=0;
      if (conta>9) conta=0;//quando chega ao 9, zera novamente
      else led=1;
      lcd_pos_xy (10,2); // posicao do cursor no display
      printf (lcd_escreve,"%d",conta); // escreve no display o valor atual
      delay_ms (250);
      if (desce)
         {
         conta=conta-1;
         }
      else led=0;
      if ((conta!=0)&&(conta>=9)) conta=9; //contagem negativa de 9
      else led=1;
      lcd_pos_xy (10,2);
      printf (lcd_escreve,"%d",conta);
      led=0;
      if (enter) // se enter foi pressionado, copia o valor de CONTA para Q1, 
         {
         q1=conta;
         delay_ms(250);
         goto saida_q1;// Se enter foi pressionado, sai do loop e vai para o proximo digito
         }   
      else;
      delay_ms(250);
      }
saida_q1:
;
 conta=0;
   while (true)
      {
      if(sobe)
         {
         led=1;
         conta=conta+1;
         }
      else led=0;
      if (conta>9) conta=0;//quando chega ao 9, zera novamente
      else led=1;
      lcd_pos_xy (11,2);
      printf (lcd_escreve,"%d",conta);
      delay_ms (250);
      if (desce)
         {
         led=1;
         conta=conta-1;
         }
      else led=0;
      if ((conta!=0)&&(conta>=9)) conta=9; //contagem negativa de 9
      else led=1;
      lcd_pos_xy (11,2);
      printf (lcd_escreve,"%d",conta);
      led=0;
      if (enter)
         {
         q2=conta;
         delay_ms(250);
         goto saida_q2;
         }   
      else;
      delay_ms(250);
      
      }
saida_q2:
;
   conta=0;
   while (true)
      {
      if(sobe)
         {
         led=1;
         conta=conta+1;
         }
      else led=0;
      if (conta>9) conta=0;//quando chega ao 9, zera novamente
      else led=1;
      lcd_pos_xy (12,2);
      printf (lcd_escreve,"%d",conta);
      delay_ms (250);
      if (desce)
         {
         led=1;
         conta=conta-1;
         }
      else led=0;
      if ((conta!=0)&&(conta>=9)) conta=9; //contagem negativa de 9
      else led=1;
      lcd_pos_xy (12,2);
      printf (lcd_escreve,"%d",conta);
      led=0;
      if (enter)
         {
         q3=conta;
         delay_ms(250);
         goto saida_q3;
         }   
      else;
      delay_ms(250);
      }
saida_q3:
;
   conta=0;
   while (true)
      {
      if(sobe)
         {
         led=1;
         conta=conta+1;
         }
      else led=0;
      if (conta>9) conta=0;//quando chega ao 9, zera novamente
      else led=1;
      lcd_pos_xy (13,2);
      printf (lcd_escreve,"%d",conta);
      delay_ms (250);
      if (desce)
         {
         led=1;
         conta=conta-1;
         }
      else led=0;
      if ((conta!=0)&&(conta>=9)) conta=9; //contagem negativa de 9
      else led=1;
      lcd_pos_xy (13,2);
      printf (lcd_escreve,"%d",conta);
      led=0;
      if (enter)
         {
         q4=conta;
         delay_ms(250);
         goto saida_q4;
         }   
      else;
      delay_ms(100);
      
      }
saida_q4:
;
      
fim:
;
   

return(0);
}

/* Funções importantes da biblioteca mod_lcd

lcd_ini()                        // Inicializa LCD
lcd_pos_xy( byte x, byte y)      // Posição de texto x, y
lcd_escreve( char c)             // Função de escrita no LCD
*/

Agradeceria qualquer ajuda.

Obrigado, e abraço a todos.

Amarildo Cunha

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Eu não entendo nada de eletrônica (apesar de ter um curso de manutenção eletrica industrial), mas me parece que o que você quer é:

Dado quatro variaveis q1, q2, q3, q4 do tipo int, que representam o numeral 'q4q3q2q1', você que encontrar o valor total, logo:

#include <stdio.h>

int main()
{
    int q1 = 0;
    int q2 = 0;
    int q3 = 0;
    int q4 = 5;
    int Qtotal;

    Qtotal = (q4 * 1000) + (q3 * 100) + (q2 * 10) + q1;

    printf("Qtotal = %d\n", Qtotal);
}

Link para o comentário
Compartilhar em outros sites

  • 0

Goldbach, muito facil!! Desta forma funciona, simples e prático! Obrigado pela dica.

Vou terminar o programa e quando estiver funcionando eu posto ele aqui.

Abraços.

Obs.: Precisa encerrar o tópico? tem alguma botão de resolvido?

Eu não entendo nada de eletrônica (apesar de ter um curso de manutenção eletrica industrial), mas me parece que o que você quer é:

Dado quatro variaveis q1, q2, q3, q4 do tipo int, que representam o numeral 'q4q3q2q1', você que encontrar o valor total, logo:

#include <stdio.h>

int main()
{
    int q1 = 0;
    int q2 = 0;
    int q3 = 0;
    int q4 = 5;
    int Qtotal;

    Qtotal = (q4 * 1000) + (q3 * 100) + (q2 * 10) + q1;

    printf("Qtotal = %d\n", Qtotal);
}

Editado por AmarildoCunha
Link para o comentário
Compartilhar em outros sites

  • 0
Basta adicionar (RESOLVIDO) ao título do tópico, :D.

Att.,

Pedro

então não vou fechar ainda!!

Engraçado, adaptei a sua dica e não aparece o valor qtotal correto, coloquei nas variaveis os valores Q4=1,Q3=2,Q2=3,Q1=4. O seu programa aparece certo. No meu não, aparece -46.

Para o teste com a dica que voce me passou eu utilizei o DEV-C ++, e para meu projeto o PCW compiler.

Vou tentar compilar meu projeto no DEV-C ++, não sei se vai aceitar. Vou fazer um teste.

Tem alguma dica? algum coisa para eu investigar?

Link para o comentário
Compartilhar em outros sites

  • 0
Ao invés de usar variaves do tipo inteiro, tente usar do tipo unsigned int.

Poderia me dar um exemplo?

Para tirar dúvidas eu fiz o seguinte:

Apenas coloquei qtotal=1000; e mandei imprimir no LCD. Lá aparece -24. Muito estranho.

printf (escreve_lcd,"%d",qtotal);

se eu colocar %u, aparece 232.

Esquisito. Vou continuar tentando.

Link para o comentário
Compartilhar em outros sites

  • 0
Ao invés de usar variaves do tipo inteiro, tente usar do tipo unsigned int.

Poderia me dar um exemplo?

Para tirar dúvidas eu fiz o seguinte:

Apenas coloquei qtotal=1000; e mandei imprimir no LCD. Lá aparece -24. Muito estranho.

printf (escreve_lcd,"%d",qtotal);

se eu colocar %u, aparece 232.

Esquisito. Vou continuar tentando.

Deu certo, utilizei LONG INT e tudo funcionou!!!

Obrigado!!!!!!!!!!!!!!!!!

Link para o comentário
Compartilhar em outros sites

  • 0
Ao invés de usar variaves do tipo inteiro, tente usar do tipo unsigned int.

Poderia me dar um exemplo?

Para tirar dúvidas eu fiz o seguinte:

Apenas coloquei qtotal=1000; e mandei imprimir no LCD. Lá aparece -24. Muito estranho.

printf (escreve_lcd,"%d",qtotal);

se eu colocar %u, aparece 232.

Esquisito. Vou continuar tentando.

Deu certo, utilizei LONG INT e tudo funcionou!!!

Obrigado!!!!!!!!!!!!!!!!!

Disponha.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...