222 lines
4.3 KiB
C
222 lines
4.3 KiB
C
/*
|
|
* 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 ;
|
|
}
|