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
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 */
Generated on Fri Jul 15 2022 01:45:02 by 1.7.2