Basic code for multiplexing LU-3011 11 Digit 7 Segment Display

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 //
00002 // LU-3011 11 Digit 7 Segment Display
00003 // v0.1 06/10/11
00004 // Uses ticker to muliplex display to show whole numbers
00005 // Maybe more efficient way to code switch/case segment?
00006 // Doesn't currently handle decimal point - whole numbers only
00007 //
00008 
00009 #include "mbed.h"
00010 
00011 //Prototypes
00012 void dispNumDig (int num, int digit);
00013 void upDisp (void);
00014 void updateDisp (int num, int digit);
00015 void showNum(unsigned int num);
00016 
00017 
00018 //Globals
00019 int dispArray[15];          // Holds Displayed Value
00020 int dispArrayIndex = 0;     // Used to cycle digits displayed by ticker
00021 
00022 Ticker pov;                 // Ticker Interrupt 
00023 Serial pc(USBTX,USBRX);     // Default PC Comms
00024 DigitalOut myled(LED1);     // Onboard LED for debug
00025 
00026 // 7 Segment Display - PCB Connections
00027 // Digits
00028 DigitalOut D11(p7);   //PCB Pin 1   - Digit 11
00029 DigitalOut D10(p30);  //PCB Pin 2
00030 DigitalOut D9(p29);   //PCB Pin 3
00031 DigitalOut D8(p28);   //PCB Pin 4
00032 DigitalOut D7(p26);   //PCB Pin 6
00033 DigitalOut D6(p24);   //PCB Pin 8
00034 DigitalOut D5(p22);   //PCB Pin 10
00035 DigitalOut D4(p20);   //PCB Pin 12
00036 DigitalOut D3(p18);   //PCB Pin 14
00037 DigitalOut D2(p16);   //PCB Pin 16
00038 DigitalOut D1(p14);   //PCB Pin 18
00039 
00040 // Segments
00041 DigitalOut SP(p27);   //PCB Pin 5   - Segment Decimal Point
00042 DigitalOut SA(p21);   //PCB Pin 11  - Segment A
00043 DigitalOut SB(p13);   //PCB Pin 19
00044 DigitalOut SC(p25);   //PCB Pin 7
00045 DigitalOut SD(p17);   //PCB Pin 15
00046 DigitalOut SE(p23);   //PCB Pin 9
00047 DigitalOut SF(p15);   //PCB Pin 17
00048 DigitalOut SG(p19);   //PCB Pin 13
00049 
00050 ////////////////////////////////////////////////
00051 
00052 int main()
00053 {
00054     pov.attach_us(&upDisp, 100); // Function called (upDisp) by ticker(POV), interval (100uS)
00055 
00056     while (1)
00057     {
00058         myled = 1;
00059         wait(0.2);
00060         myled = 0;
00061         wait(0.2);
00062         
00063         // Quick check - wiring and code correct
00064         updateDisp (1, 11); //number, digit
00065         updateDisp (2, 10); //Directly updating array through function
00066         updateDisp (3, 9);
00067         updateDisp (4, 8);
00068         updateDisp (5, 7);
00069         updateDisp (6, 6);
00070         updateDisp (7, 5);
00071         updateDisp (8, 4);
00072         updateDisp (9, 3);
00073         updateDisp (0, 2);
00074         updateDisp (1, 1);
00075         wait(2);
00076         
00077         for(int i=0;i<12;i++)
00078         {
00079             dispArray[i] =  11; //Any number other that 0-9 blanks digit
00080         }
00081         wait(1);
00082 
00083 
00084         while (1)
00085         {   // Loop Counting
00086             for (unsigned int i=0; i<2000000000; i++)
00087             {   //Loop - arbitary value
00088                 showNum(i);     //Update number
00089                 wait_us(50);    //Wait period
00090             }
00091         }
00092         
00093     }   //End While
00094 }   //End of main
00095 
00096 ////////////////////////////////////////////////
00097 
00098 void showNum(unsigned int num)
00099 {   //Splits number into digits
00100     if (num < 10)
00101     {   //If < 10 only 1 digit needed
00102         updateDisp (num, 1);    //Update array
00103     }
00104     else
00105     {   //Otherwise split and add to array 
00106         int count = 1;
00107         while (num!=0)
00108         {   //Split each digit and add to array in position for display
00109             int digit = num % 10;
00110             num = num / 10;
00111             updateDisp (digit, count);
00112             count++;
00113         }
00114     }
00115 }
00116 
00117 ////////////////////////////////////////////////
00118 
00119 void updateDisp (int num, int digit)
00120 {   //Update display array
00121     //Seperate function - not needed now but maybe for further fuctionality
00122     dispArray[digit] =  num;
00123 }
00124 
00125 ////////////////////////////////////////////////
00126 
00127 void upDisp (void)
00128 {   //Called by ticker - switched displayed digit - using POV to muliplex display
00129     if (dispArrayIndex < 11)
00130     {   //Increment display index
00131         dispArrayIndex++;
00132     }
00133     else
00134     {   //Otherwise out of rage - reset
00135         dispArrayIndex = 0;
00136     }   
00137     // Call function to switch digit and value
00138     dispNumDig (dispArray[dispArrayIndex], dispArrayIndex);
00139 }
00140 
00141 ////////////////////////////////////////////////
00142 
00143 void dispNumDig (int num, int digit)
00144 {   //Switches Digit and corrisponding Segments
00145 //Switch/Case setup - more efficient way of coding???
00146     switch (digit)
00147     {
00148         case 1:
00149             D1 = 0;
00150             D2 = 1;
00151             D3 = 1;
00152             D4 = 1;
00153             D5 = 1;
00154             D6 = 1;
00155             D7 = 1;
00156             D8 = 1;
00157             D9 = 1;
00158             D10 = 1;
00159             D11 = 1;
00160             break;
00161         case 2:
00162             D1 = 1;
00163             D2 = 0;
00164             D3 = 1;
00165             D4 = 1;
00166             D5 = 1;
00167             D6 = 1;
00168             D7 = 1;
00169             D8 = 1;
00170             D9 = 1;
00171             D10 = 1;
00172             D11 = 1;
00173             break;
00174         case 3:
00175             D1 = 1;
00176             D2 = 1;
00177             D3 = 0;
00178             D4 = 1;
00179             D5 = 1;
00180             D6 = 1;
00181             D7 = 1;
00182             D8 = 1;
00183             D9 = 1;
00184             D10 = 1;
00185             D11 = 1;
00186             break;
00187         case 4:
00188             D1 = 1;
00189             D2 = 1;
00190             D3 = 1;
00191             D4 = 0;
00192             D5 = 1;
00193             D6 = 1;
00194             D7 = 1;
00195             D8 = 1;
00196             D9 = 1;
00197             D10 = 1;
00198             D11 = 1;
00199             break;
00200         case 5:
00201             D1 = 1;
00202             D2 = 1;
00203             D3 = 1;
00204             D4 = 1;
00205             D5 = 0;
00206             D6 = 1;
00207             D7 = 1;
00208             D8 = 1;
00209             D9 = 1;
00210             D10 = 1;
00211             D11 = 1;
00212             break;
00213         case 6:
00214             D1 = 1;
00215             D2 = 1;
00216             D3 = 1;
00217             D4 = 1;
00218             D5 = 1;
00219             D6 = 0;
00220             D7 = 1;
00221             D8 = 1;
00222             D9 = 1;
00223             D10 = 1;
00224             D11 = 1;
00225             break;
00226         case 7:
00227             D1 = 1;
00228             D2 = 1;
00229             D3 = 1;
00230             D4 = 1;
00231             D5 = 1;
00232             D6 = 1;
00233             D7 = 0;
00234             D8 = 1;
00235             D9 = 1;
00236             D10 = 1;
00237             D11 = 1;
00238             break;
00239         case 8:
00240             D1 = 1;
00241             D2 = 1;
00242             D3 = 1;
00243             D4 = 1;
00244             D5 = 1;
00245             D6 = 1;
00246             D7 = 1;
00247             D8 = 0;
00248             D9 = 1;
00249             D10 = 1;
00250             D11 = 1;
00251             break;
00252         case 9:
00253             D1 = 1;
00254             D2 = 1;
00255             D3 = 1;
00256             D4 = 1;
00257             D5 = 1;
00258             D6 = 1;
00259             D7 = 1;
00260             D8 = 1;
00261             D9 = 0;
00262             D10 = 1;
00263             D11 = 1;
00264             break;
00265         case 10:
00266             D1 = 1;
00267             D2 = 1;
00268             D3 = 1;
00269             D4 = 1;
00270             D5 = 1;
00271             D6 = 1;
00272             D7 = 1;
00273             D8 = 1;
00274             D9 = 1;
00275             D10 = 0;
00276             D11 = 1;
00277             break;
00278         case 11:
00279             D1 = 1;
00280             D2 = 1;
00281             D3 = 1;
00282             D4 = 1;
00283             D5 = 1;
00284             D6 = 1;
00285             D7 = 1;
00286             D8 = 1;
00287             D9 = 1;
00288             D10 = 1;
00289             D11 = 0;
00290             break;
00291         default:    //If out of range switch off all digits
00292             D1 = 1;
00293             D2 = 1;
00294             D3 = 1;
00295             D4 = 1;
00296             D5 = 1;
00297             D6 = 1;
00298             D7 = 1;
00299             D8 = 1;
00300             D9 = 1;
00301             D10 = 1;
00302             D11 = 1;
00303             break;
00304     }
00305 
00306 
00307 
00308     switch (num)
00309     {   //Case not currently included for decimcal point (SP)
00310         case 0:
00311             SP = 0;
00312             SA = 1;
00313             SB = 1;
00314             SC = 1;
00315             SD = 1;
00316             SE = 1;
00317             SF = 1;
00318             SG = 0;
00319             break;
00320         case 1:
00321             SP = 0;
00322             SA = 0;
00323             SB = 1;
00324             SC = 1;
00325             SD = 0;
00326             SE = 0;
00327             SF = 0;
00328             SG = 0;
00329             break;
00330         case 2:
00331             SP = 0;
00332             SA = 1;
00333             SB = 1;
00334             SC = 0;
00335             SD = 1;
00336             SE = 1;
00337             SF = 0;
00338             SG = 1;
00339             break;
00340         case 3:
00341             SP = 0;
00342             SA = 1;
00343             SB = 1;
00344             SC = 1;
00345             SD = 1;
00346             SE = 0;
00347             SF = 0;
00348             SG = 1;
00349             break;
00350         case 4:
00351             SP = 0;
00352             SA = 0;
00353             SB = 1;
00354             SC = 1;
00355             SD = 0;
00356             SE = 0;
00357             SF = 1;
00358             SG = 1;
00359             break;
00360         case 5:
00361             SP = 0;
00362             SA = 1;
00363             SB = 0;
00364             SC = 1;
00365             SD = 1;
00366             SE = 0;
00367             SF = 1;
00368             SG = 1;
00369             break;
00370         case 6:
00371             SP = 0;
00372             SA = 1;
00373             SB = 0;
00374             SC = 1;
00375             SD = 1;
00376             SE = 1;
00377             SF = 1;
00378             SG = 1;
00379             break;
00380         case 7:
00381             SP = 0;
00382             SA = 1;
00383             SB = 1;
00384             SC = 1;
00385             SD = 0;
00386             SE = 0;
00387             SF = 0;
00388             SG = 0;
00389             break;
00390         case 8:
00391             SP = 0;
00392             SA = 1;
00393             SB = 1;
00394             SC = 1;
00395             SD = 1;
00396             SE = 1;
00397             SF = 1;
00398             SG = 1;
00399             break;
00400         case 9:
00401             SP = 0;
00402             SA = 1;
00403             SB = 1;
00404             SC = 1;
00405             SD = 1;
00406             SE = 0;
00407             SF = 1;
00408             SG = 1;
00409             break;
00410 
00411         default:    // If out of range switch off all segments
00412             SP = 0;
00413             SA = 0;
00414             SB = 0;
00415             SC = 0;
00416             SD = 0;
00417             SE = 0;
00418             SF = 0;
00419             SG = 0;
00420     }
00421 }