Ir ao conteúdo
  • Cadastre-se

Cronômetro com menu PIC18F4550 utilizando C18


Ir à solução Resolvido por henriquemati,

Posts recomendados

bom galera preciso de uma ajuda de você's ,estou tentando fazer o seguinte:

 

realizar um cronometro para 12 horas com os segundos suprimidos,onde apertando um botao chamado ''B1'' deverá acrescentar as horas na contagem
e apertando um botao ''B4'' deverá mudar para o ajuste dos minutos
e o mesmo botao 'B1' deverá acrescentar a contagem em minutos
apertando ''B4'' novamente deverá fazer com que o contador decresça ate zerar o mesmo;
fazendo com que o cronometro apite um buzzer e pisque 4 leds em lados extremos da placa 
indicando quando o tempo se encontrará esgotado.
 
o display deverá ser multiplexado*
o microcontrolodador deverá ser o pic 18f4550*
e o compilador deverá obrigatoriamente ser o MPLAB C18*
 
//////////////////////////////////////////////////////////////////////////////
 
bom galera agradeço dês já qualquer ajuda para que eu consiga concluir minha programação no C18!!
 
a minha PROG sem o menu ficou assim (já que não consegui fazer o menu) e o arquivo rar. contém o arquivo cof. e o hex.:
 
//**************************************************************************************************************************
 
//realizar um cronometro para 12 horas como descrito no bloco de notas na area de trabalho
 
//**************************************************************************************************************************
 
//inclui as bibliotecas
#include <p18f4550.h>     //biblioteca padrão do microcontrolador
#include <delays.h>      // biblioteca padrão do microcontrolador
#include <reset.h> //biblioteca do rester por instrução do microcontrolador
 
//**************************************************************************************************************************
 
//define as configuraçoes do microcontrolador
#pragma config WDT = OFF        //cao de guarda do tempo reseta pic caso demore para executar uma istrução
#pragma config PWRT = ON        //espera o clock instabilizar para inicializar
#pragma config BOR = OFF       //brown-on-reset habilita o resset por baixa tensão
#pragma config BORV = 0       //tensão de reset do brown-on-reset
#pragma config LVP = OFF   //programa de tensão baixa para executar com o pic
#pragma config MCLRE = ON //desabilita o pino master-clear
 
//**************************************************************************************************************************
 
//define os nomes aos pinos das entradas
#define B1 PORTAbits.RA0 //botao
#define B2 PORTAbits.RA1 //botao
#define B3 PORTAbits.RA2 //botao
#define B4 PORTAbits.RA3 //botao
#define B5 PORTAbits.RA4 //botao
 
//**************************************************************************************************************************
 
//define os nomes dos pinos das saidas
#define D1 PORTCbits.RC4 //display multiplexado
#define D2 PORTCbits.RC5 //display multiplexado
#define D3 PORTCbits.RC6 //display multiplexado
#define D4 PORTCbits.RC7 //display multiplexado
#define DZ1 PORTEbits.RE0 //buzzer
#define DZ2 PORTEbits.RE1 //leds
 
//**************************************************************************************************************************
//define os valores de variaveis decrescentes
unsigned char decrescente[10] = {0x67,0x7F,0x07,0x7C,0x6D,0x66,0x4F,0x5B,0x06,0x3F}; //vetor de 9 a 0
unsigned char dezena[3] = {0x06,0x3F,0x3F}; //vetor de 1 ate 9 zeros
unsigned char unidade[13] = {0x5B,0x06,0x3F,0x67,0x7F,0x07,0x7C,0x6D,0x66,0x4F,0x5B,0x06,0x3F}; //vetor de 2 a 0 e sequencia de 9 a 0
unsigned char minutos[6] = {0x6D,0x66,0x4F,0x5B,0x06,0x3F}; //vetor de 5 a 0
//**************************************************************************************************************************
//define os valores das variaveis crescentes
unsigned char crescente[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67}; //vetor de 0 a 9
unsigned char deze[3] = {0x5B,0x3F,0x06}; //2 a 0
unsigned char min[6] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D}; //0 a 5
unsigned char uni[13] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67,0x3F,0x06,0x5B}; //vetor de 0 a 9 e sequencia de 0 a 2
//**************************************************************************************************************************
//defindo os tipos de variaveis as letras
unsigned int a,b,c,d,e,f,g,select,s,t,u,v,w,x,y,z,cont;
//************************************************************************************************************************** //variaveis do tipo int
 
 
void delay() //menu do atraso de varredura
{
Delay1KTCYx(2);
}
 
//**************************************************************************************************************************
 
void atraso() //menu de atraso de piscarem os leds quando se esgota a contagem
{
Delay10KTCYx(10);
}
 
//**************************************************************************************************************************
 
void contagem() //menu de contagem decrescente das horas e minutos
{
if(select>2) //for de seleção
{
for(w=a;w<2;w++) //horas unidade exibiçao
{
       for(x=b;x<13;x++) //horas unidade exibiçao
   {
    for(y=c;y<6;y++) //minutos completos exibiçao
     {
      for(z=d;z<10;z++) //segundos completos nao exibidos
       { 
   cont=0;
   while(cont<13)
            {
PORTD = dezena[w]; //horas dezena
D1 = 1;
delay();
       D1 = 0;
  delay();
PORTD = unidade[x]; //horas unidade
       D2 = 1;
delay();
       D2 = 0;
  delay();
PORTD = minutos[y]; //minutos completos
       D3 = 1;
delay();
       D3 = 0;
delay();
       PORTD = decrescente[z]; //segundos completos
       D4 = 1;
delay();
       D4 = 0;
cont++;
if(x>2) //garante a variavel w nao mude da posição do vetor
{
w=2;
}
            }
       }
      }
    }
  }
while(1) //looping infito do alerta para piscarem todos os display no final da contagem
{
PORTD = 0x3F;
D1 = 1;
D2 = 1;
D3 = 1;
D4 = 1;
atraso();
PORTD = 0x3F;
D1 = 0;
D2 = 0;
D3 = 0;
D4 = 0;
atraso();
PORTD = 0x3F;
D1 = 1;
D2 = 1;
D3 = 1;
D4 = 1;
atraso();
PORTD = 0x3F;
D1 = 0;
D2 = 0;
D3 = 0;
D4 = 0;
}
}
}
 
//**************************************************************************************************************************
 
void main() //menu principal de funçoes do pic
{
/////////////////////
 
//TRIS define se os pinos serão entradas ou saídas
TRISA = 0xFF;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISEbits.TRISE0 = 0;
 
/////////////////////
 
//PORT define qual sera o nivel lógico que derao começar os pinos ou ports
        PORTA = 0xFF;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTEbits.RE0 = 0;
 
////////////////////
 
//define entradas analógicas ou digitas desabilitando os resistores de pull-up
ADCON1 = 0x0F;
 
///////////////////
 
//variaveis
select = 0; //define a mudança de menu
//////////////////
s = 0; //=a
t = 0; //=b
u = 0; //=c
v = 0; //=d
/////////////////
w = 0; //horas dezena
x = 0; //horas unidade
y = 0; //minutos completos
z = 0; //segundos completos
cont = 0; //define o tempo
////////////////
a = 0; //=s
b = 0; //=t
c = 0; //=u
d = 0; //=v
///////////////////
 
  while(1)
  {
  contagem();
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(!B4) //botao acrescentar
{
while(!B4); //intertravamento do botao
select++; //seleciona o menu entre ajuste de horas minutos e inicio da contagem
}
 }
}
 
//**************************************************************************fim do programa******************************************************************************************
 

MPlab C18 Programações.rar

post-694778-0-79954800-1408976591_thumb.

MPlab C18 Programações.rar

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...
  • Solução

ae galera consegui terminar o cronômetro com menu aqui ,mesmo que nao obtive respostas agradeço,e mudei muita coisa da minha prog antiga no C18,....ela ficou assim:

 

//**************************************************************************************************************************
//realizar um cronometro para 12 horas como descrito no bloco de notas na area de trabalho
 
//**************************************************************************************************************************
 
//inclui as bibliotecas
#include <p18f4550.h>     //biblioteca padrão do microcontrolador
#include <delays.h>      // biblioteca padrão dos delays
 
//**************************************************************************************************************************
 
//FOSC = 4MHz
//define as configuraçoes do microcontrolador
#pragma config WDT = OFF       //cao de guarda do tempo reseta pic caso demore para executar uma istrução
#pragma config PWRT = ON      //espera o clock instabilizar para inicializar
#pragma config BOR = OFF     //brown-on-reset habilita o resset por baixa tensão
#pragma config BORV = 0    //tensão de reset do brown-on-reset
#pragma config LVP = OFF //programa de tensão baixa para executar com o pic
#pragma config MCLRE = OFF //desabilita ou habilita o pino master-clear
#pragma config PBADEN = OFF
#pragma config STVREN = OFF
 
 
//**************************************************************************************************************************
 
//define os nomes aos pinos das entradas
#define B1 PORTAbits.RA0 //botao
#define B2 PORTAbits.RA1 //botao
#define B3 PORTAbits.RA2 //botao
#define B4 PORTAbits.RA3 //botao
 
//**************************************************************************************************************************
 
//define os nomes dos pinos das saidas
#define D1 PORTBbits.RB0 //display multiplexado
#define D2 PORTBbits.RB1 //display multiplexado
#define D3 PORTBbits.RB2 //display multiplexado
#define D4 PORTBbits.RB3 //display multiplexado
#define D5 PORTBbits.RB4 //display multiplexado
#define D6 PORTBbits.RB5 //display multiplexado
#define DP PORTDbits.RD7 //aciona o decimal-point dos displays
 
#define LED PORTBbits.RB6 //LED
#define BZ PORTBbits.RB7 //BUZZER
 
unsigned char horasdezena[13] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67,0x3F,0x06,0x5B};
unsigned char crescente[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67};
unsigned char dezena[6] = {0x6D,0x66,0x4F,0x5B,0x06,0x3F};
 
//*******************************************************
 
unsigned char varu[2] = {0x3F,0x06};
unsigned char varv[13] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67,0x3F,0x06,0x5B};
unsigned char varw[6] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D};
unsigned char varx[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67};
unsigned char vary[6] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D};
unsigned char varz[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x67};
 
int reset,enter,a,b,c,d,u,v,w,x,y,z,cont;
 
//*******************************************************
 
void delay() //atraso do multiplex
{
Delay1KTCYx(2);
}
 
//*******************************************************
 
void atraso() //atraso do efeito final
{
Delay10KTCYx(50);
}
 
//*******************************************************
 
void geral() //menu do menu e da contagem
{
switch(enter) //switch como menu principal das opções
{
 
case 0: //caso da introdução
 
while(cont<100)
{
 
LED = 0;
 
PORTD = 0x3F; //letra O
D1 = 1;
delay();
D1 = 0;
PORTD = 0x39; //letra c + DP
DP = 1;
D2 = 1;
delay();
D2 = 0;
PORTD = 0x5B; //n 2
D3 = 1;
delay();
D3 = 0;
PORTD = 0x3F; //n 0
D4 = 1;
delay();
D4 = 0;
PORTD = 0x06; //n 1
D5 = 1;
delay();
D5 = 0;
PORTD = 0x6D; //n 5
D6 = 1;
delay();
D6 = 0;
cont++;
 
if(!B1) //função para mudar de caso
{
while(!B1); //intertravamento do botao
enter++;
cont = 100;
}
 
if(!B2) //função para mudar de caso
{
while(!B2); //intertravamento do botao
enter++;
cont = 100;
}
 
}
 
cont = 0;
 
if(!B1) //função para mudar de caso
{
while(!B1); //intertravamento do botao
enter++;
}
 
if(!B2) //função para mudar de caso
{
while(!B2); //intertravamento do botao
enter++;
}
 
cont=0;
 
break;
 
//*******************************************************
 
case 1: //caso da mudança das horas
 
LED = 1;
 
PORTD = varu[a];
D1 = 1;
delay();
D1 = 0;;
PORTD = varv;
D2 = 1;
delay();
D2 = 0;
PORTD = varw[w];
D3 = 1;
delay();
D3 = 0;
PORTD = varx[x];
D4 = 1;
delay();
D4 = 0;
PORTD = vary[y];
D5 = 1;
delay();
D5 = 0;
PORTD = varz[z];
D6 = 1;
delay();
D6 = 0;
 
if(!B1) //otao de ajuste dos valores da variavel
{
while(!B1); //intertravamento do botao
b--;
}
 
if(b<10)
{
a=0;
}
 
if(b<0)
{
b=12;
a=1;
}
 
if(!B2) //botao para a mudança do caso
{
while(!B2); //intertravamento do botao
enter++;
}
 
break;
 
//*******************************************************
 
case 2: //caso do ajuste dos minutos
 
LED = 1;
 
PORTD = varu[a];
D1 = 1;
delay();
D1 = 0;;
PORTD = varv;
D2 = 1;
delay();
D2 = 0;
PORTD = varw[c];
D3 = 1;
delay();
D3 = 0;
PORTD = varx[d];
D4 = 1;
delay();
D4 = 0;
PORTD = vary[y];
D5 = 1;
delay();
D5 = 0;
PORTD = varz[z];
D6 = 1;
delay();
D6 = 0;
 
if(!B1) //botao do ajuste da variavel
{
while(!B1);
d--;
}
if(c<0)
{
c=5;
d=9;
}
 
if(d<0)
{
c--;
d=9;
}
 
if(!B2) //botao para a mudança do caso
{
while(!B2); //intertravamento do botao
enter++;
d--;
}
 
break;
 
//*******************************************************
 
case 3: //caso da contagem dos valores selecionados
 
LED = 0;
 
for(u=a;u>=0;u--) //variavel horas dezena - a
{
for(v=b;v>=0;v--) //variavel horas unidade - b
{
BZ = 1;
 for(w=c;w>=0;w--) //variavel minutos dezena - c
 {
  for(x=d;x>=0;x--) //variavel minutos unidade - d
  {
for(y=5;y>=0;y--) //variavel segundos dezena
{
for(z=9;z>=0;z--) //variavel segundos unidade
{
BZ = 0;
 
while(cont<28) //travamento do tempo
{
 
if(!B4) //botao de reinicio da contagem
{
return geral();
}
LED = 0;
 
PORTD = varu;
D1 = 1;
delay();
D1 = 0;;
PORTD = varv[v];
 
LED = 0;
 
D2 = 1;
delay();
D2 = 0;
PORTD = varw[w];
D3 = 1;
delay();
D3 = 0;
PORTD = varx[x];
 
LED= 1;
 
D4 = 1;
delay();
D4 = 0;
PORTD = vary[y];
D5 = 1;
delay();
D5 = 0;
PORTD = varz[z];
 
LED = 1;
 
D6 = 1;
delay();
D6 = 0;
cont++; //variavel para determinar os segundos
 
//***** PAUSA ******
 
if(!B3) //botao da pausa na contagem
{
while(!B3)
{
 
LED = 1;
BZ = 1;
 
PORTD = varu;
D1 = 1;
delay();
D1 = 0;;
PORTD = varv[v];
D2 = 1;
delay();
D2 = 0;
PORTD = varw[w];
D3 = 1;
delay();
D3 = 0;
PORTD = varx[x];
D4 = 1;
delay();
D4 = 0;
PORTD = vary[y];
D5 = 1;
delay();
D5 = 0;
PORTD = varz[z];
D6 = 1;
delay();
D6 = 0;
}
 
}
}
cont=0; //reset da variavel que determina dos segundos
}
}
}
}
}
}
 
LED = 0;
enter++; //apos a contagem muda para o caso final
 
break;
 
//*******************************************************
 
case 4: //caso final do menu
 
while(1)
{
 
LED = 1; //LED's
BZ = 1; //Buzzer
 
PORTD = 0x79; //letra E
D1 = 1;
delay();
D1 = 0;;
PORTD = 0x54; //letra N
D2 = 1;
delay();
D2 = 0;
PORTD = 0x5E; //letra D
BZ = 0; //Buzzer
D3 = 1;
delay();
D3 = 0;
PORTD = 0x00;
DP = 1; //decimal-point
D4 = 1;
delay();
D4 = 0;
PORTD = 0x00;
BZ = 1; //Buzzer
DP = 1; //decimal-point
D5 = 1;
delay();
D5 = 0;
PORTD = 0x00;
DP = 1; //decimal-point
D6 = 1;
delay();
D6 = 0;
 
if(!B4)
{
while(!B4);
break;
}
}
 
reset = 0; //zera a variavel reset
enter = 0; //zera a variavel enter
 
break;
 
}
}
 
 
void main() //menu principal de funçoes do pic
{
/////////////////////
 
//TRIS define se os pinos serão entradas ou saídas
TRISA = 0xFF;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISE = 0x00;
 
/////////////////////
 
//PORT define qual sera o nivel lógico que derao começar os pinos ou ports
        PORTA = 0xFF;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;
 
////////////////////
 
//define entradas analógicas ou digitas desabilitando os resistores de pull-up
ADCON1 = 0x0F;
 
///////////////////
//variaveis
reset = 0;
enter = 0;
w=0;
x=0;
y=0;
z=0;
//********************
 
a=1;
b=12;
c=5;
d=9;
 
 
  while(1)
  {
geral();
  }
}
Link para o comentário
Compartilhar em outros sites

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