DUIMOMETER‎ > ‎

Duimometer.ino

#include "Duimometer.h"
/**
+--------------------+
|     A=3210987654321|
|        E=0987654321|
|          C=87654321|
|Duimometer         ^|
+--------------------+

+--------------------+
|     A=3210987654321|
| E=0987654321       |cff
|  FELIX   C=87654321|
|Duimometer  ^       |
+--------------------+
 */
byte REG_ENTER[MAX_ENTER];
byte REG_ACCUM[MAX_ACCUM];
byte REG_COUNT[MAX_COUNT];
byte POS=0;

boolean ZERO_COUNTER=true;
boolean POSITIVE_FIRST=true;

/**
 Incrementa un valor en cualquier posición a un registro
   value Valor a incrementar
   reg   Registro byte[]
   pos   Posición donde se incrementa
   len   Tamaño del registo
 */
void increment(byte value, byte* reg, int pos, int len){
  increment(value, reg, pos, len, false);
}
void increment(byte value, byte* reg, int pos, int len, boolean nocarry){
  if(pos >= len){
    if( value>0 ){
        // OVERFLOW
       overflowSignal();
    }
    return;
  }
  
  byte    suma  = reg[pos] + value;
  byte    digit = (suma%(byte)10);
  boolean carry = (suma >= 10);
  reg[pos] = digit;
  if(carry && !nocarry){
    increment((byte)1, reg, pos+1, len);
  }
}
/**
 Decrementa un valor en cualquier posición a un registro
   value Valor a restar
   reg   Registro byte[]
   pos   Posición donde se resta
   len   Tamaño del registo
 */
void decrement(byte value, byte* reg, int pos, int len){
  if(pos >= len){
    if( value>0 ){
        // OVERFLOW
       overflowSignal();
    }
    return;
  }
  
  if(value > reg[pos]){
    reg[pos] = ((reg[pos]+(byte)10)-value)%10;
    decrement((byte)1, reg, pos+1, len);
  }else{
    reg[pos] = reg[pos]-value;
  }
}

/**
 Pone a cero un registro
   reg   Registro byte[]
   len   Tamaño del registo 
 */
void zero(byte* reg, int len){
  for(int i=0; i= 0){
      //Serial.print("====>");
      //Serial.println(key, DEC);
      
      if( E01 <= key && key <= E10){
        int pos = key-1;
        increment((byte)1, REG_ENTER, pos, MAX_ENTER, true);
      }else if(key==CLR_E){
        zero(REG_ENTER, MAX_ENTER);
      }else if(key==CLR_A){
        zero(REG_ACCUM, MAX_ACCUM);
      }else if(key==CLR_C){
        zero(REG_COUNT, MAX_COUNT);
        ZERO_COUNTER=true;
      }else if(key == LEFT){
        POS++;
        if(POS >= MAX_COUNT){
          POS = MAX_COUNT-1;
        }
      }else if(key == RIGH){
        if(POS > 0){
           POS--;
        }
      }else if(key==POSIT){
        for(int i=0; i
Comments