#include <TimerOne.h>
int numero = 0;
#define CANTIDAD_DIGITOS 2
#define COLUMNA2 9
#define COLUMNA1 11
#define SEGMENTOA 10
#define SEGMENTOB 2
#define SEGMENTOC 3
#define SEGMENTOD 4
#define SEGMENTOE 5
#define SEGMENTOF 6
#define SEGMENTOG 7
#define SEGMENTODP 8
char Buf[CANTIDAD_DIGITOS];
// Tabla de conversion bcd a 7 segmentos
// Codigo bcd dp a b c d e f g
// 0 0 1 1 1 1 1 1 0
// 1 0 0 1 1 0 0 0 0
// 2 0 1 1 0 1 1 0 1
// 3 0 1 1 1 1 0 0 1
// 4 0 0 1 1 0 0 1 1
// 5 0 1 0 1 1 0 1 1
// 6 0 0 0 1 1 1 1 1
// 7 0 1 1 1 0 0 0 0
// 8 0 1 1 1 1 1 1 1
// 9 0 1 1 1 0 0 1 1
// 0 1 2 3 4 5 6 7 8 9
const char Tabla_Digitos_BCD_7seg[] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x1f, 0x70, 0x7f, 0x73};
char Indice = 0;
void setup() {
Serial.begin(9600);
DISPLAY7SEG_Init();
SetTimer();
}
void loop() {
Display_YA(numero);
Serial.println("");
}
//----------------------------- RUTINA DE MANEJO DISPLAY
void DISPLAY7SEG_Init(void)
{
pinMode(COLUMNA1, OUTPUT);
pinMode(COLUMNA2, OUTPUT);
pinMode(SEGMENTOA, OUTPUT);
pinMode(SEGMENTOB, OUTPUT);
pinMode(SEGMENTOC, OUTPUT);
pinMode(SEGMENTOD, OUTPUT);
pinMode(SEGMENTOE, OUTPUT);
pinMode(SEGMENTOF, OUTPUT);
pinMode(SEGMENTOG, OUTPUT);
pinMode(SEGMENTODP, OUTPUT);
}
void Display_YA(int dato)
{
for(int i = 0 ; i < CANTIDAD_DIGITOS ; i++)
{
Buf[i] = Tabla_Digitos_BCD_7seg[dato % 10];
dato /= 10;
}
}
// Llamar dentro de SystickHandler (1ms)
void DISPLAY7SEG_Barrido(void)
{
// Borro todo
digitalWrite(COLUMNA1, 1);
digitalWrite(COLUMNA2, 1);
// Escribo Dato
DISPLAY_EscriboDato(Buf[Indice]);
// Seleccion Columna
switch(Indice)
{
case 0:
digitalWrite(COLUMNA1, 0);
break;
case 1:
digitalWrite(COLUMNA2, 0);
break;
}
// Paso al siguiente digito
Indice++;
if(Indice >= CANTIDAD_DIGITOS)
Indice = 0;
}
void DISPLAY_EscriboDato(char Codigo)
{
// 1 0 0 1 1 0 0 0 0
digitalWrite(SEGMENTOG, ((Codigo >> 0) & 1)); //0 0 1 1 0 0 0 [0]
digitalWrite(SEGMENTOF, ((Codigo >> 1) & 1)); //0 0 1 1 0 0 [0]
digitalWrite(SEGMENTOE, ((Codigo >> 2) & 1)); //0 0 1 1 0 [0]
digitalWrite(SEGMENTOD, ((Codigo >> 3) & 1)); //0 0 1 1 [0]
digitalWrite(SEGMENTOC, ((Codigo >> 4) & 1)); //0 0 1 [1]
digitalWrite(SEGMENTOB, ((Codigo >> 5) & 1)); //0 0 [1]
digitalWrite(SEGMENTOA, ((Codigo >> 6) & 1)); //0 [0]
digitalWrite(SEGMENTODP, ((Codigo >> 7) & 1)); //[0]
}
//----------------------- MANEJO TIMER Y Systick Handler
void SetTimer(void){
Timer1.initialize(1000);
Timer1.attachInterrupt(Systick_Handler);
}
void Systick_Handler(void){
// Aca entro cada 1 miliseg
DISPLAY7SEG_Barrido();
static int divisor = 1000;
divisor--;
if(divisor == 0)
{
divisor = 1000;
// Aca entro cada 1 seg
numero++;
if(numero > 99)
numero = 0;
}
}