Ir ao conteúdo

Problema com Relogio no LCD - MikroC


alexandrefdem

Posts recomendados

Postado

Galera, segue abaixo o código que tô usando. Não consigo sequer mostrar os segundos, apenas mostra "0" no display e nada mais, mesmo com o timer0 ativo.

Posso estar errado em muitas partes no código, e espero que os senhores me deem esse auxílio, ao menos, para descobrir como fazer os segundos funcionarem, o resto é só repetição.

 int increm;
int seg ;
int h ;
int m;
char segun[2];

// Lcd pinout settings
sbit LCD_RS at RB3_bit;
sbit LCD_EN at RB2_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB3_bit;
sbit LCD_EN_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;

char text1[]="Relogio";

void interrupt() //Função reservada do MikroC, não chama no Main porque
{ //Roda por fora dele
while(!INTCON.F2); //Quando a flag do TMR0 estourar
INTCON.F2=0; // Zere a flag
increm++ ; // incremente variável
if(increm == 5000){ // se a variável incrementa a +- 15x por segundo
seg++; // então quando igual a 15, incremente 1 segundo

}
TMR0=100;
INTCON = 0x20;
}

void main() {

TRISA.f0 = 1; //RA0 1 2 como entrada
TRISA.f1 = 1;
TRISA.f2 = 1;
TRISA.f3 = 0; //RA3 4 como saída
TRISA.f4 = 0;
TRISB = 0; //PortB todas como saída
PORTB = 0x00; //iniciando em estado zero todas as Portb
PORTA = 0b00111; //iniciando em estado zero Ra3 e Ra4
TMR0 = 255; //Timer 0 ativado
OPTION_REG = 0b00111010; //registrando Prescaller de 256, ativado, com clock interno
INTCON = 0x80; //ativando funções do timer0

seg=0;
m=0 ;
h=12;

Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

// Write text in first row
while(1)
{
if(seg=60)
{
seg=0;
m++;
}
else if(seg++)
{
trisa.f3=1;
delay_ms(200);
trisa.f3=0 ;
delay_ms(200);
}

Lcd_Out(1,4,text1);
intToStr(seg,segun);
Lcd_out(2,3,segun); // Write text in second row

delay_ms(800);
Lcd_cmd(_LCD_CLEAR); // Clear display
}


}

Postado

Gostaria de avisar que resolví meu problema, tive dificuldades na configuração do interrupt e nas conversões, mas conseguí resolver.

Quem precisar de um código pra Relogio no LCD, segue um desenvolvido abaixo.


//Lcd pinout settings
sbit LCD_RS at RB3_bit;
sbit LCD_EN at RB2_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB3_bit;
sbit LCD_EN_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;


int increm = 0;
unsigned short s;
unsigned short h;
unsigned short m;
char segun[4];
char minuto[4];
char hora[4];




char text1[]="Relogio";

void interrupt() //Função reservada do MikroC, não chama no Main porque
{ //Roda por fora dele
intcon.t0if=0; //zere a flag a cada estouro
increm++; //e incremente a variavel de incremento
if(increm==15) // então, se increm chegar a 15
{
increm=0 ; //Zere-o
s++ ; //E faça um segundo
}

if(h>23) //E aqui seguem as regras do relogio.
{
s=0;
m=0;
h=0;
}
else if(m>59)
{
m=0;
h++;
}
else if(s>59)
{
s=0;
m++;
}
}

// As regras foram aplicadas dentro do interrupt
// por conta da velocidade de execução

void calibrar() //Função de calibragem do tempo pelas portas RA0 e RA1
{
if(!porta.f0)
{
m++;

}
else if(!porta.f1)
{
h++;

}
}
void main() {

TRISA.f0 = 1; //RA1 e 2
TRISA.f1 = 1; //como entrada
TRISB = 0; //PortB todas como saída
PORTB = 0x00; //iniciando em estado zero todas as Portb
PORTA = 0b11111; //iniciando em estado 1 RA0 e RA1
TMR0 = 0; //Timer 0 ativado
OPTION_REG = 0b000000111; //registrando Prescaller de 256, ativado, com clock interno
INTCON.GIE = 1; //Global Interrupt Ativo.
INTCON.T0IE=1; // interrupção não mascarada.


Lcd_Init(); // Inicie o LCD
Lcd_Cmd(_LCD_CLEAR); // Limpe tudo
Lcd_Cmd(_LCD_CURSOR_OFF); // E desligue o cursor

s=30; // valores previos de hora minuto e segundo
m=56;
h=13;


while(1) //Loop infinito
{
//calibre horas e minutos com RA0 e RA1
calibrar();
Lcd_Out(1,4,text1); // escreva text1 na 1ª linha 4ª coluna

byteToStr(s,segun); //conversão de variável para caractere
Lcd_out(2,9,segun); // Segundos

Lcd_chr(2,9,':'); // Doispontos

bytetostr(m,minuto); //conversão de variável para caractere
Lcd_out(2,6,minuto); //Minutos

Lcd_out(2,6,":"); //doispontos

bytetostr(h,hora); //conversão de variável para caractere
Lcd_out(2,3,hora); //hora

delay_ms(500); //Tempo de exibição (tempo de refresh)
Lcd_cmd(_LCD_CLEAR); //Limpe o display e comece tudo de novo

}


}

Arquivado

Este tópico foi arquivado e está fechado para 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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...