#include "avr_mcu_section.h"
AVR_MCU(F_CPU, "atmega168");
-#define N_DIGITS 6
+#define N_DIGITS 14
#define USE_17SEG 1
#if USE_17SEG
#define BYTES_PER_DIGIT 3
enum EState {
state_ShowTime = 0,
- state_ShowHour,
state_Sleep,
state_IncrementTime = (1 << 7),
enum EDecimal {
D_SECOND = 0, D_MINUTE, D_HOUR, D_DAY, D_MONTH, D_YEAR, D_MAX
};
-const uint8_t decimal_max[D_MAX] = {60, 60, 24, 31, 12, 100}; //200};
+const uint8_t decimal_max[D_MAX] = {60, 60, 24, 31, 12, 200};
const uint8_t day_max[12] = {
31, // Jan
28, // Feb
state = (state & ~0xf) | state_ShowTime;
}
-void startShowHours(uint8_t timeout /*= 4 * TICK_SECOND*/)
-{
- if (timer[delay_DisplayChange].delay != TICK_TIMER_DISABLED)
- tick_timer_reset(delay_DisplayChange, timeout);
- state = (state & ~0xf) | state_ShowHour;
-}
-
void updateTimer();
void sleepTimer();
void wakeTimer();
if (!(state & state_IncrementTime) || timer[delay_Second].delay <= 2) {
switch (state & ~state_IncrementTime) {
case state_ShowTime:
- //digits[1] |= SEG_DP;
- //digits[2] |= SEG_DP;
digits[0] |= SEG_DP; // mapped to colon
break;
- //case state_ShowHour:
- // if (state & state_IncrementTime)
- // digits[0] |= SEG_DP;
- // break;
}
}
cli();
//int restart = spi.out == spi.in;
spi.in = 0;
spi.out = 0;
-#if 0
- digits[0] = 1;
- digits[1] = 2;
- digits[2] = 4;
- digits[3] = 8;
- digits[4] = 0x10;
- digits[5] = 0x20;
-#endif
for (uint8_t bi = 0; bi < N_DIGITS; bi++)
#if USE_17SEG
{
void updateTimerDisplay()
{
- do {
- switch (state & ~state_IncrementTime) {
- case state_ShowTime: {
- if (decimalChanged & ((1 << D_DAY) | (1 << D_MONTH) | (1 << D_YEAR))) {
- startShowHours(4 * TICK_SECOND);
- break;
- }
- decimalChanged = 0;
-
- digits[0] = digits2led[decimal[D_SECOND] % 10];
- digits[1] = digits2led[decimal[D_SECOND] / 10];
- digits[2] = digits2led[decimal[D_MINUTE] % 10];
- digits[3] = digits2led[decimal[D_MINUTE] / 10];
- digits[4] = digits2led[decimal[D_HOUR] % 10];
- digits[5] = digits2led[decimal[D_HOUR] / 10];
-
- if (!(state & state_IncrementTime)) {
- //digits[1] |= SEG_DP;
- //digits[2] |= SEG_DP;
- digits[0] |= SEG_DP; // mapped to colon
- }
- } break;
- case state_ShowHour: {
-#if 0 // for testing day/month/year increments
- if (decimalChanged & ((1 << D_DAY) | (1 << D_MONTH) | (1 << D_YEAR)))
- startShowHours(4 * TICK_SECOND);
-#endif
- if (tick_timer_fired(delay_DisplayChange)) {
- decimalChanged = 1;
- startShowTime();
- break;
- }
- decimalChanged = 0;
-
- digits[0] = digits2led[decimal[D_YEAR] % 10];
- digits[1] = digits2led[decimal[D_YEAR] / 10];
- uint8_t temp = decimal[D_MONTH] + 1;
- digits[2] = digits2led[temp % 10] | SEG_DP;
- digits[3] = digits2led[temp / 10];
- /*uint8_t*/ temp = decimal[D_DAY] + 1;
- digits[4] = digits2led[temp % 10] | SEG_DP;
- digits[5] = digits2led[temp / 10];
- } break;
- // case state_Sleep: {
- /* nothing to do */
- // } break;
- }
- } while (decimalChanged);
+ switch (state & ~state_IncrementTime) {
+ case state_ShowTime: {
+ uint16_t year = decimal[D_YEAR] + 2000;
+ digits[0] = digits2led[year % 10];
+ year /= 10;
+ digits[1] = digits2led[year % 10];
+ year /= 10;
+ digits[2] = digits2led[year % 10];
+ year /= 10;
+ digits[3] = digits2led[year];
+
+ uint8_t temp = decimal[D_MONTH] + 1;
+ digits[4] = digits2led[temp % 10] | SEG_DP;
+ digits[5] = digits2led[temp / 10];
+ /*uint8_t*/ temp = decimal[D_DAY] + 1;
+ digits[6] = digits2led[temp % 10] | SEG_DP;
+ digits[7] = digits2led[temp / 10];
+ digits[8] = digits2led[decimal[D_SECOND] % 10];
+ digits[9] = digits2led[decimal[D_SECOND] / 10];
+ digits[10] = digits2led[decimal[D_MINUTE] % 10];
+ digits[11] = digits2led[decimal[D_MINUTE] / 10];
+ digits[12] = digits2led[decimal[D_HOUR] % 10];
+ digits[13] = digits2led[decimal[D_HOUR] / 10];
+
+ if (!(state & state_IncrementTime))
+ digits[0] |= SEG_DP; // mapped to colon
+ } break;
+ //case state_Sleep: {
+ // /* nothing to do */
+ //} break;
+ }
}
/*
tick_init();
- startShowHours(4 * TICK_SECOND);
+ startShowTime();
timer[delay_Second].callback = second_timer_callback;
timer[delay_Update].callback = update_timer_callback;
if (keyEvent) {
if ((keyEvent & (1 << KEY_START)) && (keyState & (1 << KEY_START)) == 0) {
if (!startTimer())
- startShowHours(4 * TICK_SECOND);
+ startShowTime();
}
if ((keyEvent & (1 << KEY_STOP)) && (keyState & (1 << KEY_STOP)) == 0) {
if (!stopTimer())
- startShowHours(4 * TICK_SECOND);
+ startShowTime();
}
if ((keyEvent & (1 << KEY_RESET)) && (keyState & (1 << KEY_RESET)) == 0) {
resetTimer();
#include "button.h"
#include "hc595.h"
-#define N_DIGITS 6
+#define N_DIGITS 14
#define ORIGIN_X 50.f
#define ORIGIN_Y 50.f
#define DIGIT_WIDTH 320.f
#define COLON_WIDTH 110.f
-#define LINE_HEIGHT 450.f
+#define LINE_HEIGHT 525.f
#define COLON_X (ORIGIN_X + 2.f * DIGIT_WIDTH)
-#define COLON_Y ORIGIN_Y
+#define COLON_Y (ORIGIN_Y + .6f * LINE_HEIGHT)
#define WINDOW_X (ORIGIN_X + 5.f * DIGIT_WIDTH + 1.5f * COLON_WIDTH)
-#define WINDOW_Y (ORIGIN_Y + LINE_HEIGHT)
+#define WINDOW_Y (ORIGIN_Y + 1.5f * LINE_HEIGHT)
#define USE_17SEG 1
#if USE_17SEG
hc595_t shifters[N_SHIFTERS];
const float digit_pos[N_DIGITS][3] = {
- {ORIGIN_X, ORIGIN_Y, 1.f},
- {ORIGIN_X + DIGIT_WIDTH, ORIGIN_Y, 1.f},
- {ORIGIN_X + 2.f * DIGIT_WIDTH + COLON_WIDTH, ORIGIN_Y, 1.f},
- {ORIGIN_X + 3.f * DIGIT_WIDTH + COLON_WIDTH, ORIGIN_Y, 1.f},
- {ORIGIN_X + 4.f * DIGIT_WIDTH + 1.5f * COLON_WIDTH, ORIGIN_Y, .5f},
- {ORIGIN_X + 4.5f * DIGIT_WIDTH + 1.5f * COLON_WIDTH, ORIGIN_Y, .5f},
+ // first row
+ {ORIGIN_X, ORIGIN_Y + .6f * LINE_HEIGHT, 1.f},
+ {ORIGIN_X + DIGIT_WIDTH, ORIGIN_Y + .6f * LINE_HEIGHT, 1.f},
+ {ORIGIN_X + 2.f * DIGIT_WIDTH + COLON_WIDTH, ORIGIN_Y + .6f * LINE_HEIGHT, 1.f},
+ {ORIGIN_X + 3.f * DIGIT_WIDTH + COLON_WIDTH, ORIGIN_Y + .6f * LINE_HEIGHT, 1.f},
+ {ORIGIN_X + 4.f * DIGIT_WIDTH + 1.5f * COLON_WIDTH, ORIGIN_Y + .6f * LINE_HEIGHT, .5f},
+ {ORIGIN_X + 4.5f * DIGIT_WIDTH + 1.5f * COLON_WIDTH, ORIGIN_Y + .6f * LINE_HEIGHT, .5f},
+ // second row
+ {ORIGIN_X, ORIGIN_Y, .5f},
+ {ORIGIN_X + .5f * DIGIT_WIDTH, ORIGIN_Y, .5f},
+ {ORIGIN_X + 1.f * DIGIT_WIDTH, ORIGIN_Y, .5f},
+ {ORIGIN_X + 1.5f * DIGIT_WIDTH, ORIGIN_Y, .5f},
+ {ORIGIN_X + 2.f * DIGIT_WIDTH, ORIGIN_Y, .5f},
+ {ORIGIN_X + 2.5f * DIGIT_WIDTH, ORIGIN_Y, .5f},
+ {ORIGIN_X + 3.f * DIGIT_WIDTH, ORIGIN_Y, .5f},
+ {ORIGIN_X + 3.5f * DIGIT_WIDTH, ORIGIN_Y, .5f},
};
int display_flag = 0;