/elec/propeller-clock

To get this branch, use:
bzr branch http://bzr.ed.am/elec/propeller-clock

« back to all changes in this revision

Viewing changes to src/propeller-clock.ino

  • Committer: edam
  • Date: 2012-02-10 21:25:33 UTC
  • Revision ID: edam@waxworlds.org-20120210212533-fwi9b0isyr8my2lu
updated arduino.mk

Show diffs side-by-side

added added

removed removed

115
115
#define NUM_SECOND_SEGMENTS 5
116
116
#define NUM_SEGMENTS ( 60 * NUM_SECOND_SEGMENTS )
117
117
 
118
 
// clock direction
119
 
#define CLOCK_FORWARD 0
120
 
 
121
118
//_____________________________________________________________________________
122
119
//                                                                         code
123
120
 
174
171
 
175
172
        // pin 4 needs to be inverted (it's driving a PNP)
176
173
        // NOTE: PIN 4 TEMPORARILY DISABLED
177
 
//      if( num == 4 ) on = true;
178
 
if( num == 4 ) on = !on;
 
174
        if( num == 4 ) on = true; //!on
179
175
 
180
176
        digitalWrite( num, on? HIGH : LOW );
181
177
}
182
178
 
183
179
 
184
180
// draw a segment for the test display
185
 
void drawNextSegment_test( int segment )
 
181
void drawNextSegment_test( bool reset )
186
182
{
 
183
        // keep track of segment
 
184
        static unsigned int segment = 0;
 
185
        if( reset ) segment = 0;
 
186
        segment++;
 
187
 
187
188
        // turn on inside and outside LEDs
 
189
        ledOn( 0, true );
188
190
        ledOn( 9, true );
189
191
 
190
192
        // display segment number in binary across in the inside LEDs,
191
193
        // with the LED on pin 12 showing the least-significant bit
192
 
        for( int a = 0; a < 9; a++ )
 
194
        for( int a = 0; a < 8; a++ )
193
195
                ledOn( 8 - a, ( segment >> a ) & 1 );
194
196
}
195
197
 
196
198
 
197
199
// draw a segment for the time display
198
 
void drawNextSegment_time( int segment )
 
200
void drawNextSegment_time( bool reset )
199
201
{
200
 
        int second = segment / NUM_SECOND_SEGMENTS;
201
 
        int second_segment = segment % NUM_SECOND_SEGMENTS;
 
202
        static int second = 0;
 
203
        static int segment = 0;
 
204
 
 
205
        // handle display reset
 
206
        if( reset ) {
 
207
                second = 0;
 
208
                segment = 0;
 
209
        }
202
210
 
203
211
        // 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;
 
212
        bool draw_tick = !segment && second % 5 == 0;
 
213
        bool draw_second = !segment && second == time_seconds;
 
214
        bool draw_minute = !segment && second == time_minutes;
 
215
        bool draw_hour = !segment && second == time_hours;
208
216
 
209
217
        // set the LEDs
210
218
        ledOn( 9, true );
213
221
                ledOn( a, draw_minute || draw_second );
214
222
        for( int a = 0; a <= 5; a++ )
215
223
                ledOn( a, draw_minute || draw_second || draw_hour );
 
224
 
 
225
        // inc position
 
226
        if( ++segment >= NUM_SECOND_SEGMENTS ) {
 
227
                segment = 0;
 
228
                second++;
 
229
        }
216
230
}
217
231
 
218
232
 
221
235
{
222
236
        static int draw_mode = 0;
223
237
 
224
 
        // keep track of segment
225
 
#if CLOCK_FORWARD
226
 
        static int segment = 0;
227
 
        if( reset ) segment = 0;
228
 
#else
229
 
        static int segment = NUM_SEGMENTS - 1;
230
 
        if( reset ) segment = NUM_SEGMENTS - 1;
231
 
#endif
232
 
 
233
238
        // handle mode switch requests
234
239
        if( reset && inc_draw_mode ) {
235
240
                inc_draw_mode = false;
240
245
 
241
246
        // draw the segment
242
247
        switch( draw_mode ) {
243
 
        case 0: drawNextSegment_test( segment ); break;
244
 
        case 1: drawNextSegment_time( segment ); break;
 
248
        case 0: drawNextSegment_test( reset ); break;
 
249
        case 1: drawNextSegment_time( reset ); break;
245
250
        }
246
 
 
247
 
#if CLOCK_FORWARD
248
 
        segment++;
249
 
#else
250
 
        segment--;
251
 
#endif
252
251
}
253
252
 
254
253