#include <Arduino.h>
const uint8_t CLK_CYCLE_DELAY = 100;// us
const uint8_t CLK_PIN = 3;
const uint8_t DIO_PIN = 2;
const uint8_t NUM_DIGITS = 4;
uint8_t buffer[NUM_DIGITS+1] = {0xC0, 0x07, 0x07, 0x07, 0x07}; // first byte will be the register address
// LED segment patterns.
const uint8_t NUM_PATTERNS = 10;
const uint8_t PATTERNS[NUM_PATTERNS] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
};
void setDataPin(uint8_t _bit){
digitalWrite(DIO_PIN,_bit);
}
void setClkPint(uint8_t _bit){
digitalWrite(CLK_PIN,_bit);
}
void sleep(int sleep){
delayMicroseconds(sleep);
}
void start() {
setDataPin(0);
sleep(CLK_CYCLE_DELAY);
setClkPint(0);
sleep(CLK_CYCLE_DELAY);
}
void stop() {
setDataPin(0);
sleep(CLK_CYCLE_DELAY);
setClkPint(1);
sleep(CLK_CYCLE_DELAY);
setDataPin(1);
}
void writeByte(uint8_t _byte){
for(uint8_t i=0;i<8;i++){
setDataPin(_byte >> i & 0x01) ;
sleep(CLK_CYCLE_DELAY);
setClkPint(1);
sleep(CLK_CYCLE_DELAY);
setClkPint(0);
sleep(CLK_CYCLE_DELAY);
}
setClkPint(0);
sleep(CLK_CYCLE_DELAY);
setClkPint(1);
sleep(CLK_CYCLE_DELAY);
setClkPint(0);
sleep(CLK_CYCLE_DELAY);
}
void writeDataCmd(uint8_t cmd){
start();
writeByte(cmd);
stop();
}
void sendByteStream(uint8_t *bytes,uint8_t len) {
writeDataCmd(0x40);
start();
for(uint8_t i=0;i<len;i++){
writeByte(bytes[i]);
}
stop();
}
void displayCount(int count){
for(uint8_t i=0;i<NUM_DIGITS;i++){
uint8_t digit = count % 10;
count = count/10;
buffer[NUM_DIGITS - i] = PATTERNS[digit];
}
sendByteStream(buffer,NUM_DIGITS+1);
}
void setup() {
Serial.begin(115200);
Serial.println("TM1637 Demo");
pinMode(CLK_PIN,OUTPUT);
pinMode(DIO_PIN,OUTPUT);
stop();
// switch on the display
//uint8_t displayControlCmd[1]={0x8F};// display on with full brightness
//sendByteStream(displayControlCmd,1);
//sendByteStream(buffer, 5);
start();
writeByte(0x40);
stop();
start();
writeByte(0x8F);
stop();
start();
writeByte(0x40);
stop();
start();
writeByte(0xC0);
writeByte(0x07);
writeByte(0x07);
writeByte(0x07);
writeByte(0x07);
stop();
}
void loop() {
//displayCount(millis()/1000);
//delay(100);
}