Advertisement
Slyke

Simple Display Driver for 4x7 Segment Display on Arduino

Jan 2nd, 2014
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.91 KB | None | 0 0
  1. // Segment labelling:
  2. //        A
  3. //       ----
  4. //     F |  | B
  5. //       ---- G
  6. //     E |  | C
  7. //       ----   .H
  8. //        D
  9.  
  10. // Pins:
  11. //             12        7
  12. //         -----------------------
  13. //         |   ~~  ~~  ~~  ~~    |
  14. //         |   ~   ~   ~   ~     |
  15. //         |   ~~. ~~. ~~. ~~.   |
  16. //         -----------------------
  17. //              1       6
  18.  
  19. //Remember to use a 220ohm resistor on all cathodes if using 5v.
  20. //Pins on 4x7 Segment Display:
  21. // Pin 1:  E
  22. // Pin 2:  D
  23. // Pin 3:  H
  24. // Pin 4:  C
  25. // Pin 5:  G
  26. // Pin 6:  4th 7 Segment
  27. // Pin 7:  B
  28. // Pin 8:  3rd 7 Segment
  29. // Pin 9:  2nd 7 Segment
  30. // Pin 10: F
  31. // Pin 11: A
  32. // Pin 12: 1st 7 Segment
  33.  
  34. byte segmentPinCount=8; //Includes the . (Decimal place)
  35. byte segmentDisplayCount=4; //How many 7 segment displays do we have?
  36. byte sevenSegmentPins[8] = {2,3,4,5,6,7,8,9}; // A, B, C, D, E, F, G, H
  37. byte sevenSegmentCathodePins[4]={10,11,14,16}; //1st, 2nd, 3rd, 4th
  38.  
  39. int delayTime = 4; // Time in ms to allow for pin state change.
  40. boolean bigEndian = false; //If the display can't fit the number, which end should we show?
  41. boolean serialCom = true; //Allow serial communication.
  42.  
  43. long serialData=0;
  44.  
  45. byte sevenSegmentDisplay[36][8] = {
  46.   //A B C D E F G H
  47.   { 1,1,1,1,1,1,0,0 },  // = 0
  48.   { 0,1,1,0,0,0,0,0 },  // = 1
  49.   { 1,1,0,1,1,0,1,0 },  // = 2
  50.   { 1,1,1,1,0,0,1,0 },  // = 3
  51.   { 0,1,1,0,0,1,1,0 },  // = 4
  52.   { 1,0,1,1,0,1,1,0 },  // = 5
  53.   { 1,0,1,1,1,1,1,0 },  // = 6
  54.   { 1,1,1,0,0,0,0,0 },  // = 7
  55.   { 1,1,1,1,1,1,1,0 },  // = 8
  56.   { 1,1,1,0,0,1,1,0 },  // = 9
  57.   { 1,1,1,0,1,1,1,0 },  // = A
  58.   { 0,0,1,1,1,1,1,0 },  // = B
  59.   { 1,0,0,1,1,1,0,0 },  // = C
  60.   { 0,1,1,1,1,0,1,0 },  // = D
  61.   { 1,0,1,0,1,1,1,0 },  // = E
  62.   { 1,0,0,0,1,1,1,0 },  // = F
  63.   { 0,0,0,0,0,0,0,0 },  // = Clear
  64.   { 0,0,0,0,0,0,0,1 },  // = Clear. (With dot)
  65.   { 0,0,0,0,0,0,1,0 },  // = -
  66.   { 0,0,0,0,0,0,1,1 },  // = - . (With dot)
  67.   { 1,1,1,1,1,1,0,1 },  // = 0.
  68.   { 0,1,1,0,0,0,0,1 },  // = 1.
  69.   { 1,1,0,1,1,0,1,1 },  // = 2.
  70.   { 1,1,1,1,0,0,1,1 },  // = 3.
  71.   { 0,1,1,0,0,1,1,1 },  // = 4.
  72.   { 1,0,1,1,0,1,1,1 },  // = 5.
  73.   { 1,0,1,1,1,1,1,1 },  // = 6.
  74.   { 1,1,1,0,0,0,0,1 },  // = 7.
  75.   { 1,1,1,1,1,1,1,1 },  // = 8.
  76.   { 1,1,1,0,0,1,1,1 },  // = 9.
  77.   { 1,1,1,0,1,1,1,1 },  // = A.
  78.   { 0,0,1,1,1,1,1,1 },  // = B.
  79.   { 1,0,0,1,1,1,0,1 },  // = C.
  80.   { 0,1,1,1,1,0,1,1 },  // = D.
  81.   { 1,0,1,0,1,1,1,1 },  // = E.
  82.   { 1,0,0,0,1,1,1,1 }   // = F.
  83. };
  84.  
  85. void setup()
  86. {
  87.   for (byte pinSetup = 0; pinSetup < segmentPinCount; ++pinSetup) {
  88.     pinMode(sevenSegmentPins[pinSetup], OUTPUT); //Setup our control pins for output.
  89.   }
  90.  
  91.   for (byte segSetup = 0; segSetup < segmentDisplayCount; ++segSetup) {
  92.     pinMode(sevenSegmentCathodePins[segSetup], OUTPUT); //Setup our cathode power pins for each 7 segment display.
  93.   }
  94.  
  95.   if (serialCom) { Serial.begin(9600); } //Allow serial communication.
  96. }
  97. void loop()
  98. {
  99.  
  100.   for (byte segSetup = 0; segSetup < segmentDisplayCount; ++segSetup) {
  101.     digitalWrite(sevenSegmentCathodePins[segSetup], HIGH); //Reset cathode control pins.
  102.   }
  103.  
  104.   if (Serial.available() > 0)
  105.   {
  106.     serialData = Serial.parseInt();
  107.     Serial.print("Recieved serial input: ");
  108.     Serial.println(serialData);
  109.   }
  110.   displayNumber(serialData);
  111. }
  112.  
  113. void displayNumber(long originalNumber)
  114. {
  115.   long newNumber=originalNumber;
  116.   byte digit=0;
  117.      
  118.   if (bigEndian) {
  119.     for (byte segSetup = segmentDisplayCount; segSetup > 0; --segSetup) {
  120.       digit = newNumber%10;
  121.      
  122.       if (newNumber > 0) {
  123.         setNumber(segSetup-1, digit);
  124.       }
  125.       else {
  126.         setNumber(segSetup-1, 0);
  127.       }
  128.       newNumber /= 10;
  129.     }
  130.   } else {
  131.     long tmpNum=0;
  132.     while (newNumber > 0) { //Reverse the integer.
  133.       tmpNum = tmpNum * 10 + (newNumber % 10);
  134.       newNumber = newNumber / 10;
  135.     }
  136.     newNumber=tmpNum;
  137.  
  138.     for (byte segSetup = 0; segSetup < segmentDisplayCount; ++segSetup) {
  139.       digit = newNumber%10;
  140.      
  141.       if (newNumber > 0) {
  142.         setNumber(segSetup, digit);
  143.       }
  144.       else {
  145.         setNumber(segSetup, 0);
  146.       }
  147.       newNumber /= 10;
  148.     }
  149.   }
  150.  
  151. }
  152.  
  153. void setNumber(byte pin, int x)
  154. {
  155.   digitalWrite(sevenSegmentCathodePins[pin], LOW);
  156.    switch(x){
  157.      case 1:
  158.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  159.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[1][segIndex]);
  160.        }
  161.        break;
  162.      case 2:
  163.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  164.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[2][segIndex]);
  165.        }
  166.        break;
  167.      case 3:
  168.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  169.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[3][segIndex]);
  170.        }
  171.        break;
  172.      case 4:
  173.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  174.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[4][segIndex]);
  175.        }
  176.        break;
  177.      case 5:
  178.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  179.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[5][segIndex]);
  180.        }
  181.        break;
  182.      case 6:
  183.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  184.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[6][segIndex]);
  185.        }
  186.        break;
  187.      case 7:
  188.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  189.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[7][segIndex]);
  190.        }
  191.        break;
  192.      case 8:
  193.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  194.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[8][segIndex]);
  195.        }
  196.        break;
  197.      case 9:
  198.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  199.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[9][segIndex]);
  200.        }
  201.        break;
  202.      case 0:
  203.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  204.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[0][segIndex]);
  205.        }
  206.        break;
  207.      case 10: //A
  208.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  209.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[10][segIndex]);
  210.        }
  211.        break;
  212.      case 11: //B
  213.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  214.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[11][segIndex]);
  215.        }
  216.        break;
  217.      case 12: //C
  218.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  219.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[12][segIndex]);
  220.        }
  221.        break;
  222.      case 13: //D
  223.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  224.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[13][segIndex]);
  225.        }
  226.        break;
  227.      case 14: //E
  228.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  229.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[14][segIndex]);
  230.        }
  231.        break;
  232.      case 15: //F
  233.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  234.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[15][segIndex]);
  235.        }
  236.        break;
  237.      case 16: // Clear
  238.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  239.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[16][segIndex]);
  240.        }
  241.        break;
  242.      case 17: // Clear . (With dot)
  243.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  244.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[17][segIndex]);
  245.        }
  246.        break;
  247.      case 18: // - (Dash)
  248.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  249.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[18][segIndex]);
  250.        }
  251.        break;
  252.      case 19: // - . (Dash with dot)
  253.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  254.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[19][segIndex]);
  255.        }
  256.        break;
  257.      case 20: //0 . (With dot)
  258.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  259.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[20][segIndex]);
  260.        }
  261.        break;
  262.      case 21: //1 . (With dot)
  263.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  264.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[21][segIndex]);
  265.        }
  266.        break;
  267.      case 22: //2 . (With dot)
  268.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  269.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[22][segIndex]);
  270.        }
  271.        break;
  272.      case 23: //3 . (With dot)
  273.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  274.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[23][segIndex]);
  275.        }
  276.        break;
  277.      case 24: //4 . (With dot)
  278.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  279.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[24][segIndex]);
  280.        }
  281.        break;
  282.      case 25: //5 . (With dot)
  283.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  284.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[25][segIndex]);
  285.        }
  286.        break;
  287.      case 26: //6 . (With dot)
  288.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  289.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[26][segIndex]);
  290.        }
  291.        break;
  292.      case 27: //7 . (With dot)
  293.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  294.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[27][segIndex]);
  295.        }
  296.        break;
  297.      case 28: //8 . (With dot)
  298.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  299.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[28][segIndex]);
  300.        }
  301.        break;
  302.      case 29: //9 . (With dot)
  303.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  304.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[29][segIndex]);
  305.        }
  306.        break;
  307.      case 30: //A . (With dot)
  308.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  309.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[30][segIndex]);
  310.        }
  311.        break;
  312.      case 31: //B . (With dot)
  313.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  314.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[31][segIndex]);
  315.        }
  316.        break;
  317.      case 32: //C . (With dot)
  318.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  319.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[32][segIndex]);
  320.        }
  321.        break;
  322.      case 33: //D . (With dot)
  323.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  324.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[33][segIndex]);
  325.        }
  326.        break;
  327.      case 34: //E . (With dot)
  328.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  329.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[34][segIndex]);
  330.        }
  331.        break;
  332.      case 35: //F . (With dot)
  333.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  334.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[35][segIndex]);
  335.        }
  336.        break;
  337.        
  338.        
  339.      default: //Clear
  340.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  341.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[16][segIndex]);
  342.        }
  343.        break;
  344.    }
  345.    delay (delayTime);
  346.    digitalWrite(sevenSegmentCathodePins[pin], HIGH);
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement