///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Archivo que contiene las funciones requeridas para el manejo del display TM1637 en el sistema
// BOLT-PIC18F2550
//
// www.puntoflotante.net
//
// Funciones disponibles:
//
// void InitTM1637(unsigned char BRIGHT);
// void writeByte(unsigned char oneByte);
// void writeRawDigit(unsigned char segment, unsigned char nDigit);
// void displayValues(unsigned char segment0, unsigned char segment1,
// unsigned char segment2, unsigned char segment3);
//
//
// Programador: Moises Melendez, sesowm@hotmail.com
//
//
// void InitTM1637(unsigned char BRIGHT);
//
// Inicializa y ajusta el brillo del display TM1637 desde un mínimo a un máximo (0-7)
// Esta función debe llamarse antes que las siguientes, generalmente como parte de la
// configuración inical.
//
// void writeByte(unsigned char oneByte);
//
// Envía al display TM1637 un byte que puede ser un comando o un dato
//
// void writeRawDigit(unsigned char segment, unsigned char nDigit);
//
// Escribe el dato "segment" en 7 segmentos de acuerdo al siguiente orden:
//
// _a_
// | | MSB LSB
// f|_g_|b pgfedcba
// | |
// e| |c
// -d- p
//
// El dato es escrito en la posicion nDigit que corresponde al número de segmento
// en el display TM1637, solo para el dígito 1 existe la opción de encender el segmento p:
//
// ______________________
// | _ _ _ _ |
// | | | | | º | | | | |- CLK
// | - - - - |- DIO
// | |_| |_| º |_| |_| |- VCC
// |----------------------|- GND
// |______________________|
//
// 0 1 2 3 <-- segmentos
//
// El símbolo " : " entre los segmentos 1 y 2 corresponde al bit p del segmento 1
//
//
// void displayValues(unsigned char segment0, unsigned char segment1,
// unsigned char segment2, unsigned char segment3);
//
// Esta función escribe todos los segmentos en el orden en que se indican en los argumentos
// de la función, corresponden a datos en 7 segmentos.
//
//
// NOTA IMPORTANTE LOS SWITCHES SW3 Y SW4 DEBEN ESTAR EN LA POSICÓN OFF
//
///////////////////////////////////////////////////////////////////////////////////////////////////
#define CLK_LOW TRISCbits.TRISC0 = 0; PORTCbits.RC0=0
#define DIO_LOW TRISCbits.TRISC1 = 0; PORTCbits.RC1=0
#define CLK_HIGH TRISCbits.TRISC0 = 1
#define DIO_HIGH TRISCbits.TRISC1 = 1
#define LOW_BRIGHT 0X00
#define MID_BRIGHT 0X02
#define MAX_BRIGHT 0X07
void InitTM1637(unsigned char BRIGHT);
void Delay_us(unsigned int useconds);
void start(void);
void ask(void);
void stop(void);
void writeByte(unsigned char oneByte);
void writeRawDigit(unsigned char segment, unsigned char nDigit);
void displayValues(unsigned char segment0, unsigned char segment1, unsigned char segment2, unsigned char segment3);
//
// Inicializa y ajusta el brillo del display TM1637
void InitTM1637(unsigned char BRIGHT)
{
start();
writeByte(0x88 | BRIGHT);
ask();
stop();
}
//
// Función de retardos ajustada a los requerimientos de la comunicación con el display TM1637
void Delay_us(unsigned int useconds)
{
unsigned int i;
for(i=0; i < useconds; i++)
//Delay10TCYx(2);
Delay_us(2);
}
//
// Función que inicia la comunicación en el display TM1637
//
void start(void)
{
CLK_HIGH;
DIO_HIGH;
Delay_us(2);
DIO_LOW;
}
//
// Función que permite saber si el dato o comando enviado al display TM1637 ha sido recibido y
// procesado correctamente
//
void ask(void)
{
TRISCbits.TRISC1 = 1;
CLK_LOW;
Delay_us(5);
while(PORTCbits.RC1);
CLK_HIGH;
Delay_us(2);
TRISCbits.TRISC1 = 0;
CLK_LOW;
}
//
// Secuencia de paro, necesaria para el correcto funcionamiento del protocolo de comunicación
// con el display TM1637
//
void stop(void)
{
CLK_LOW;
Delay_us(2);
DIO_LOW;
Delay_us(2);
CLK_HIGH;
Delay_us(2);
DIO_HIGH;
}
//
// Envia por el pin DIO los bits de un byte, envia serialmente los datos
//
void writeByte(unsigned char oneByte)
{
unsigned char i;
for(i=0; i<8; i++)
{
CLK_LOW;
if(oneByte & 0x01)
DIO_HIGH;
else
DIO_LOW;
Delay_us(3);
oneByte = oneByte >> 1;
CLK_HIGH;
Delay_us(3);
}
}
//
// Esta función envía al módulo TM1637 un byte con la representación en 7 segmentos en la
// posción nDigit
//
void writeRawDigit(unsigned char segment, unsigned char nDigit)
{
start();
writeByte(0x44);
ask();
stop();
start();
writeByte(0xC0 | (nDigit & 0x07));
ask();
writeByte(segment);
ask();
stop();
}
//
// Envía 4 caracteres al módulo TM1637 desde la posición 0 hasta la 4 de los segmentos
//
void displayValues(unsigned char segment0, unsigned char segment1, unsigned char segment2, unsigned char segment3)
{
start();
writeByte(0x40);
ask();
stop();
start();
writeByte(0xC0);
ask();
writeByte(segment0);
ask();
writeByte(segment1);
ask();
writeByte(segment2);
ask();
writeByte(segment3);
ask();
stop();
}