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
*/
Pergunta
AmarildoCunha
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.
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
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.