Fórum

CONTADOR DIGITAL UP...
 
Notifications
Clear all

CONTADOR DIGITAL UP/DOWN – COM PIC 16F628A (REF308)

3 Posts
2 Users
0 Likes
2,036 Leituras
(@sandro)
New Member
Joined: 12 anos ago
Posts: 2
Topic starter  

Olá, Claudio.

boa tartde!

Claudio, ref(contador digital), estou tentando colocar 5 digitos mas não estou conseguindo.

Eu tirei o botão down, para colocar o 5 digito, VC pode me ajudar!!!

Obbrigado!

 


   
Quote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Acredito que vá mudar o contador para uma necessidade que talvez tenha. Logicamente deverá fazer adições ao programa que desconheço, mas poderá tentar algo assim:

//***************************************************************************
//
// CONTADOR UP/EEP C/RELE
//
// UTILIZA PIC 16F628A E 5 DISPLAY DE 7 SEGUIMENTOS
//
//
// AUTOR : CLAUDIO LARIOS
//
// data: 16/08/2019
//
// Uso didático
//
// Blog PICSOURCE (LARIOS.TECNOLOGIA.WS)
//
//
***************************************************************************

// #DEFINE CATODO_COMUM //descomente p/ catodo comum e comente p/ anodo comum
//==============================================================================
#include <16F628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,NOMCLR
#use delay(clock=4000000) //tempo por instrução=1us
#rom 0x2100 = {0,0,0,0}
//bytes
#byte porta = 0x05
#byte portb = 0x06
#byte trisa = 0x85
#byte trisb = 0x86
#bit gie = 0x0b.7
#bit peie = 0x0b.6
#bit t0ie = 0x0b.5
//bits
#bit zerar = 0x05.5 //interruptor 'zerar'

#bit sw_up = 0x05.6 //interruptor 'up'
//#bit sw_down = 0x05.7 //interruptor 'down'
#bit sw_down = 0x05.7 //k4 (5º digito)

#bit power = 0x05.4 //sensor de falta de energia
#bit rele = 0x06.7 //saída do rele

//variavéis globais
//int dig3,dig2,dig1,dig0,mux,a;
int dig4,dig3,dig2,dig1,dig0,mux,a;//acrescenta var p/ 5º digito

// Tabela para retorno dos seguimentos correspondentes aos números 0-9
byte const tabela [] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

#define VALOR_DBC 230 //valor para debounce das chaves

//==============================================================================
// ROTINA DE INTERRUPÇÃO DO TIMER 0
//==============================================================================
#INT_TIMER0
//multiplexa display de 7 seg
void display_refress() {
// if(++mux>3){ mux=0;}
if(++mux>4){ mux=0;}//agora tem o 5º digito
porta=0; //apaga seguimentos para mudança
switch (mux) {
case 0:
portb&=0x80;
portb=portb|(0X7f & tabela[dig0]);
#IFDEF CATODO_COMUM
portb^=0x7f;
#ENDIF
porta=1;
break;
case 1:
if ((dig4)||(dig3)||(dig2)||(dig1)){
portb&=0x80;
portb=portb|(0X7f & tabela[dig1]);
#IFDEF CATODO_COMUM
portb^=0x7f;
#ENDIF
porta=2;
break;}
case 2:
if ((dig4)||(dig3)||(dig2)){
portb&=0x80;
portb=portb|(0X7f & tabela[dig2]);
#IFDEF CATODO_COMUM
portb^=0x7f;
#ENDIF
porta=4;
break;}
case 3:
if ((dig4||(dig3)){
portb&=0x80;
portb=portb|(0X7f & tabela[dig3]);
#IFDEF CATODO_COMUM
portb^=0x7f;
#ENDIF
porta=8;
break;}
//---------------------acrescentado para o quinto dígito
case 4:
if (dig4){
portb&=0x80;
portb=portb|(0X7f & tabela[dig4]);
#IFDEF CATODO_COMUM
portb^=0x7f;
#ENDIF
porta=128;//aciona pino 16 (PORTA.7)ou quinto ânodo/cátodo
break;}

}

}
//==============================================================================
// ROTINA DE INCREMENTO DA CONTAGEM
//==============================================================================

void incrementa() {
rele=1;
//limita em '99999'

if((dig0==9)&&(dig1==9)&&(dig2==9)&&(dig3==9)&&(dig4==9))return;

//incrementa a contagem
if(++dig0>9) {
dig0=0;
if(++dig1>9) {
dig1=0;
if(++dig2>9){
dig2=0;
if(++dig3>9){
dig4++;
dig3=0;
}
}
}
}

}
//==============================================================================
// ROTINA DE DECREMENTO DA CONTAGEM
//==============================================================================
void decrementa() {

if(!rele)return;
if(--dig0==0xff) {
dig0=9;
if(--dig1==0xff) {
dig1=9;
if(--dig2==0xff){
dig2=9;
if(--dig3==0xff){
dig3=9;
if(--dig4==0xff){
dig4=9;
}
}
}
}
}
if(!dig0 && !dig1 && !dig2 && !dig3 && !dig4){ rele=0;}//limita contagem em '00000'

}

//==============================================================================
// ROTINA DE TESTE DE FALTA DE TENSÃO DA REDE ELÉTRICA
//==============================================================================

void testa_power(){
if(!power){
t0ie=0;//desliga interrupção
porta=0;//salva energia dos capacitores da fonte desligando displays
portb=0;
write_eeprom(0,dig0); //salva valores do contador
write_eeprom(1,dig1);
write_eeprom(2,dig2);
write_eeprom(3,dig3);
write_eeprom(4,dig4);
while(!power)delay_ms(50);//caso queda muito rápida para resetar o pic
t0ie=1;//recupera após salvar
if(!dig4 && !dig3 && !dig2 && !dig1 && !dig0)rele=0; else rele=1;//retorna rele
}
}

//==============================================================================
// TESTA BOTÃO 'UP'
//==============================================================================
void testa_up(){
if(!sw_up) {
for(a=0;a<VALOR_DBC;A++){//debounce para botão apertado
testa_power();
if(sw_up) return;
}
incrementa();
for(a=0;a<VALOR_DBC;A++){//debunce ao soltar o botão
testa_power();
if(!sw_up)a=0;
}

}//inc
}
//
//___________________________________________________________
//Elimina este botão já que o port será usado como K4/A4
/*
TESTA BOTÃO 'DOWN'

void testa_down(){
if(!sw_down) {
for(a=0;a<VALOR_DBC;A++){//debounce para botão apertado
testa_power();
if(sw_down) return;
}
decrementa();
for(a=0;a<VALOR_DBC;A++){//enquanto botão ficar apertado
testa_power();
if(!sw_down)a=0;
}
}
}
______________________________________________________________
*/==============================================================================
// RESETAR CONTAGEM (ZERA SEM APAGAR TODOS DISPLAY COMO OCORRE EM UM 'RESET')
//==============================================================================
void testa_reset(){
if(!zerar) {
dig0=0; //zera contadores inicialmente
dig1=0;
dig2=0;
dig3=0;
dig4=0;
write_eeprom(0,0);
write_eeprom(1,0);
write_eeprom(2,0);
write_eeprom(3,0);
write_eeprom(4,0);
rele=0;
delay_ms(30);//aguarda
while(!zerar) delay_ms(30);//aguarda soltar botão
}
}

//==============================================================================
// ROTINA PRINCIPAL
//==============================================================================

void main() {
setup_comparator(NC_NC_NC_NC);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
setup_timer_1(T1_DISABLED);
#IFDEF CATODO_COMUM
portb&=0x80;
#ELSE
portb|=0X7F;
#ENDIF

porta=0;

trisb= 0b00000000; //sentido das portas
//trisa= 0b11110000;
trisa= 0b01110000; //agora porta.7 será uma saída
delay_ms(500);

dig0=read_eeprom(0);//recupera ultima contagem
if(dig0>9)dig0=0;
dig1=read_eeprom(1);
if(dig1>9)dig1=0;
dig2=read_eeprom(2);
if(dig2>9)dig2=0;
dig3=read_eeprom(3);
if(dig3>9)dig3=0;
dig4=read_eeprom(4);
if(dig4>9)dig4=0;

if(!dig0 && !dig1 && !dig2 && !dig3 && !dig4) rele=0; else rele=1;

t0ie=1;//habilita interrupções tmr0
gie=1; //habilita interrupções geral

//==============================================================================
// LOOP PRINCIPAL
//==============================================================================

for(;;) {
testa_reset();//testa botão de reset
testa_up();//testa botão de incremento
testa_down();//testa botão de decremento
testa_power();//testa se não acabou energia

}//while
}//main

 

Como o texto pode sofrer alguma alteração de caracteres  anexo o arquivo.


   
ReplyQuote
(@sandro)
New Member
Joined: 12 anos ago
Posts: 2
Topic starter  

Olá, Claudio.

boa noite!

Obrigado pela Atenção.

Verifiquei o codigo que vc me mandou, e deu certo.

Eu estava errando nessas linhas( porta=128;//aciona pino 16 (PORTA.7) eu tinha colocado;  porta=16).

A outra linha( trisa= 0b01110000; //agora porta.7 será uma saída( e essa tava; trisa= 0b11110000).

Mas graças a VC deu certo...Muito Obrigado!!!


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Olá Sandro!

Fico feliz por você!

Desejo sucesso em suas montagens!

 

 


   
ReplyQuote
Back To Top