/*
Raspberry Pi driving the TM1637
port from here
https://github.com/TinyTronics/TM1637_6D
cc -o tm1637-fix tm1637-fix.c -lwiringPi
*/
#include <stdio.h>
#include <stdint.h>
#include <wiringPi.h>
//0~9, 10=blank digit, 11=dash/minus character
static int8_t TubeTab[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x00, // space
0x40 //
dash(minus)
};
#define BLANK 10
#define DASH 11
int brightness;
int gpio_clk;
int gpio_dio;
#define CLK 9 //Pin#5
#define DATA 8 //Pin#3
//***** definitions for TM1637
#define ADDR_AUTO 0x40
#define ADDR_FIXED 0x44
//**** definitions for the clock point of the digit tube
#define POINT_ON 0x80
#define POINT_OFF 0x00
//**** definitions for brightness
#define BRIGHT_DARKEST 0
#define BRIGHT_TYPICAL 2
#define BRIGHTEST 7
static void bitDelay(void)
{
//delayMicroseconds(5);
delayMicroseconds(1);
}
//send segment signal to TM1637
static void writeByte(uint8_t wr_data)
{
uint8_t i;
// Sent 8bit
data
for(i=0;i<8;i++) {
digitalWrite(gpio_clk,LOW);
if(wr_data & 0x01)digitalWrite(gpio_dio,HIGH);//LSB
first
else digitalWrite(gpio_dio,LOW);
digitalWrite(gpio_clk,HIGH);
wr_data >>= 1;
delay(1);
}
digitalWrite(gpio_clk,LOW);
digitalWrite(gpio_dio,HIGH);
digitalWrite(gpio_clk,HIGH);
pinMode(gpio_dio,INPUT);
// Wait for ACK
int retry = 0;
while(1) {
uint8_t ack = digitalRead(gpio_dio);
// printf("ack[%d]=%d\n", retry, ack);
if (ack == 0) break;
retry++;
if (digitalRead(gpio_dio)) {
pinMode(gpio_dio,OUTPUT);
digitalWrite(gpio_dio, FALSE);
pinMode(gpio_dio,INPUT);
}
}
pinMode(gpio_dio,OUTPUT);
return;
}
//send start signal to TM1637
static void start(void)
{
digitalWrite(gpio_clk,HIGH);
digitalWrite(gpio_dio,HIGH);
digitalWrite(gpio_dio,LOW);
digitalWrite(gpio_clk,LOW);
}
//send end signal to TM1637
static void stop(void)
{
digitalWrite(gpio_clk,LOW);
digitalWrite(gpio_dio,LOW);
digitalWrite(gpio_clk,HIGH);
digitalWrite(gpio_dio,HIGH);
}
//convert numver tu tube data
static int8_t coding(int DispData, int DispPointData)
{
if(DispData ==
0x7f) DispData = 0x00 + DispPointData;//The bit digital
tube off
else DispData =
TubeTab[DispData] + DispPointData;
return
DispData;
}
void tm1637_begin(int Clk, int Data)
{
gpio_clk = Clk;
gpio_dio =
Data;
pinMode(gpio_clk,OUTPUT);
pinMode(gpio_dio,OUTPUT);
}
void tm1637_brightness(int Bright)
{
// Set the
brightness and it takes effect the next time it displays.
brightness =
0x88 + Bright;
}
void tm1637_display(int BitAddr,int DispData,int
DispPointData)
{
int8_t SegData;
SegData =
coding(DispData, DispPointData);
start();
writeByte(ADDR_FIXED);
stop();
start();
writeByte(BitAddr|0xc0);
writeByte(SegData);
stop();
start();
writeByte(brightness);
stop();
}
int main(void) {
if(wiringPiSetup() == -1) return 1;
// clock &
data pin
tm1637_begin(CLK, DATA);
// You can set
the brightness level from 0(darkest) till 7(brightest)
//
BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
tm1637_brightness(BRIGHT_TYPICAL);
// Clear all
segment
tm1637_display(2, BLANK, POINT_OFF);
tm1637_display(1, BLANK, POINT_OFF);
tm1637_display(0, BLANK, POINT_OFF);
delay(500);
int number;
int digit;
for
(number=0;number<12;number++) {
for (digit=0;digit<3;digit++) {
// We send the entire array to the display along with the
points array
tm1637_display(digit, number, POINT_OFF);
// Execute this loop every 300 milliseconds
delay(100);
}
delay(500);
}
tm1637_display(2, 3, POINT_OFF);
tm1637_display(1, 2, POINT_OFF);
tm1637_display(0, 1, POINT_OFF);
delay(500);
tm1637_display(2, 3, POINT_ON);
tm1637_display(1, 2, POINT_ON);
tm1637_display(0, 1, POINT_ON);
}
|