4 digits 7-segement LED display multiplexed using 2x 74hc595. counts 0-F hex on each of the displays sequentially. Program can control up to 8 digits

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*  Naam:
00002  *      SPI_4x7LED
00003  *
00004  *  Geschreven door: 
00005  *      Marout Yasuo Sluijter-Borms
00006  *
00007  *  Omschrijving:
00008  *      4 x 7 LED segmentdisplay en 2x 74hc595 schuifregister aansturen op de SPI bus
00009  *      teller 0 tot 9999
00010  *
00011  *  Aanmaakdatum:
00012  *      5 mei 2016
00013  *  Laatste update:
00014  *      7 mei 2016
00015  *
00016  *  Revisie:
00017  *          1 - Ombouwen spi_led_helloworld
00018  *          2 - Patroongenetator en digit selector geconstrueerd
00019  *          3 - Inversie van uitgangen
00020  *            - MSB = DP, LSB = segment A
00021  * 
00022  *  Copyright (c) 2016, MYSB, The Manhattan Project
00023  *  Zie einde programma / See end of program.
00024  */ 
00025 /*  Libraries en classes insluiten  */
00026 #include "mbed.h"
00027 
00028 /*  Definineer macros               */
00029 #define SPI_SPEED       48000000    //  max speed
00030 #define SPI_MOSI        P0_9        //  MOSI: p5 = P0_9
00031 #define SPI_MISO        P0_8        //  MISO: p6 = P0_8
00032 #define SPI_SCLK        P0_7        //  SCLK: p7 = P0_7
00033 #define SPI_MODE        3           //  Mode 3: CPOL = 1, CPHA= 1
00034 #define REGISTER_WIDTH  8           //  8-bit register
00035 #define REGISTER_COUNT  2           //  aantal registers in serie
00036 #define DIGIT_COUNT     4           //  aantal aan te sturen digits
00037 #define SEGMENT_COUNT   7           //  aantal segmenten per digit
00038 #define DP_OUT          0x80        //  register adres decimale punt (MSB = 128 = 0x80)
00039 #define LED_ON_TIME     0.2         //  tijd dat LED aan is
00040 
00041 /*  Declareer seriële poorten       */
00042 SPI spi0( SPI_MOSI, SPI_MISO, SPI_SCLK);
00043                                     //  Definieer SPI bus
00044 
00045 /*  Declareer digitale IO           */
00046 DigitalOut ss0( P0_6, 1);           //  p8 = slave select 0, actief LAAG! Dus pin hoog om chip te deselecteren!
00047 
00048 /*  Declareer Analoge IO            */
00049 /*  Declareer globale variabelen    */
00050 int spi_data = 0x0000;
00051 
00052 /*  Declareer globale constanten    */
00053 const int digit[] = {               //  waarden om digits te selecteren (activeer een uitgang van schuifregister
00054     0x01,   0x02,                   //  #1, #2
00055     0x04,   0x08,                   //  #3, #4
00056     0x10,   0x20,                   //  #5, #6
00057     0x40,   0x80                    //  #7, #8
00058     };
00059 const int decimalepunt = 0x80;      //  waarde van de decimale punt (DP = MSB)
00060 const int patroon[] = {             //  patroon om hexadecimaal digit te tonen (LSB a..g MSB-1, actief LAAG)
00061     0x40,   0x79,   0x24,   0x30,   //  0,  1,  2,  3,
00062     0x19,   0x12,   0x02,   0x78,   //  4,  5,  6,  7,
00063     0x00,   0x10,   0x08,   0x03,   //  8,  9,  A,  B,
00064     0x46,   0x21,   0x06,   0x0E    //  C,  D,  E,  F
00065     };
00066 const int patroon_aantal = (        //  aantal patronen in patroon
00067     sizeof( patroon) / 
00068             sizeof (patroon[0])
00069     );
00070     
00071 /*  Declareer functies              */
00072 /*  Start hoofprogramma             */
00073 int main()
00074 {
00075     //  intellen SPI bus
00076     spi0.frequency( SPI_SPEED);     //  Snelheid bus instellen
00077     spi0.format( REGISTER_WIDTH * REGISTER_COUNT, SPI_MODE);
00078                                     //  SPI mode instellen; 
00079     
00080     /*  maak schuifregisters leeg   */
00081     ss0 = 0;                        //  selecteer chip
00082     spi0.write( 0);                 //  Schrijf leeg byte naar chip
00083     ss0 = 1;                        //  deselecteer chip
00084     wait( LED_ON_TIME);             //  wacht even
00085     /*  Schijf patroon naar register    */
00086     while(1) {
00087         spi_data = 0x0000;
00088         for( int d = 0; d < DIGIT_COUNT; ++d) {
00089                                     //  selecteer digit
00090             for( int v = 0; v < patroon_aantal; ++v) {
00091                                     //  selekteer segment
00092                 spi_data = digit[d];
00093                                     //  laad patroon om digit te selecteren
00094                 spi_data <<= 8;     //  schuif digit naar MSB
00095                 spi_data += patroon[v];
00096                                     //  voeg patroon om segmenten te selecteren toe
00097 // write
00098                 ss0 = 0;            //  selekteer chip
00099                 spi0.write( spi_data);
00100                                     //  schrijf data naar bus
00101                 ss0 = 1;            //  deselecteer chip
00102                 wait( LED_ON_TIME); //  wacht even
00103             }   // endfor
00104         }   //  endfor
00105     };  //  enwhile
00106 };  //  endmain
00107 /*
00108  *  Permission is hereby granted, free of charge, to any person obtaining a copy
00109  *  of this software and associated documentation files (the "Software"), to deal
00110  *  in the Software without restriction, including without limitation the rights
00111  *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00112  *  copies of the Software, and to permit persons to whom the Software is
00113  *  furnished to do so, subject to the following conditions:
00114  *
00115  *  The above copyright notice and this permission notice shall be included in
00116  *  all copies or substantial portions of the Software.
00117  *
00118  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00119  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00120  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00121  *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00122  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00123  *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00124  *  THE SOFTWARE.
00125  */