You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
4.3 KiB
221 lines
4.3 KiB
/* |
|
* 7segments.c: |
|
* Simple test program to see if we can drive a 7-segment LED |
|
* display using the GPIO and little else on the Raspberry Pi |
|
* |
|
* Copyright (c) 2013 Gordon Henderson |
|
*********************************************************************** |
|
*/ |
|
|
|
#undef PHOTO_HACK |
|
|
|
#include <wiringPi.h> |
|
|
|
#include <stdio.h> |
|
#include <time.h> |
|
#include <ctype.h> |
|
#include <string.h> |
|
|
|
/* |
|
* Segment mapping |
|
* |
|
* --a-- |
|
* | | |
|
* f b |
|
* | | |
|
* --g-- |
|
* | | |
|
* e c |
|
* | | |
|
* --d-- p |
|
*/ |
|
|
|
// GPIO Pin Mapping |
|
|
|
static int digits [6] = { 7, 11, 10, 13, 12, 14 } ; |
|
static int segments [7] = { 6, 5, 4, 3, 2, 1, 0 } ; |
|
|
|
|
|
static const int segmentDigits [] = |
|
{ |
|
// a b c d e f g Segments |
|
// 6 5 4 3 2 1 0, // wiringPi pin No. |
|
|
|
1, 1, 1, 1, 1, 1, 0, // 0 |
|
0, 1, 1, 0, 0, 0, 0, // 1 |
|
1, 1, 0, 1, 1, 0, 1, // 2 |
|
1, 1, 1, 1, 0, 0, 1, // 3 |
|
0, 1, 1, 0, 0, 1, 1, // 4 |
|
1, 0, 1, 1, 0, 1, 1, // 5 |
|
1, 0, 1, 1, 1, 1, 1, // 6 |
|
1, 1, 1, 0, 0, 0, 0, // 7 |
|
1, 1, 1, 1, 1, 1, 1, // 8 |
|
1, 1, 1, 1, 0, 1, 1, // 9 |
|
1, 1, 1, 0, 1, 1, 1, // A |
|
0, 0, 1, 1, 1, 1, 1, // b |
|
1, 0, 0, 1, 1, 1, 0, // C |
|
0, 1, 1, 1, 1, 0, 1, // d |
|
1, 0, 0, 1, 1, 1, 1, // E |
|
1, 0, 0, 0, 1, 1, 1, // F |
|
0, 0, 0, 0, 0, 0, 0, // blank |
|
} ; |
|
|
|
|
|
// display: |
|
// A global variable which is written to by the main program and |
|
// read from by the thread that updates the display. Only the first |
|
// 6 characters are used. |
|
|
|
char display [8] ; |
|
|
|
|
|
/* |
|
* displayDigits: |
|
* This is our thread that's run concurrently with the main program. |
|
* Essentially sit in a loop, parsing and displaying the data held in |
|
* the "display" global. |
|
********************************************************************************* |
|
*/ |
|
|
|
PI_THREAD (displayDigits) |
|
{ |
|
int digit, segment ; |
|
int index, d, segVal ; |
|
|
|
piHiPri (50) ; |
|
|
|
for (;;) |
|
{ |
|
for (digit = 0 ; digit < 6 ; ++digit) |
|
{ |
|
for (segment = 0 ; segment < 7 ; ++segment) |
|
{ |
|
d = toupper (display [digit]) ; |
|
/**/ if ((d >= '0') && (d <= '9')) // Digit |
|
index = d - '0' ; |
|
else if ((d >= 'A') && (d <= 'F')) // Hex |
|
index = d - 'A' + 10 ; |
|
else |
|
index = 16 ; // Blank |
|
|
|
segVal = segmentDigits [index * 7 + segment] ; |
|
|
|
digitalWrite (segments [segment], segVal) ; |
|
} |
|
digitalWrite (digits [digit], 1) ; |
|
delay (2) ; |
|
digitalWrite (digits [digit], 0) ; |
|
} |
|
} |
|
} |
|
|
|
|
|
/* |
|
* setup: |
|
* Initialise the hardware and start the thread |
|
********************************************************************************* |
|
*/ |
|
|
|
void setup (void) |
|
{ |
|
int i, c ; |
|
|
|
wiringPiSetup () ; |
|
|
|
// 7 segments |
|
|
|
for (i = 0 ; i < 7 ; ++i) |
|
{ digitalWrite (segments [i], 0) ; pinMode (segments [i], OUTPUT) ; } |
|
|
|
// 6 digits |
|
|
|
for (i = 0 ; i < 6 ; ++i) |
|
{ digitalWrite (digits [i], 0) ; pinMode (digits [i], OUTPUT) ; } |
|
|
|
strcpy (display, " ") ; |
|
piThreadCreate (displayDigits) ; |
|
delay (10) ; // Just to make sure it's started |
|
|
|
// Quick countdown LED test sort of thing |
|
|
|
c = 999999 ; |
|
for (i = 0 ; i < 10 ; ++i) |
|
{ |
|
sprintf (display, "%06d", c) ; |
|
delay (400) ; |
|
c -= 111111 ; |
|
} |
|
|
|
strcpy (display, " ") ; |
|
delay (400) ; |
|
|
|
#ifdef PHOTO_HACK |
|
sprintf (display, "%s", "123456") ; |
|
for (;;) |
|
delay (1000) ; |
|
#endif |
|
|
|
} |
|
|
|
|
|
/* |
|
* teenager: |
|
* No explanation needed. (Nor one given!) |
|
********************************************************************************* |
|
*/ |
|
|
|
void teenager (void) |
|
{ |
|
char *message = " feedbeef babe cafe b00b " ; |
|
int i ; |
|
|
|
for (i = 0 ; i < strlen (message) - 4 ; ++i) |
|
{ |
|
strncpy (display, &message [i], 6) ; |
|
delay (200) ; |
|
} |
|
delay (1000) ; |
|
for (i = 0 ; i < 3 ; ++i) |
|
{ |
|
strcpy (display, " ") ; |
|
delay (150) ; |
|
strcpy (display, " b00b ") ; |
|
delay (250) ; |
|
} |
|
delay (1000) ; |
|
strcpy (display, " ") ; |
|
delay (1000) ; |
|
} |
|
|
|
|
|
/* |
|
********************************************************************************* |
|
* main: |
|
* Let the fun begin |
|
********************************************************************************* |
|
*/ |
|
|
|
int main (void) |
|
{ |
|
struct tm *t ; |
|
time_t tim ; |
|
|
|
setup () ; |
|
teenager () ; |
|
|
|
tim = time (NULL) ; |
|
for (;;) |
|
{ |
|
while (time (NULL) == tim) |
|
delay (5) ; |
|
|
|
tim = time (NULL) ; |
|
t = localtime (&tim) ; |
|
|
|
sprintf (display, "%02d%02d%02d", t->tm_hour, t->tm_min, t->tm_sec) ; |
|
|
|
delay (500) ; |
|
} |
|
|
|
return 0 ; |
|
}
|
|
|