Solutions for the 7-Segment Display experiments for LPC812 MAX

Dependencies:   lpc812_exp_lib_PCF8591 mbed

main.cpp

Committer:
embeddedartists
Date:
2013-11-22
Revision:
0:a41af9f7fe16

File content as of revision 0:a41af9f7fe16:

#include "mbed.h"

DigitalOut ssel(D10);
DigitalOut mosi(D11);
DigitalOut sclk(D13);

#define SEG_A   0x80
#define SEG_B   0x40
#define SEG_C   0x20
#define SEG_D   0x10
#define SEG_E   0x08
#define SEG_F   0x04
#define SEG_G   0x02
#define SEG_DP  0x01

const uint8_t segments[16] = {
    SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F        ,  //0 = A,B,C,D,E,F
            SEG_B | SEG_C                                ,  //1 = B,C
    SEG_A | SEG_B |         SEG_D | SEG_E |         SEG_G,  //2 = A,B,D,E,G
    SEG_A | SEG_B | SEG_C | SEG_D |                 SEG_G,  //3 = A,B,C,D,G
            SEG_B | SEG_C |                 SEG_F | SEG_G,  //4 = B,C,F,G
    SEG_A |         SEG_C | SEG_D |         SEG_F | SEG_G,  //5 = A,C,D,F,G
    SEG_A |         SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,  //6 = A,C,D,E,F,G
    SEG_A | SEG_B | SEG_C                                ,  //7 = A,B,C
    SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,  //8 = A,B,C,D,E,F,G
    SEG_A | SEG_B | SEG_C | SEG_D |         SEG_F | SEG_G,  //9 = A,B,C,D,F,G
    SEG_A | SEG_B | SEG_C |         SEG_E | SEG_F | SEG_G,  //A = A,B,C,E,F,G
                    SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,  //B = C,D,E,F,G
                            SEG_D | SEG_E |         SEG_G,  //C = D,E,G
            SEG_B | SEG_C | SEG_D | SEG_E |         SEG_G,  //D = B,C,D,E,G
    SEG_A |                 SEG_D | SEG_E | SEG_F | SEG_G,  //E = A,D,E,F,G
    SEG_A |                         SEG_E | SEG_F | SEG_G}; //F = A,E,F,G

static void updateShiftReg(uint8_t segments)
{
    uint8_t bitCnt;

    //Pull SCK and MOSI low, pull SSEL low
    ssel = 0;
    mosi = 0;
    sclk = 0;
    
    //wait 1us
    wait_us(1);
    
    //Loop through all eight bits
    for (bitCnt = 0; bitCnt < 8; bitCnt++)
    {
        //output MOSI value (depends on bit 7 of "segments")
        if (segments & 0x80) {
            mosi = 1;
        } else {
            mosi = 0;
        }
        
        //wait 1us
        wait_us(1);

        //pull SCK high
        sclk = 1;
        
        //wait 1us
        wait_us(1);
        
        //pull SCK low
        sclk = 0;
        
        //shift "segments"
        segments = segments << 1;
    }

    //Pull SSEL high
    ssel = 1;
}

static void experiment3()
{
    while(1) {
        for (int i = 0; i < 16; i++) {
            updateShiftReg(~segments[i]);
            wait(0.4);
        }
    }
}

int main()
{
    experiment3();
}