#include <EEPROM.h>
byte bandera=0;
byte puls2=2;
byte puls3=3;
byte valor=0;
int conteo=0;
int pulso=0;
int unidad=0;
int decena=0;
int centena=0;
int unidad_m=0;
int limite;
//matrix segmentos
byte Num[10]={
0x40, //0b0000001//N°0
0x79, //N°1
0x24, //N°2
0x30, //N°3
0x19, //N°4
0x12, //N°5
0x02, //N°6
0x78, //N°7
0x00, //N°8
0x10 //N°9
};
void setup() {
TCCR1A=0;
TCCR1B=(1<<CS12)|(1<<CS10)|(1<<WGM12);
OCR1A=62500;
TIMSK1=(1<<OCIE1A);// HABILITA LA INTERRUPCION POR COMPARACION
//declaramos pines de salida entradas
DDRC=B00001111;
DDRB=B00001111;//1 es salida 0 entrada
DDRD=B11110000;
DDRD|=B00000001;// salida alarma
ADMUX|=B00000101;//declaramos A5
ADMUX|=B01000000;// referencencia de default
ADCSRA|=B11000000;// inicia la conversion ADC
DIDR0|=B00100000;//
//PCICR |= 0b00000100;
//declaramos pulsadores
pinMode(puls2, INPUT_PULLUP);
pinMode(puls3, INPUT_PULLUP);
// interrupciones
//attachInterrupt(1,BMP,FALLING);
attachInterrupt(0,suma,FALLING);
attachInterrupt(1,resta,FALLING);
limite=EEPROM.read(0);
if( limite<60 || limite>100){
limite=60;
}
}
void loop() {
visualiza();
BMP();
}
void BMP(){// lectura ADC
int lectura=analogRead(A5);
if(lectura>600 && bandera==0){
pulso++;
bandera=1;
}
if(lectura<600 && bandera==1){
bandera=0;
}
}
ISR(TIMER1_COMPA_vect){// tiempo
conteo++;
if(conteo==5){
operacion();
pulso=0;
conteo=0;
}
}
void suma(){
if(limite<90){
limite++;
EEPROM.write(0,limite);
}
decena=limite/10;
unidad=limite % 10;
}
void resta(){
if(limite>59){
limite--;
EEPROM.write(0,limite);
}
decena=limite/10;
unidad=limite% 10;
visualiza();
}
void operacion (){//operacion
pulso*=3;
if(pulso<limite || pulso>100){ //aviso si de mal ritmo cardiaco
PORTD|=B00000001;
}else{
PORTD&=B11111110;
}
if(pulso>99){
centena=pulso/100;
decena=(pulso-100)/10;
unidad=pulso % 10;
}
else{
centena=0;
decena=pulso/10;
unidad=pulso % 10;
}
}
void visualiza () {
mostrarnum(unidad);
activadig(3);
mostrarnum(decena);
activadig(2);
mostrarnum(centena);
activadig(1);
mostrarnum(0);
activadig(0);
}
void mostrarnum(int numero) { // se imprime los segmentos
valor = Num[numero]; // Cambiado el índice a Num[9] para el último número
PORTD = (valor<<4) | (PORTD&0xF);
PORTB=valor>>4;
}
void activadig(int digito)
{
PORTC = 1<<digito;
delay(5);
PORTC=(0x00); //limpieza de digitos
}