Olá a todos programadores,
tenho realizado um projeto de tcc, estou tendo algumas dificuldades.
Preciso criar um temporizador por timer a executar determinada funcao.
exemplo:
está executando hora();
depois de um tempo
chama funcao
data();
segue o codico#include <16f627A.h>
#fuses intrc_io, nowdt, noprotect, put, nobrownout, mclr, nolvp, nocpd
#use delay(clock=4000000)
#use fast_io(b)
#define BOTAO1 PIN_a0 //Boto de escolha de ajuste das funes.
#define BOTAO_INCREMENTO PIN_a1 //Boto incremento de variveis.
#define BOTAO_DECREMENTO PIN_a2
int conta_pulsos=0;
#byte porta = 0x05
#byte portb = 0x06
//Boto de decremento das variveis.
int apagado = 0; //apagado
int a;
int n,i=0,valor;
int h=12;
int m=5;
int s=14;
int dezena, unidade, digito;
int seg=0,q;
int contador=0;
int dia=29; //Variável dos dias do mês. 0 a 31.
int mes=6;
int ano=12;
//Tabela com os digitos
const unsigned char table[11][5] = {
0b01111110,0b01000010,0b01000010,0b01000010,0b01111110,//0
0b00000010,0b00100010,0b01111110,0b00000010,0b00000010,//1
0b01011110,0b01010010,0b01010010,0b01010010,0b01110010,//2
0b01010010,0b01010010,0b01010010,0b01010010,0b01111110,//3
0b01110000,0b00010000,0b00010000,0b00010000,0b01111110,//4
0b01110010,0b01010010,0b01010010,0b01010010,0b01011110,//5
0b01111110,0b01010010,0b01010010,0b01010010,0b01011110,//6
0b01100000,0b01000000,0b01000000,0b01000000,0b01111110,//7
0b01111110,0b01001010,0b01001010,0b01001010,0b01111110,//8
0b01110010,0b01010010,0b01010010,0b01010010,0b01111110,//9
0x00, 0x36, 0x36, 0x00, 0x00, // :
#int_TIMER1
void temp1s(void)
{
q++;
seg++;
if(seg==4){
seg=0;
i++;
}
if(i==4){
i=0;
}
set_timer1 (3036); //Preload do Timer1
}
void caracter(digito) { //chr contem 2 digitos (hh,mm o ss)
dezena = (digito/10); // dezenas
unidade = (digito-(dezena*10)); //e as unidades
for (n=0;n<5;n++) { //preparar a tabela para primeiro digito
output_b(table[dezena][n]);
output_high(pin_b0);
output_high(pin_b7);
delay_us(900) ;//160useg cada pixel horizontal
}
delay_us(700); //pausa entre digitost
output_high(pin_b0);
output_high(pin_b7);
output_b(0x00);
output_high(pin_b0);
output_high(pin_b7);
delay_us(700); //pausa entre digitos*/
for (n=0;n<5;n++) {
output_b(table[unidade][n]);
output_high(pin_b0);
output_high(pin_b7); //unidades
delay_us(700);
output_high(pin_b0);
output_high(pin_b7);
}
delay_us(700); //pausa entre digitos
output_b(0x00);
delay_us(700); //pausa entre digitos*/
output_high(pin_b0);
output_high(pin_b7);
}
void doispontos()
{
for (n=0;n<5;n++) { //preparar tabela para primeiro digito
output_b(table[10][n]);
output_high(pin_b0);
output_high(pin_b7);
delay_us(400); //160useg cada pixel horizontal
}
delay_us(400); //pausa entre digitost
output_b(0x00);
output_high(pin_b0);
output_high(pin_b7);
delay_us(400); //pausa entre digitos*/
}
void barra()
{
for (n=0;n<5;n++) { //preparar tabela para primeiro digito
output_b(table[32][n]);
delay_us(100); //160useg cada pixel horizontal
}
delay_us(600); //pausa entre digitost
output_b(0x00);
delay_us(600); //pausa entre digitos
}
void hora()
{
caracter(h);
doispontos();
caracter(m);
doispontos();
caracter(s);
}
void data()
{
caracter(dia);
barra();
caracter(mes);
barra();
caracter(ano);
}
void main() { //bucle principal
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configurao do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036);
enable_interrupts(INT_TIMER1); //Habilita interrupo timer1
enable_interrupts(global); //habilita interrupco global
set_tris_b(0);
a=0;
while (1) {
output_high(pin_b0);
output_high(pin_b7);
if (!input(BOTAO1)) //Teste do boton.
{
delay_ms (300); //Para evitar retorno.
if (contador>2) //Se maior q 11, zera o contador.
{
contador=0;
}
contador++; //Incremento da varivel contador.
}
switch (contador) //Depois de incrementada, a varivel CONTADOR
{ //assume um dos casos a seguir:
case 1: //Menu de ajuste da HORA.
{
output_low(pin_b7);
if (!input (BOTAO_INCREMENTO)) //Incrementa a varivel H(hora).
{
delay_ms (300);
h++;
if (h>23) //Se a hora for maior que 23, reset.
{
h=0;
}
}
if (!input (BOTAO_DECREMENTO)) //Decrementa a varivel H(hora).
{
delay_ms (300);
h--;
if (h==255) //H uma varivel inteira de 8 bits.
{ //Quando decrementada para um valor
h=23; //menor que zero, se torna 255. Ou seja,
} //deve voltar para 23.
}
q=0; //Quando se est em algum menu, Q resetada. //Mantenha na tela.
break;
}
case 2: //Menu de ajuste do MINUTO. Idem ao anterior.
{
output_high(pin_b7);
output_low(pin_b7);
output_high(pin_b7);
if (!input (BOTAO_INCREMENTO))
{
delay_ms (300);
m++;
if (m>59) //Diferente aqui.
{
m=0;
}
}
if (!input (BOTAO_DECREMENTO))
{
delay_ms (300);
m--;
if (m==255) //Igual aqui.
{
m=59;
}
}
q=0;
break;
}
default: //Menu principal. Mostra todas as informações.
{
s=q/2; //A variável Q incrementa a 2Hz, então os segundos
//devem ser a metade.
if (s==60) //Se for igual a 60, reset em Q e S. M incrementa.
{
q=0;
s=0;
m++;
}
if (m>59)
{
m=0;
h++;
}
if (h>23) //Se H(horas) for maior q 23, reset. DIA DA SEMANA
{ //e DIA DO MÊS incrementam.
h=0;
}
while(input(pin_a3)) { //so rodoa se pinoa3 =1
delay_ms(10);
output_high(pin_b0);
output_high(pin_b7);
hora();
}
}
}
}
}
ME AJUDEM! <3