Gordons Projects

--> Projects Top-Level GIT

Initial creating of GIT repository for the wiringPi + Gertboard
[gertboard] / 7segments.c
1 /*
2  * 7segments.c:
3  *      Simple test program to see if we can drive a 7-segment LED
4  *      display using the GPIO and little else on the Raspberry Pi
5  *
6  *      Copyright (c) 2013 Gordon Henderson
7  ***********************************************************************
8  */
9
10 #undef  PHOTO_HACK
11
12 #include <wiringPi.h>
13
14 #include <stdio.h>
15 //#include <stdlib.h>
16 #include <time.h>
17 #include <ctype.h>
18 //#include <unistd.h>
19 #include <string.h>
20 //#include <errno.h>
21 //#include <sched.h>
22
23 /*
24  *  Segment mapping
25  *
26  *       --a--
27  *      |     |
28  *      f     b
29  *      |     |
30  *       --g--
31  *      |     |
32  *      e     c
33  *      |     |
34  *       --d--  p
35  */
36
37 // GPIO Pin Mapping
38
39 static int digits   [6] = {  7, 11, 10, 13, 12, 14    } ;
40 static int segments [7] = {  6,  5,  4,  3,  2,  1, 0 } ;
41
42
43 static const int segmentDigits [] =
44 {
45 // a  b  c  d  e  f  g     Segments
46 // 6  5  4  3  2  1  0, // wiringPi pin No.
47
48    1, 1, 1, 1, 1, 1, 0, // 0
49    0, 1, 1, 0, 0, 0, 0, // 1
50    1, 1, 0, 1, 1, 0, 1, // 2
51    1, 1, 1, 1, 0, 0, 1, // 3
52    0, 1, 1, 0, 0, 1, 1, // 4
53    1, 0, 1, 1, 0, 1, 1, // 5
54    1, 0, 1, 1, 1, 1, 1, // 6
55    1, 1, 1, 0, 0, 0, 0, // 7
56    1, 1, 1, 1, 1, 1, 1, // 8
57    1, 1, 1, 1, 0, 1, 1, // 9
58    1, 1, 1, 0, 1, 1, 1, // A
59    0, 0, 1, 1, 1, 1, 1, // b
60    1, 0, 0, 1, 1, 1, 0, // C
61    0, 1, 1, 1, 1, 0, 1, // d
62    1, 0, 0, 1, 1, 1, 1, // E
63    1, 0, 0, 0, 1, 1, 1, // F
64    0, 0, 0, 0, 0, 0, 0, // blank
65 } ;
66  
67
68 // display:
69 //      A global variable which is written to by the main program and
70 //      read from by the thread that updates the display. Only the first
71 //      6 characters are used.
72
73 char display [8] ;
74
75
76 /*
77  * displayDigits:
78  *      This is our thread that's run concurrently with the main program.
79  *      Essentially sit in a loop, parsing and displaying the data held in
80  *      the "display" global.
81  *********************************************************************************
82  */
83
84 PI_THREAD (displayDigits)
85 {
86   int digit, segment ;
87   int index, d, segVal ;
88
89   piHiPri (50) ;
90
91   for (;;)
92   {
93     for (digit = 0 ; digit < 6 ; ++digit)
94     {
95       for (segment = 0 ; segment < 7 ; ++segment)
96       {
97         d = toupper (display [digit]) ;
98         /**/ if ((d >= '0') && (d <= '9'))      // Digit
99           index = d - '0' ;
100         else if ((d >= 'A') && (d <= 'F'))      // Hex
101           index = d - 'A' + 10 ;
102         else
103           index = 16 ;                          // Blank
104
105         segVal = segmentDigits [index * 7 + segment] ;
106
107         digitalWrite (segments [segment], segVal) ;
108       }
109       digitalWrite (digits [digit], 1) ;
110       delay (2) ;
111       digitalWrite (digits [digit], 0) ;
112     }
113   }
114 }
115
116
117 /*
118  * setup:
119  *      Initialise the hardware and start the thread
120  *********************************************************************************
121  */
122
123 void setup (void)
124 {
125   int i, c ;
126
127   wiringPiSetup () ;
128
129 // 7 segments
130
131   for (i = 0 ; i < 7 ; ++i)
132     { digitalWrite (segments [i], 0) ; pinMode (segments [i], OUTPUT) ; }
133
134 // 6 digits
135
136   for (i = 0 ; i < 7 ; ++i)
137     { digitalWrite (digits [i], 0) ;   pinMode (digits [i],   OUTPUT) ; }
138
139   strcpy (display, "      ") ;
140   piThreadCreate (displayDigits) ;
141   delay (10) ; // Just to make sure it's started
142
143 // Quick countdown LED test sort of thing
144
145   c = 999999 ;
146   for (i = 0 ; i < 10 ; ++i)
147   {
148     sprintf (display, "%06d", c) ;
149     delay (400) ;
150     c -= 111111 ;
151   }
152
153   strcpy (display, "      ") ;
154   delay (400) ;
155
156 #ifdef PHOTO_HACK
157   sprintf (display, "%s", "123456") ;
158   for (;;)
159     delay (1000) ;
160 #endif
161
162 }
163
164
165 /*
166  * teenager:
167  *      No explanation needed. (Nor one given!)
168  *********************************************************************************
169  */
170
171 void teenager (void)
172 {
173   char *message = "      b00b1e5      babe      cafe      b00b" ;
174   int i ;
175
176   for (i = 0 ; i < strlen (message) - 4 ; ++i)
177   {
178     strncpy (display, &message [i], 6) ;
179     delay (200) ;
180   }
181   delay (1000) ;
182   for (i = 0 ; i < 3 ; ++i)
183   {
184     strcpy (display, "    ") ;
185     delay (150) ;
186     strcpy (display, " b00b ") ;
187     delay (250) ;
188   }
189   delay (1000) ;
190   strcpy (display, "      ") ;
191   delay (1000) ;
192 }
193
194
195 /*
196  *********************************************************************************
197  * main:
198  *      Let the fun begin
199  *********************************************************************************
200  */
201
202 int main (void)
203 {
204   struct tm *t ;
205   time_t     tim ;
206
207   setup    () ;
208   teenager () ;
209
210   tim = time (NULL) ;
211   for (;;)
212   {
213     while (time (NULL) == tim)
214       delay (5) ;
215
216     tim = time (NULL) ;
217     t   = localtime (&tim) ;
218
219     sprintf (display, "%02d%02d%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
220
221     delay (500) ;
222   }
223
224   return 0 ;
225 }