Ir ao conteúdo

Posts recomendados

Postado

Bom dia, Boa tarde, Boa noite, pra quem esta tentando me ajudar, desde já agradeço, o problema é o seguinte, quando eu ligo a simulação no proteus o contador já aciona sozinho a parte dos segundos, mas o problema é que ele inicia com letras do alfabeto e depois ele muda pra caracteres só em seguida ele muda para números. Toda vez que o segundo digito vai pra 0 ele muda pra alguma letra ou carácter. Se alguém puder me ajudar, agradeceria muito.

Captura de Tela (1).png

adicionado 3 minutos depois

sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

#define  horas1        RB0_bit             
#define  minutos10     RB1_bit             
#define  starta        RB2_bit             
#define  despejar      RB3_bit             

char *text  = "00:00:00";                  
char flags=0x00;                           
int contagem;
char horas = 0x00, minutos = 0x00, segundos = 0x00;        

void interrupt()
{
  if(TMR1IF_bit)
  {
   TMR1IF_bit = 0x00;
   TMR1L = 0x2C;
   TMR1H = 0xCF;
   contagem++;
  }


}



void main()
{
 ADCON1 = 0x0F;
 INTCON = 0xC0;
 TMR1IE_bit = 0x01;
 T1CON = 0x21;
 TMR1L = 0x2C;
 TMR1H = 0xCF;
 TRISB = 0x0F;
 TRISD = 0x00;
 PORTD = 0x00;
 Lcd_Init();
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Cmd(_LCD_CURSOR_OFF);
 Lcd_Out(1,1,"  ALIMENTADOR");
 Lcd_Out(2,1,"   PET FOOD");
 delay_ms(1000);
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Out( 1, 1, "TEMPO" );
 Lcd_Out( 2, 1, "VEZES:" );
 Lcd_Out( 2, 9, "00" );

  while(1)
 {
  if(contagem==25)
  {
   contagem = 0;

   if(starta)
   {
    segundos--;

    if(segundos < 0)
    {
     segundos = 59;
     minutos--;

     if(minutos < 0)
     {
      minutos = 59;
      horas--;

      if(horas < 0)
      {
       horas = 0;
       minutos = 0;
       segundos = 0;
       starta = 0;
       Lcd_Out(1,3,"DESPEJANDO");
       Lcd_Out(2,3,"RAÇÃO");

      } //end if horas

     } //end if minutos

    } //end if segundos

   } //end if starta

  } //end if contagem
  if(!horas1)
  {
   flags.b7 = 0x01;
  }
  if(horas1 && flags.b7)                          
   {
     flags.b7=0x00;
     horas++;
     if(horas > 0x17) horas = 0x00;
   }// end if horas1
   if(!minutos10)
   {
   flags.b6 = 0x01;
   }
    if(minutos10 && flags.b6)                       
   {
    flags.b6=0x00;
    minutos = minutos + 5;
    if(minutos > 0x3B) minutos = 0x00;
   }
   if(!starta)
   {
    flags.b5 = 0x01;
   }
   if(starta && flags.b5)
   {
     flags.b5 = 0x00;
     starta = ~ starta;
   }
   {
    text[7] = segundos%10 + '0';
    text[6] = segundos/10 + '0';
    text[4] = minutos%10 + '0';
    text[3] = minutos/10 + '0';
    text[1] = horas%10 + '0';
    text[0] = horas/10 + '0';

    Lcd_Out(1,9,text);
   }

 }//END WHILE


}//END VOID

o codigo.

ps: compilador foi o mikroC

  • Membro VIP
Postado
16 horas atrás, ThiiiaGo101 disse:

if(segundos < 0)

isto pressupõe que sua variável segundo deve ser signed char. E você define como

 

16 horas atrás, ThiiiaGo101 disse:

char horas = 0x00, minutos = 0x00, segundos = 0x00;

 talvez seu compilador defina como char como unsigned

 

Bem...

eu (eu) faria (certa feita fiz tipo) assim
 

unsigned int segundo;
unsigned char hora, minuto;

...
 

hora=segundo%3600;
minuto=segundo%60;

e só manipulava a segundos

ou algo do gênero. Funciona bem só para doze horas. Sabe porquê?

 

 

  • Membro VIP
Postado
11 horas atrás, ThiiiaGo101 disse:

eu não saberia te dizer

tentar... segundo=unsigned int=vai no máximo até 0xffff ou 65535. Um dia de 24H tem 24*3600 que  é + que isso: não cabe. Mas 12H => 12*3600 < 65535 : cabe

Pra caberem 24H em segundo, esta teria que ser outro tipo de variável. Sabe qual?

 

Sobre char signed e unsigned...

Em 17/05/2017 às 02:32, ThiiiaGo101 disse:

if(minutos < 0)

... sendo minutos= unsigned, esta condição jamais vai ocorrer. Dê uma conferida/pesquisada e considere tecer algum comentário se achar que deve. (Desnecessário de tiver certeza que teu compilador considera char como signed).

Postado

Olá. Olhando por cima, PARECE que teu timer já está iniciando no início do programa 

 

Em 2017-5-17 às 02:32, ThiiiaGo101 disse:

T1CON = 0x21;

Coloca 0x20 e não sairá disparando e acione o Bit 0 desse registrador quando quiser ligar a contagem.

 

E quanto aos caracteres de letras, faria o que a @Isadora Ferraz disse: colocar unsigned char

 

E outra pergunta: Porque aqui você criou um ponteiro? 

Em 2017-5-17 às 02:32, ThiiiaGo101 disse:

char *text = "00:00:00";

Se fizer sem o * acho que funciona, já que esse ponteiro não está apontando pra lugar algum.

 

Abs

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!