Tom Davies
/
LU-3011
Basic code for multiplexing LU-3011 11 Digit 7 Segment Display
main.cpp
- Committer:
- logictom
- Date:
- 2011-10-07
- Revision:
- 1:763fde365f8e
- Parent:
- 0:61e6eaba7852
File content as of revision 1:763fde365f8e:
// // LU-3011 11 Digit 7 Segment Display // v0.1 06/10/11 // Uses ticker to muliplex display to show whole numbers // Maybe more efficient way to code switch/case segment? // Doesn't currently handle decimal point - whole numbers only // #include "mbed.h" //Prototypes void dispNumDig (int num, int digit); void upDisp (void); void updateDisp (int num, int digit); void showNum(unsigned int num); //Globals int dispArray[15]; // Holds Displayed Value int dispArrayIndex = 0; // Used to cycle digits displayed by ticker Ticker pov; // Ticker Interrupt Serial pc(USBTX,USBRX); // Default PC Comms DigitalOut myled(LED1); // Onboard LED for debug // 7 Segment Display - PCB Connections // Digits DigitalOut D11(p7); //PCB Pin 1 - Digit 11 DigitalOut D10(p30); //PCB Pin 2 DigitalOut D9(p29); //PCB Pin 3 DigitalOut D8(p28); //PCB Pin 4 DigitalOut D7(p26); //PCB Pin 6 DigitalOut D6(p24); //PCB Pin 8 DigitalOut D5(p22); //PCB Pin 10 DigitalOut D4(p20); //PCB Pin 12 DigitalOut D3(p18); //PCB Pin 14 DigitalOut D2(p16); //PCB Pin 16 DigitalOut D1(p14); //PCB Pin 18 // Segments DigitalOut SP(p27); //PCB Pin 5 - Segment Decimal Point DigitalOut SA(p21); //PCB Pin 11 - Segment A DigitalOut SB(p13); //PCB Pin 19 DigitalOut SC(p25); //PCB Pin 7 DigitalOut SD(p17); //PCB Pin 15 DigitalOut SE(p23); //PCB Pin 9 DigitalOut SF(p15); //PCB Pin 17 DigitalOut SG(p19); //PCB Pin 13 //////////////////////////////////////////////// int main() { pov.attach_us(&upDisp, 100); // Function called (upDisp) by ticker(POV), interval (100uS) while (1) { myled = 1; wait(0.2); myled = 0; wait(0.2); // Quick check - wiring and code correct updateDisp (1, 11); //number, digit updateDisp (2, 10); //Directly updating array through function updateDisp (3, 9); updateDisp (4, 8); updateDisp (5, 7); updateDisp (6, 6); updateDisp (7, 5); updateDisp (8, 4); updateDisp (9, 3); updateDisp (0, 2); updateDisp (1, 1); wait(2); for(int i=0;i<12;i++) { dispArray[i] = 11; //Any number other that 0-9 blanks digit } wait(1); while (1) { // Loop Counting for (unsigned int i=0; i<2000000000; i++) { //Loop - arbitary value showNum(i); //Update number wait_us(50); //Wait period } } } //End While } //End of main //////////////////////////////////////////////// void showNum(unsigned int num) { //Splits number into digits if (num < 10) { //If < 10 only 1 digit needed updateDisp (num, 1); //Update array } else { //Otherwise split and add to array int count = 1; while (num!=0) { //Split each digit and add to array in position for display int digit = num % 10; num = num / 10; updateDisp (digit, count); count++; } } } //////////////////////////////////////////////// void updateDisp (int num, int digit) { //Update display array //Seperate function - not needed now but maybe for further fuctionality dispArray[digit] = num; } //////////////////////////////////////////////// void upDisp (void) { //Called by ticker - switched displayed digit - using POV to muliplex display if (dispArrayIndex < 11) { //Increment display index dispArrayIndex++; } else { //Otherwise out of rage - reset dispArrayIndex = 0; } // Call function to switch digit and value dispNumDig (dispArray[dispArrayIndex], dispArrayIndex); } //////////////////////////////////////////////// void dispNumDig (int num, int digit) { //Switches Digit and corrisponding Segments //Switch/Case setup - more efficient way of coding??? switch (digit) { case 1: D1 = 0; D2 = 1; D3 = 1; D4 = 1; D5 = 1; D6 = 1; D7 = 1; D8 = 1; D9 = 1; D10 = 1; D11 = 1; break; case 2: D1 = 1; D2 = 0; D3 = 1; D4 = 1; D5 = 1; D6 = 1; D7 = 1; D8 = 1; D9 = 1; D10 = 1; D11 = 1; break; case 3: D1 = 1; D2 = 1; D3 = 0; D4 = 1; D5 = 1; D6 = 1; D7 = 1; D8 = 1; D9 = 1; D10 = 1; D11 = 1; break; case 4: D1 = 1; D2 = 1; D3 = 1; D4 = 0; D5 = 1; D6 = 1; D7 = 1; D8 = 1; D9 = 1; D10 = 1; D11 = 1; break; case 5: D1 = 1; D2 = 1; D3 = 1; D4 = 1; D5 = 0; D6 = 1; D7 = 1; D8 = 1; D9 = 1; D10 = 1; D11 = 1; break; case 6: D1 = 1; D2 = 1; D3 = 1; D4 = 1; D5 = 1; D6 = 0; D7 = 1; D8 = 1; D9 = 1; D10 = 1; D11 = 1; break; case 7: D1 = 1; D2 = 1; D3 = 1; D4 = 1; D5 = 1; D6 = 1; D7 = 0; D8 = 1; D9 = 1; D10 = 1; D11 = 1; break; case 8: D1 = 1; D2 = 1; D3 = 1; D4 = 1; D5 = 1; D6 = 1; D7 = 1; D8 = 0; D9 = 1; D10 = 1; D11 = 1; break; case 9: D1 = 1; D2 = 1; D3 = 1; D4 = 1; D5 = 1; D6 = 1; D7 = 1; D8 = 1; D9 = 0; D10 = 1; D11 = 1; break; case 10: D1 = 1; D2 = 1; D3 = 1; D4 = 1; D5 = 1; D6 = 1; D7 = 1; D8 = 1; D9 = 1; D10 = 0; D11 = 1; break; case 11: D1 = 1; D2 = 1; D3 = 1; D4 = 1; D5 = 1; D6 = 1; D7 = 1; D8 = 1; D9 = 1; D10 = 1; D11 = 0; break; default: //If out of range switch off all digits D1 = 1; D2 = 1; D3 = 1; D4 = 1; D5 = 1; D6 = 1; D7 = 1; D8 = 1; D9 = 1; D10 = 1; D11 = 1; break; } switch (num) { //Case not currently included for decimcal point (SP) case 0: SP = 0; SA = 1; SB = 1; SC = 1; SD = 1; SE = 1; SF = 1; SG = 0; break; case 1: SP = 0; SA = 0; SB = 1; SC = 1; SD = 0; SE = 0; SF = 0; SG = 0; break; case 2: SP = 0; SA = 1; SB = 1; SC = 0; SD = 1; SE = 1; SF = 0; SG = 1; break; case 3: SP = 0; SA = 1; SB = 1; SC = 1; SD = 1; SE = 0; SF = 0; SG = 1; break; case 4: SP = 0; SA = 0; SB = 1; SC = 1; SD = 0; SE = 0; SF = 1; SG = 1; break; case 5: SP = 0; SA = 1; SB = 0; SC = 1; SD = 1; SE = 0; SF = 1; SG = 1; break; case 6: SP = 0; SA = 1; SB = 0; SC = 1; SD = 1; SE = 1; SF = 1; SG = 1; break; case 7: SP = 0; SA = 1; SB = 1; SC = 1; SD = 0; SE = 0; SF = 0; SG = 0; break; case 8: SP = 0; SA = 1; SB = 1; SC = 1; SD = 1; SE = 1; SF = 1; SG = 1; break; case 9: SP = 0; SA = 1; SB = 1; SC = 1; SD = 1; SE = 0; SF = 1; SG = 1; break; default: // If out of range switch off all segments SP = 0; SA = 0; SB = 0; SC = 0; SD = 0; SE = 0; SF = 0; SG = 0; } }