Remove separate hours display and always show hh:mm:ss dd:mm:yyyy on 2 lines
authorNick Downing <nick@ndcode.org>
Thu, 24 Mar 2022 13:03:31 +0000 (00:03 +1100)
committerNick Downing <nick@ndcode.org>
Thu, 24 Mar 2022 13:04:30 +0000 (00:04 +1100)
examples/board_clock_7seg/atmega168_clock_7seg.c
examples/board_clock_7seg/clock_7seg.c

index 52551a0..2be468b 100644 (file)
@@ -30,7 +30,7 @@
 #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
@@ -117,7 +117,6 @@ enum EKEYS {
 
 enum EState {
   state_ShowTime = 0,
-  state_ShowHour,
   state_Sleep,
   
   state_IncrementTime = (1 << 7),
@@ -135,7 +134,7 @@ uint8_t digits[N_DIGITS];
 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
@@ -322,13 +321,6 @@ void startShowTime()
   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();
@@ -396,14 +388,8 @@ void updateTimer()
   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();
@@ -411,14 +397,6 @@ void updateTimer()
   //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
   {
@@ -436,54 +414,37 @@ void updateTimer()
 
 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;
+  }
 }
 
 /*
@@ -558,7 +519,7 @@ int main(void)
 
   tick_init();
 
-  startShowHours(4 * TICK_SECOND);
+  startShowTime();
   
   timer[delay_Second].callback = second_timer_callback;
   timer[delay_Update].callback = update_timer_callback;
@@ -598,11 +559,11 @@ int main(void)
         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();
index 8b475ba..468d034 100644 (file)
 #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
@@ -76,12 +76,22 @@ avr_vcd_t vcd_file;
 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;