16 in 1 LEDs & Buttons FUN (Complete Project)

Discussion in 'The Completed Projects Collection' started by MCU88, Mar 15, 2015.

  1. MCU88

    Thread Starter Member

    Mar 12, 2015
    360
    35
    16 in 1 LEDs & Buttons FUN
    What Can be Done With Just Four Buttons & Four LEDs?

    [​IMG]
    [​IMG]

    Fig 1 shows the dipswitch settings for the various modes of operation. After selecting the function on the switches, the reset button on the board should be pressed to initiate the start of the mode. Below is a quick overview of what can be expected from the functions.

    Momentary Buttons

    When an button is held down, its corresponding LED will illuminate.

    LED Chaser Left / Right

    LEDs 1- 4 sequentially shift and illuminate in (n) direction[​IMG].

    LED Scanner

    LEDs 1-4 sequentially shift and illuminate back and forth infinitely.

    Toggle On / Off Buttons

    When an button is pressed, its corresponding LED changes state.

    BCD Counter UP / Down

    The LEDs sequence up or down in 4-BIT binary coded decimal[​IMG].

    Random LED

    When any button is pressed, then one of the LEDs will illuminate at random.

    Progressive LED Left / Right
    The LEDs sequentially illuminate in (n) direction.

    Simon Says Game
    One LED at a time is illuminated and the user is expected to memorize them in order. After all of the
    LEDs have been shown the user is required to repeat the sequence by pressing the corresponding
    buttons.

    Decision Maker Game
    When any button is pressed, then one of the LEDs will illuminate at random. Label the LEDs with “Maybe”, “”YES”, “NO” and “Definitely”

    Timers 1 / 3 Minute
    The timer begins when an button is pressed. When the period has expired all LEDs Illuminate.

    LED Flasher
    All LEDs flash at a rate of about 1Hz

    Alternate LED
    Two of the four LEDs alternate between states at about 1Hz.


    [​IMG]
    [​IMG]

    MikroC Code Here:

    Code (Text):
    1.  
    2.  
    3. // 16 in 1 LEDs 'n Buttons FUN
    4.  
    5. unsigned short nStart = 0;
    6. unsigned short dir = 0;
    7. unsigned short keyUp = 0;
    8. unsigned short keyDown = 0;
    9. unsigned short keyPress = 0;
    10. unsigned int randomNo = 0;
    11.  
    12. unsigned short i = 0;
    13. unsigned short j = 0;
    14. unsigned short k = 0;
    15. unsigned short e = 0;
    16. unsigned short s = 0;
    17. unsigned short simon[32]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    18.                            0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    19.  
    20.  
    21. #define dSW1 PORTA.F2
    22. #define dSW2 PORTA.F3
    23. #define dSW3 PORTA.F0
    24. #define dSW4 PORTA.F1
    25.  
    26. #define sw01 PORTB.F3
    27. #define sw02 PORTB.F2
    28. #define sw03 PORTB.F1
    29. #define sw04 PORTB.F0
    30.  
    31. #define ld01 PORTB.F4
    32. #define ld02 PORTB.F5
    33. #define ld03 PORTB.F6
    34. #define ld04 PORTB.F7
    35.  
    36.  
    37. progressiveLed(int dir)
    38. {
    39.    i++;
    40.  
    41.    if (dir == 0)
    42.    {
    43.       switch (i)
    44.       {
    45.          case 1: ld01 = 1; break;
    46.          case 2: ld02 = 1; break;
    47.          case 3: ld03 = 1; break;
    48.          case 4: ld04 = 1; break;
    49.       }
    50.    }
    51.    else
    52.    {
    53.       switch (i)
    54.       {
    55.          case 1: ld04 = 1; break;
    56.          case 2: ld03 = 1; break;
    57.          case 3: ld02 = 1; break;
    58.          case 4: ld01 = 1; break;
    59.       }
    60.    }
    61.  
    62.    if (i == 5)
    63.    {
    64.       i = 0;
    65.       ld01 = 0;
    66.       ld02 = 0;
    67.       ld03 = 0;
    68.       ld04 = 0;
    69.    }
    70.  
    71.    Delay_ms(500);
    72. }
    73.  
    74. void timer(int period)
    75. {
    76.    do
    77.    { // Wait for user to press a key
    78.    } while (sw01 == 1 && sw02 == 1 && sw03 == 1 && sw04 == 1);
    79.  
    80.    // All leds on
    81.    ld01 = 1;
    82.    ld02 = 1;
    83.    ld03 = 1;
    84.    ld04 = 1;
    85.  
    86.    // Timer interval
    87.    if (period == 0)
    88.    {
    89.       Delay_ms(10000); // 1 min
    90.    }
    91.    else
    92.    {
    93.       delay_ms(30000); // 3 min
    94.    }
    95.  
    96.    // All leds off
    97.    ld01 = 0;
    98.    ld02 = 0;
    99.    ld03 = 0;
    100.    ld04 = 0;
    101. }
    102.  
    103. void randomLed(int decision)
    104. {
    105.    randomNo = rand();
    106.  
    107.    if (decision == 1)
    108.    {
    109.       do
    110.       {
    111.       } while (sw01 == 1 && sw02 == 1 && sw03 == 1 && sw04 == 1);
    112.    
    113.       for (j = 0; j < 10; j++)
    114.       {
    115.          for (i = 0; i < 4; i++)
    116.          {
    117.             ld01 = 0;
    118.             ld02 = 0;
    119.             ld03 = 0;
    120.             ld04 = 0;
    121.  
    122.             Delay_ms(40);
    123.        
    124.             switch (i)
    125.             {
    126.                case 0: ld01 = 1; break;
    127.                case 1: ld02 = 1; break;
    128.                case 2: ld03 = 1; break;
    129.                case 3: ld04 = 1; break;
    130.             }
    131.        
    132.             Delay_ms(40);
    133.          }
    134.       }
    135.    }
    136.  
    137.    ld01 = 0;
    138.    ld02 = 0;
    139.    ld03 = 0;
    140.    ld04 = 0;
    141.  
    142.    if (randomNo <  8000)
    143.    {
    144.       ld01 = 1;
    145.    }
    146.    else if (randomNo < 16000)
    147.    {
    148.       ld02 = 1;
    149.    }
    150.    else if (randomNo < 24000)
    151.    {
    152.       ld03 = 1;
    153.    }
    154.    else
    155.    {
    156.       ld04 = 1;
    157.    }
    158.  
    159.    if (decision == 0)
    160.    {
    161.       Delay_ms(500);
    162.    }
    163. }
    164.  
    165. void upBCDCounter()
    166. {
    167.    i++;
    168.    j = (i * 16);
    169.    PORTB = j;
    170.  
    171.    if (i > 15)
    172.    {
    173.       i = 0;
    174.    }
    175.  
    176.    Delay_ms(500);
    177. }
    178.  
    179. void dnBCDCounter()
    180. {
    181.    i++;
    182.    j = (240 - (i * 16));
    183.    PORTB = j;
    184.  
    185.    if (i > 15)
    186.    {
    187.       i = 0;
    188.    }
    189.  
    190.    Delay_ms(500);
    191. }
    192.  
    193. void onOffButtons()
    194. {
    195.  
    196.    if (keyDown == 0)
    197.    {
    198.       if (sw01 == 0)
    199.       {
    200.          ld01 = ! ld01;
    201.          keyDown = 1;
    202.       }
    203.       if (sw02 == 0)
    204.       {
    205.          ld02 = ! ld02;
    206.          keyDown = 1;
    207.       }
    208.       if (sw03 == 0)
    209.       {
    210.          ld03 = ! ld03;
    211.          keyDown = 1;
    212.       }
    213.       if (sw04 == 0)
    214.       {
    215.          ld04 = ! ld04;
    216.          keyDown = 1;
    217.       }
    218.    }
    219.  
    220.    if (sw01 == 1)
    221.    {
    222.       if (sw02 == 1)
    223.       {
    224.          if (sw03 == 1)
    225.          {
    226.             if (sw04 == 1)
    227.             {
    228.                keyDown = 0;
    229.             }
    230.           }
    231.        }
    232.     }
    233.  
    234.    // Debounce period
    235.    Delay_ms(50);
    236. }
    237.  
    238. void momentaryButtons()
    239. {
    240.    Delay_ms(50); // Debounce period
    241.    ld01 =! sw01;
    242.    ld02 =! sw02;
    243.    ld03 =! sw03;
    244.    ld04 =! sw04;
    245. }
    246.  
    247. void flasher()
    248. {
    249.    Delay_ms(500);
    250.  
    251.    ld01 = 0;
    252.    ld02 = 0;
    253.    ld03 = 0;
    254.    ld04 = 0;
    255.  
    256.    Delay_ms(500);
    257.  
    258.    ld01 = 1;
    259.    ld02 = 1;
    260.    ld03 = 1;
    261.    ld04 = 1;
    262. }
    263.  
    264. void alternateFlasher()
    265. {
    266.    Delay_ms(500);
    267.  
    268.    ld01 = 1;
    269.    ld02 = 1;
    270.    ld03 = 0;
    271.    ld04 = 0;
    272.  
    273.    Delay_ms(500);
    274.  
    275.    ld01 = 0;
    276.    ld02 = 0;
    277.    ld03 = 1;
    278.    ld04 = 1;
    279. }
    280.  
    281.  
    282. void ledChaser(int dir)
    283. {
    284.    if (i == 0)
    285.    {
    286.       if (dir == 0)
    287.       {
    288.          j = 16;
    289.       }
    290.       else
    291.       {
    292.          j = 128;
    293.       }
    294.    }
    295.    else
    296.    {
    297.       if (dir == 0)
    298.       {
    299.          j = j << 1;
    300.       }
    301.       else
    302.       {
    303.          j = j >> 1;
    304.       }
    305.    }
    306.  
    307.    i++;
    308.    PORTB = j;
    309.  
    310.    if (i == 4)
    311.    {
    312.       i = 0;
    313.    }
    314.  
    315.    Delay_ms(500);
    316. }
    317.  
    318. void ledScanner()
    319. {
    320.    if (i == 3)
    321.    {
    322.       i = 0;
    323.       dir++;
    324.  
    325.       if (dir == 2)
    326.       {
    327.          dir = 0;
    328.       }
    329.    }
    330.  
    331.    if (nStart == 0)
    332.    {
    333.       j = 16;
    334.       nStart = 1;
    335.    }
    336.  
    337.    PORTB = j;
    338.  
    339.    if (dir == 0)
    340.    {
    341.       j = j << 1;
    342.    }
    343.    else
    344.    {
    345.       j = j >> 1;
    346.    }
    347.  
    348.    Delay_ms(250);
    349.    i++;
    350. }
    351.  
    352. void simonSays()
    353. {
    354.  
    355.    ld01 = 0;
    356.    ld02 = 0;
    357.    ld03 = 0;
    358.    ld04 = 0;
    359.  
    360.    for (e = 0; e < k; e++)
    361.    {
    362.       randomNo = rand();
    363.  
    364.       if (randomNo <  8000)
    365.       {
    366.          ld01 = 1;
    367.          simon[e] = 1;
    368.       }
    369.       else if (randomNo < 16000)
    370.       {
    371.          ld02 = 1;
    372.          simon[e] = 2;
    373.       }
    374.       else if (randomNo < 24000)
    375.       {
    376.          ld03 = 1;
    377.          simon[e] = 3;
    378.       }
    379.       else
    380.       {
    381.          ld04 = 1;
    382.          simon[e] = 4;
    383.       }
    384.  
    385.       Delay_ms(1000);
    386.  
    387.       ld01 = 0;
    388.       ld02 = 0;
    389.       ld03 = 0;
    390.       ld04 = 0;
    391.  
    392.       Delay_ms(1000);
    393.  
    394.    }
    395.  
    396.    // User to repeat
    397.    for (e = 0; e < k; e++)
    398.    {
    399.       do
    400.       {
    401.          if (keyDown == 0)
    402.          {
    403.             if (sw01 == 0)
    404.             {
    405.                j = 1;
    406.                ld01 = 1;
    407.                keyDown = 1;
    408.             }
    409.             if (sw02 == 0)
    410.             {
    411.                j = 2;
    412.                ld02 = 1;
    413.                keyDown = 1;
    414.             }
    415.             if (sw03 == 0)
    416.             {
    417.                j = 3;
    418.                ld03 = 1;
    419.                keyDown = 1;
    420.             }
    421.             if (sw04 == 0)
    422.             {
    423.                j = 4;
    424.                ld04 = 1;
    425.                keyDown = 1;
    426.             }
    427.          }
    428.  
    429.          if (keyDown == 1)
    430.          {
    431.             if (sw01 == 1)
    432.             {
    433.                if (sw02 == 1)
    434.                {
    435.                   if (sw03 == 1)
    436.                   {
    437.                      if (sw04 == 1)
    438.                      {
    439.                         keyDown = 0;
    440.                         keyPress = 1;
    441.  
    442.                         ld01 = 0;
    443.                         ld02 = 0;
    444.                         ld03 = 0;
    445.                         ld04 = 0;
    446.                      }
    447.                   }
    448.                }
    449.             }
    450.          }
    451.       } while (keyPress == 0);
    452.  
    453.       keyPress = 0;
    454.       Delay_ms(200);
    455.    
    456.       if (simon[e] != j)
    457.       {
    458.          if (j != 0)
    459.          {
    460.             for (s = 0; s < 5; s++)
    461.             {
    462.                Delay_ms(500);
    463.                ld01 = 1;
    464.                ld02 = 1;
    465.                ld03 = 1;
    466.                ld04 = 1;
    467.  
    468.                Delay_ms(500);
    469.                ld01 = 0;
    470.                ld02 = 0;
    471.                ld03 = 0;
    472.                ld04 = 0;
    473.             }
    474.          }
    475.          k = 0;
    476.          break;
    477.       }
    478.       j = 0;
    479.    }
    480.    k++;
    481. }
    482.  
    483. void main()
    484. {
    485.  
    486.   // Configuration of ports etc ...
    487.  
    488.   CMCON      = 7;       // Disable analog comparators
    489.   TRISA      = 0x0F;    // 4 inputs 4 outputs
    490.   TRISB      = 0x0F;    // 4 inputs 4 outputs
    491.   PORTA      = 0x00;    // Init port, all pins low
    492.   PORTB      = 0x00;    // Init port, all pins low
    493.  
    494.   while(1)
    495.   {
    496.      if (dSW1 == 1 && dSW2 == 1 && dSW3 == 1 && dSW4 == 1)
    497.      {
    498.         momentaryButtons();
    499.      }
    500.      else if (dSW1 == 0 && dSW2 == 1 && dSW3 == 1 && dSW4 == 1)
    501.      {
    502.         ledChaser(0);
    503.      }
    504.      else if (dSW1 == 1 && dSW2 == 0 && dSW3 == 1 && dSW4 == 1)
    505.      {
    506.         ledChaser(1);
    507.      }
    508.      else if (dSW1 == 0 && dSW2 == 0 && dSW3 == 1 && dSW4 == 1)
    509.      {
    510.         ledScanner();
    511.      }
    512.      else if (dSW1 == 1 && dSW2 == 1 && dSW3 == 0 && dSW4 == 1)
    513.      {
    514.         onOffButtons();
    515.      }
    516.      else if (dSW1 == 0 && dSW2 == 1 && dSW3 == 0 && dSW4 == 1)
    517.      {
    518.         upBCDCounter();
    519.      }
    520.      else if (dSW1 == 1 && dSW2 == 0 && dSW3 == 0 && dSW4 == 1)
    521.      {
    522.         dnBCDCounter();
    523.      }
    524.      else if (dSW1 == 0 && dSW2 == 0 && dSW3 == 0 && dSW4 == 1)
    525.      {
    526.         randomLed(0);
    527.      }
    528.      else if (dSW1 == 1 && dSW2 == 1 && dSW3 == 1 && dSW4 == 0)
    529.      {
    530.         progressiveLed(0);
    531.      }
    532.      else if (dSW1 == 0 && dSW2 == 1 && dSW3 == 1 && dSW4 == 0)
    533.      {
    534.         progressiveLed(1);
    535.      }
    536.      else if (dSW1 == 1 && dSW2 == 0 && dSW3 == 1 && dSW4 == 0)
    537.      {
    538.         simonSays();
    539.      }
    540.      else if (dSW1 == 0 && dSW2 == 0 && dSW3 == 1 && dSW4 == 0)
    541.      {
    542.         randomLed(1); // Decision Maker
    543.      }
    544.      else if (dSW1 == 1 && dSW2 == 1 && dSW3 == 0 && dSW4 == 0)
    545.      {
    546.         timer(0);
    547.      }
    548.      else if (dSW1 == 0 && dSW2 == 1 && dSW3 == 0 && dSW4 == 0)
    549.      {
    550.         timer(1);
    551.      }
    552.      else if (dSW1 == 1 && dSW2 == 0 && dSW3 == 0 && dSW4 == 0)
    553.      {
    554.         flasher();
    555.      }
    556.      else if (dSW1 == 0 && dSW2 == 0 && dSW3 == 0 && dSW4 == 0)
    557.      {
    558.         alternateFlasher();
    559.      }
    560.   }
    561. }
    562.  
    Parts List
    Code (Text):
    1.  
    2. Resistors
    3. ·    9 x 100K
    4. ·    5 x 1K
    5.  
    6. Capacitors
    7. ·    2 x 22pF Ceramic
    8. ·    1 x 100nF Polyester
    9. ·    1 x 10uF Electrolytic
    10.  
    11. Semiconductors
    12. ·    IC1 Pre-Programmed 16F628a
    13. ·    IC2 LM78L05 Voltage Regulator
    14. ·    D1 SSR 1N4007
    15. ·    4 x LED (LD1 – LD1) 3mm Red Diffused
    16. ·    1 x LED LD5 3mm Green Diffused
    17.  
    18. Miscellaneous
    19. ·    IC1 Socket 18-Pin
    20. ·    5 x Tactile Buttons (SW1 – SW5)
    21. ·    Slide Switch SPDT (SW6)
    22. ·    4-Way Dipswitch
    23. ·    Battery Connector
    24. ·    Wire Links
    25. ·    XTAL 4MHz Crystal
    26.  
    PCB and hex file for PIC see attached!
     
    Metalmann and Rolland B. Heiss like this.
  2. MCU88

    Thread Starter Member

    Mar 12, 2015
    360
    35
    Sorry for the lack of comments in the mikroC code. Hope you can follow it.
     
  3. Rolland B. Heiss

    Member

    Feb 4, 2015
    236
    40
    I think this is pretty cool! :cool:
     
    Metalmann likes this.
Loading...