I2C led Display

From Pinguino
Jump to: navigation, search

Led alpha4digit.jpg

Example for the usage of a 4-digit alphanumeric led display with HT16k33 chip. It uses I2C to communicate.

The display address is 0x70. The segments are numbered as shown in the picture.

Led alphasegments.png

The state of a digit is stored in a 16-bit word with A being the lowest bit:

0 DP N M L K J H G2 G1 F E D C B A

e.g. 0x0100000011000000 lights up the decimal point and the two horizontal segments in the middle.

The display has 5 pins:

Pin name Top Label Function Pinguino pin
vi2c + i2c bus voltage +
VCC + LED supply voltage +
GND - ground -
SDA D i2c data 00
SCL C i2c clock 01

It has been tested with PIC18F45K50 pinguino kit

Version: 1.03 (9.10.2014)


/*-----------------------------------------------------
Author:  Dr. Mathias Wilhelm - http://www.mathias-wilhelm.de/arduino
Date: 2014-10-07
Description: 
    Drive a alphanumeric 4-digit led display with HT16k33 chip from adafruit
    display can be found at adafruit: http://www.adafruit.com/products/1911
    Code based on the Demo code from adafruit led backpack kit
    This code is only tested with the PIC18F45k50
Connection:
    Display | PIC18F45k50
    vi2c       +
    VCC        +
    GND        -
    SDA        00 (pin 33 of chip)
    SCL        01 (pin 34 of chip)
License:
    This code is free software; you can redistribute it and/or
    modify it under the terms of the CC BY-NC-SA 3.0 license.
-----------------------------------------------------*/
const u16 alphafonttable[] = {
0b0000000000000001,
0b0000000000000010,
0b0000000000000100,
0b0000000000001000,
0b0000000000010000,
0b0000000000100000,
0b0000000001000000,
0b0000000010000000,
0b0000000100000000,
0b0000001000000000,
0b0000010000000000,
0b0000100000000000,
0b0001000000000000,
0b0010000000000000,
0b0100000000000000,
0b1000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0000000000000000,
0b0001001011001001,
0b0001010111000000,
0b0001001011111001,
0b0000000011100011,
0b0000010100110000,
0b0001001011001000,
0b0011101000000000,
0b0001011100000000,
0b0000000000000000, //  
0b0000000000000110, // !
0b0000001000100000, // "
0b0001001011001110, // #
0b0001001011101101, // $
0b0000110000100100, // %
0b0010001101011101, // &
0b0000010000000000, // '
0b0010010000000000, // (
0b0000100100000000, // )
0b0011111111000000, // *
0b0001001011000000, // +
0b0000100000000000, // ,
0b0000000011000000, // -
0b0000000000000000, // .
0b0000110000000000, // /
0b0000110000111111, // 0
0b0000000000000110, // 1
0b0000000011011011, // 2
0b0000000010001111, // 3
0b0000000011100110, // 4
0b0010000001101001, // 5
0b0000000011111101, // 6
0b0000000000000111, // 7
0b0000000011111111, // 8
0b0000000011101111, // 9
0b0001001000000000, // :
0b0000101000000000, // ;
0b0010010000000000, // <
0b0000000011001000, // =
0b0000100100000000, // >
0b0001000010000011, // ?
0b0000001010111011, // @
0b0000000011110111, // A
0b0001001010001111, // B
0b0000000000111001, // C
0b0001001000001111, // D
0b0000000011111001, // E
0b0000000001110001, // F
0b0000000010111101, // G
0b0000000011110110, // H
0b0001001000000000, // I
0b0000000000011110, // J
0b0010010001110000, // K
0b0000000000111000, // L
0b0000010100110110, // M
0b0010000100110110, // N
0b0000000000111111, // O
0b0000000011110011, // P
0b0010000000111111, // Q
0b0010000011110011, // R
0b0000000011101101, // S
0b0001001000000001, // T
0b0000000000111110, // U
0b0000110000110000, // V
0b0010100000110110, // W
0b0010110100000000, // X
0b0001010100000000, // Y
0b0000110000001001, // Z
0b0000000000111001, // [
0b0010000100000000, // 
0b0000000000001111, // ]
0b0000110000000011, // ^
0b0000000000001000, // _
0b0000000100000000, // `
0b0001000001011000, // a
0b0010000001111000, // b
0b0000000011011000, // c
0b0000100010001110, // d
0b0000100001011000, // e
0b0000000001110001, // f
0b0000010010001110, // g
0b0001000001110000, // h
0b0001000000000000, // i
0b0000000000001110, // j
0b0011011000000000, // k
0b0000000000110000, // l
0b0001000011010100, // m
0b0001000001010000, // n
0b0000000011011100, // o
0b0000000101110000, // p
0b0000010010000110, // q
0b0000000001010000, // r
0b0010000010001000, // s
0b0000000001111000, // t
0b0000000000011100, // u
0b0010000000000100, // v
0b0010100000010100, // w
0b0010100011000000, // x
0b0010000000001100, // y
0b0000100001001000, // z
0b0000100101001001, // {
0b0001001000000000, // |
0b0010010010001001, // }
0b0000010100100000, // ~
0b0011111111111111,
};

boolean debug = true;
u8 i2cAddr = (0x70 << 1) & 0xFE;
u16 displaybuffer[8];
u8 initDone = 0;

boolean initDisplay(void){
    boolean status = true;
    if (debug) Serial.println("\n\rStarting I2C bus");
    if (debug) Serial.println("turn on oscillator");
    I2C.start();
    status &= I2C.write(i2cAddr);
    status &= I2C.send(0x21);
    I2C.stop();                                 // Terminate the write sequence}
    
    if (debug) Serial.println("turn blink off");
    I2C.start();
    status &= I2C.write(i2cAddr);
    status &= I2C.write(0x81);
    I2C.stop();                                 // Terminate the write sequence}
    
    if (debug) Serial.println("set maximum brightness");
    I2C.start();
    status &= I2C.write(i2cAddr);
    status &= I2C.write(0xEF);
    I2C.stop();                                 // Terminate the write sequence}
    return status;
}

boolean writeDisplay(void) {
    u8 i;
    boolean status = true;
    //i2cAddr = (0x70 << 1) & 0xFE;
    //i2cAddr = 0x70;
    I2C.start();
    status &= I2C.write(i2cAddr);
    status &= I2C.write(0x00);
    for (i=0; i<8; i++) {
        status &= I2C.write(displaybuffer[i] & 0xFF);    
        status &= I2C.write(displaybuffer[i] >> 8);    
    }
    I2C.stop();
    return status;
}

void clearDisplay(void) {
    u8 i;
    for (i=0; i<8; i++) {
        displaybuffer[i] = 0;
    }
}

void setup() {
    u8 i;
        
    I2C.master(I2C_100KHZ);

    pinMode(12, OUTPUT);
    if (debug) Serial.begin(9600);
    if (debug) delay(1000);

    displaybuffer[0] = 0x0;
    displaybuffer[1] = 0x0;
    displaybuffer[2] = 0x0;
    displaybuffer[3] = 0x0;

    if (!initDisplay()){
        if (debug) Serial.println("init display failed");
    }
    if (debug) Serial.println("Setup done");
}

void loop() {
    int i;
    
    if (debug) Serial.println("start loop");
    displaybuffer[3] = 0x0;
    displaybuffer[0] = 0xFFFF;
    if (!writeDisplay()){
        if (debug) Serial.println("write display failed");
    }
    delay(200);
    displaybuffer[0] = 0x0;
    displaybuffer[1] = 0xFFFF;
    if (!writeDisplay()){
        if (debug) Serial.println("write display failed");
    }
    delay(200);
    displaybuffer[1] = 0x0;
    displaybuffer[2] = 0xFFFF;
    if (!writeDisplay()){
        if (debug) Serial.println("write display failed");
    }
    delay(200);
    displaybuffer[2] = 0x0;
    displaybuffer[3] = 0xFFFF;
    if (!writeDisplay()){
        if (debug) Serial.println("write display failed");
    }
    delay(200);
        for (i=0; i<124; i++){
        displaybuffer[0] = alphafonttable[i];
        displaybuffer[1] = alphafonttable[i+1];
        displaybuffer[2] = alphafonttable[i+2];
        displaybuffer[3] = alphafonttable[i+3];
        writeDisplay();
        delay(200);
    }

}