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?

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.

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.

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.

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!

File size:
231.1 KB
Views:
1,097
File size:
151.1 KB
Views:
535
File size:
130.6 KB
Views:
979
File size:
190.4 KB
Views:
536
File size:
41.8 KB
Views:
64
• hexfile01.hex
File size:
7.2 KB
Views:
48
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!

Metalmann likes this.