Statistics
| Branch: | Revision:

ddr4s / fw / wiringPi / examples / Gertboard / 7segments.c @ 32:cadb9025f1e0

History | View | Annotate | Download (4.28 KB)

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 <time.h>
16
#include <ctype.h>
17
#include <string.h>
18

    
19
/*
20
 *  Segment mapping
21
 *
22
 *         --a--
23
 *        |     |
24
 *        f     b
25
 *        |     |
26
 *         --g--
27
 *        |     |
28
 *        e     c
29
 *        |     |
30
 *         --d--  p
31
 */
32

    
33
// GPIO Pin Mapping
34

    
35
static int digits   [6] = {  7, 11, 10, 13, 12, 14    } ;
36
static int segments [7] = {  6,  5,  4,  3,  2,  1, 0 } ;
37

    
38

    
39
static const int segmentDigits [] =
40
{
41
// a  b  c  d  e  f  g     Segments
42
// 6  5  4  3  2  1  0,        // wiringPi pin No.
43

    
44
   1, 1, 1, 1, 1, 1, 0,        // 0
45
   0, 1, 1, 0, 0, 0, 0,        // 1
46
   1, 1, 0, 1, 1, 0, 1,        // 2
47
   1, 1, 1, 1, 0, 0, 1,        // 3
48
   0, 1, 1, 0, 0, 1, 1,        // 4
49
   1, 0, 1, 1, 0, 1, 1,        // 5
50
   1, 0, 1, 1, 1, 1, 1,        // 6
51
   1, 1, 1, 0, 0, 0, 0,        // 7
52
   1, 1, 1, 1, 1, 1, 1,        // 8
53
   1, 1, 1, 1, 0, 1, 1,        // 9
54
   1, 1, 1, 0, 1, 1, 1,        // A
55
   0, 0, 1, 1, 1, 1, 1,        // b
56
   1, 0, 0, 1, 1, 1, 0,        // C
57
   0, 1, 1, 1, 1, 0, 1,        // d
58
   1, 0, 0, 1, 1, 1, 1,        // E
59
   1, 0, 0, 0, 1, 1, 1,        // F
60
   0, 0, 0, 0, 0, 0, 0,        // blank
61
} ;
62
 
63

    
64
// display:
65
//        A global variable which is written to by the main program and
66
//        read from by the thread that updates the display. Only the first
67
//        6 characters are used.
68

    
69
char display [8] ;
70

    
71

    
72
/*
73
 * displayDigits:
74
 *        This is our thread that's run concurrently with the main program.
75
 *        Essentially sit in a loop, parsing and displaying the data held in
76
 *        the "display" global.
77
 *********************************************************************************
78
 */
79

    
80
PI_THREAD (displayDigits)
81
{
82
  int digit, segment ;
83
  int index, d, segVal ;
84

    
85
  piHiPri (50) ;
86

    
87
  for (;;)
88
  {
89
    for (digit = 0 ; digit < 6 ; ++digit)
90
    {
91
      for (segment = 0 ; segment < 7 ; ++segment)
92
      {
93
        d = toupper (display [digit]) ;
94
        /**/ if ((d >= '0') && (d <= '9'))        // Digit
95
          index = d - '0' ;
96
        else if ((d >= 'A') && (d <= 'F'))        // Hex
97
          index = d - 'A' + 10 ;
98
        else
99
          index = 16 ;                                // Blank
100

    
101
        segVal = segmentDigits [index * 7 + segment] ;
102

    
103
        digitalWrite (segments [segment], segVal) ;
104
      }
105
      digitalWrite (digits [digit], 1) ;
106
      delay (2) ;
107
      digitalWrite (digits [digit], 0) ;
108
    }
109
  }
110
}
111

    
112

    
113
/*
114
 * setup:
115
 *        Initialise the hardware and start the thread
116
 *********************************************************************************
117
 */
118

    
119
void setup (void)
120
{
121
  int i, c ;
122

    
123
  wiringPiSetup () ;
124

    
125
// 7 segments
126

    
127
  for (i = 0 ; i < 7 ; ++i)
128
    { digitalWrite (segments [i], 0) ; pinMode (segments [i], OUTPUT) ; }
129

    
130
// 6 digits
131

    
132
  for (i = 0 ; i < 6 ; ++i)
133
    { digitalWrite (digits [i], 0) ;   pinMode (digits [i],   OUTPUT) ; }
134

    
135
  strcpy (display, "      ") ;
136
  piThreadCreate (displayDigits) ;
137
  delay (10) ; // Just to make sure it's started
138

    
139
// Quick countdown LED test sort of thing
140

    
141
  c = 999999 ;
142
  for (i = 0 ; i < 10 ; ++i)
143
  {
144
    sprintf (display, "%06d", c) ;
145
    delay (400) ;
146
    c -= 111111 ;
147
  }
148

    
149
  strcpy (display, "      ") ;
150
  delay (400) ;
151

    
152
#ifdef PHOTO_HACK
153
  sprintf (display, "%s", "123456") ;
154
  for (;;)
155
    delay (1000) ;
156
#endif
157

    
158
}
159

    
160

    
161
/*
162
 * teenager:
163
 *        No explanation needed. (Nor one given!)
164
 *********************************************************************************
165
 */
166

    
167
void teenager (void)
168
{
169
  char *message = "      feedbeef      babe      cafe      b00b      " ;
170
  int i ;
171

    
172
  for (i = 0 ; i < strlen (message) - 4 ; ++i)
173
  {
174
    strncpy (display, &message [i], 6) ;
175
    delay (200) ;
176
  }
177
  delay (1000) ;
178
  for (i = 0 ; i < 3 ; ++i)
179
  {
180
    strcpy (display, "    ") ;
181
    delay (150) ;
182
    strcpy (display, " b00b ") ;
183
    delay (250) ;
184
  }
185
  delay (1000) ;
186
  strcpy (display, "      ") ;
187
  delay (1000) ;
188
}
189

    
190

    
191
/*
192
 *********************************************************************************
193
 * main:
194
 *        Let the fun begin
195
 *********************************************************************************
196
 */
197

    
198
int main (void)
199
{
200
  struct tm *t ;
201
  time_t     tim ;
202

    
203
  setup    () ;
204
  teenager () ;
205

    
206
  tim = time (NULL) ;
207
  for (;;)
208
  {
209
    while (time (NULL) == tim)
210
      delay (5) ;
211

    
212
    tim = time (NULL) ;
213
    t   = localtime (&tim) ;
214

    
215
    sprintf (display, "%02d%02d%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
216

    
217
    delay (500) ;
218
  }
219

    
220
  return 0 ;
221
}