1
/* -*- mode: c++; compile-command: "BOARD=pro5v make"; -*- */
5
* Copyright (C) 2011 Tim Marston <tim@ed.am> and Dan Marston.
4
* Copyright (C) 2011 Tim Marston <edam@waxworlds.org>
7
6
* This file is part of propeller-clock (hereafter referred to as "this
8
* program"). See http://ed.am/dev/software/arduino/propeller-clock for more
7
* program"). See http://ed.am/software/arduino/propeller-clock for more
11
10
* This program is free software: you can redistribute it and/or modify
36
35
13 is at the outside.
38
37
* if a longer hand (and a larger clock face) is desired, pin 4 can be
39
used to indirectly drive a transistor which in turn drives several
40
LEDs that turn on anf off in unison in the centre of the clock.
38
used to indirectly drive (via a MOSFET) multiple LEDs which turn on
39
and off in unison in the centre of the clock.
42
41
* a button should be attached to pin 3 that grounds it when pressed.
44
* A DS1307 remote clock is connected via I2C on analog pins 4 and 5.
46
43
Implementation details:
48
* for a schematic, see ../project/propeller-clock.sch.
45
* for a schematic, see project/propeller-clock.sch.
50
47
* the timing of the drawing of the clock face is recalculated with
51
48
every rotation of the propeller.
167
// turn an led on/off
168
void ledOn( int num, bool on )
170
if( num < 0 || num > 9 ) return;
172
// convert to pin no.
175
// pin 4 needs to be inverted (it's driving a PNP)
176
// NOTE: PIN 4 TEMPORARILY DISABLED
177
// if( num == 4 ) on = true;
178
if( num == 4 ) on = !on;
180
digitalWrite( num, on? HIGH : LOW );
184
158
// draw a segment for the test display
185
void drawNextSegment_test( int segment )
159
void drawNextSegment_test( bool reset )
161
// keep track of segment
162
static unsigned int segment = 0;
163
if( reset ) segment = 0;
187
166
// turn on inside and outside LEDs
167
digitalWrite( 4, HIGH );
168
digitalWrite( 13, HIGH );
190
170
// display segment number in binary across in the inside LEDs,
191
171
// with the LED on pin 12 showing the least-significant bit
192
for( int a = 0; a < 9; a++ )
193
ledOn( 8 - a, ( segment >> a ) & 1 );
172
for( int a = 0; a < 8; a++ )
173
digitalWrite( 12 - a, ( ( segment >> a ) & 1 )? HIGH : LOW );
197
177
// draw a segment for the time display
198
void drawNextSegment_time( int segment )
178
void drawNextSegment_time( bool reset )
200
int second = segment / NUM_SECOND_SEGMENTS;
201
int second_segment = segment % NUM_SECOND_SEGMENTS;
180
static unsigned int second = 0;
181
static unsigned int segment = 0;
183
// handle display reset
203
189
// what needs to be drawn?
204
bool draw_tick = !second_segment && second % 5 == 0;
205
bool draw_second = !second_segment && second == time_seconds;
206
bool draw_minute = !second_segment && second == time_minutes;
207
bool draw_hour = !second_segment && second == time_hours;
190
bool draw_tick = !segment && second % 5 == 0;
191
bool draw_second = !segment && second == time_seconds;
192
bool draw_minute = !segment && second == time_minute;
193
bool draw_hour = !segment && second == time_hour;
211
ledOn( 8, draw_tick || draw_minute );
212
for( int a = 6; a <= 7; a++ )
213
ledOn( a, draw_minute || draw_second );
214
for( int a = 0; a <= 5; a++ )
215
ledOn( a, draw_minute || draw_second || draw_hour );
196
digitalWrite( 13, HIGH );
197
digitalWrite( 12, draw_tick || draw_minute );
198
for( int a = 10; a <= 11; a++ )
199
digitalWrite( a, draw_minute || draw_second );
200
for( int a = 4; a <= 9; a++ )
201
digitalWrite( 10, draw_minute | draw_second || draw_hour );
204
if( ++segment >= NUM_SECOND_SEGMENTS ) {