Browse Source

Финиш.

Vladimir N. Shilov 7 years ago
parent
commit
0ee07327c1
2 changed files with 97 additions and 64 deletions
  1. 67 34
      main.c
  2. 30 30
      main.h

+ 67 - 34
main.c

@@ -18,6 +18,7 @@ __C_task void main(void)
   INDCTR_COMMON_PORT = ~INDCTR_COMMON_ALL; // off all indikators
 
   Flag2.needDot = 0;
+  Flag2.blinkIndktr = 0;
 
   /* Timer0 every 4 ms switch showing LED */
   TCCR0 = TIM0_PRESCALER;
@@ -65,8 +66,8 @@ __C_task void main(void)
       switch (State) {
       case show_HHMM:
         // every 25 and 55 seconds shoe temperature for 5 seconds
-        if ((25 == Clock.seconds) || (55 == Clock.seconds)) {
-          State = show_TEMPt;
+        if ((0x25 == Clock.seconds) || (0x55 == Clock.seconds)) {
+          State = show_TEMP;
           counterShowTemp = PERIOD_SHT;
           showTEMP();
         } else {
@@ -77,6 +78,10 @@ __C_task void main(void)
       case show_MMSS:
         showMMSS();
         break;
+
+      case set_TIME:
+        showHHMM();
+        break;
         
       default:
         break;
@@ -96,7 +101,7 @@ __C_task void main(void)
 
     if (1 == Flag.newTemp) {
       Flag.newTemp = 0;
-      if ((show_TEMPt == State) || (show_TEMPp == State)) {
+      if (show_TEMP == State) {
         showTEMP();
       }
     } // end of Flag.newTemp
@@ -111,50 +116,55 @@ __C_task void main(void)
       switch (btn) {
       case btn_1:
         // show HH:MM
-        State = show_HHMM;
-        counterShowTemp = 0;
-        showHHMM();
+        if (State != set_TIME) {
+          State = show_HHMM;
+          counterShowTemp = 0;
+          showHHMM();
+        }
         break;
 
       case btn_2:
         // show MM SS
-        State = show_MMSS;
-        Flag2.needDot = 1;
-        counterShowTemp = 0;
-        showMMSS();
+        if (State != set_TIME) {
+          State = show_MMSS;
+          Flag2.needDot = 1;
+          counterShowTemp = 0;
+          showMMSS();
+        }
         break;
 
       case btn_3:
         // show temperature
-        State = show_TEMPp;
-        Flag2.needDot = 0;
-        counterShowTemp = 0;
-        showTEMP();
+        if (State != set_TIME) {
+          State = show_TEMP;
+          Flag2.needDot = 0;
+          counterShowTemp = 0;
+          showTEMP();
+        }
         break;
 
       case btn_4:
         // time --
-        if (Flag.setTime == 1) {
+        if (set_TIME == State) {
           mm = bcd2bin(Clock.minutes);
           hh = bcd2bin(Clock.hours);
-          if (mm > 0) {
-            mm --;
-          } else {
+          mm --;
+          if (mm > 59) {
             mm = 59;
-            if (hh > 0) {
-              hh --;
-            } else {
+            hh --;
+            if (hh >23 ) {
               hh = 23;
             }
           }
           Clock.minutes = bin2bcd(mm);
           Clock.hours = bin2bcd(hh);
+          Flag.newTime = 1;
         }
         break;
 
       case btn_5:
         // time ++
-        if (Flag.setTime == 1) {
+        if (set_TIME == State) {
           mm = bcd2bin(Clock.minutes);
           hh = bcd2bin(Clock.hours);
           mm ++;
@@ -167,24 +177,29 @@ __C_task void main(void)
           }
           Clock.minutes = bin2bcd(mm);
           Clock.hours = bin2bcd(hh);
+          Flag.newTime = 1;
         }
         break;
 
       case btn_6:
         // save new time
-        if (Flag.setTime == 1) {
-          Flag.setTime = 0;
-          Flag2.blankIndktr = 0;
+        if (set_TIME == State) {
+          State = show_HHMM;
+          Flag2.blinkIndktr = 0;
           setTime();
           counterTWI = PERIOD_TWI;
+          Flag.newTime = 1;
         }
         break;
 
       case btn_7:
         // time set
-        Flag.setTime = 1;
-        Flag2.blankIndktr = 1;
-        counterTWI = 0;
+        if (show_HHMM == State) {
+          State = set_TIME;
+          Flag2.blinkIndktr = 1;
+          Flag2.needDot = 1;
+          counterTWI = 0;
+        }
         break;
 
       default:
@@ -205,16 +220,33 @@ __C_task void main(void)
  *  S u b r o u t i n e s
  */
 static uint8_t bcd2bin(uint8_t bcd) {
-  return (10*(bcd>>4)|(bcd&0x0f));
+//  return ((10*(bcd>>4))|(bcd&0x0f));
+    uint8_t Temp = bcd & 0x0F;
+    while (bcd>=0x10)
+    {
+        Temp += 10;
+        bcd -= 0x10;
+    }
+    return Temp;
 }
 
 static uint8_t bin2bcd(uint8_t bin) {
-  return (((bin/10)<<4)|(bin%10));
+//  return (((bin/10)<<4)|(bin%10));
+    uint8_t Temp = 0;
+    while(bin>9)
+    {
+        Temp += 0x10;
+        bin-=10;
+    }
+    return Temp+bin;
 }
 
 static void showHHMM(void) {
-  State = show_HHMM;
-  Indicator1 = IndctrNums[(0x0F & (Clock.hours>>4))];
+  if (Clock.hours > 9) {
+    Indicator1 = IndctrNums[(0x0F & (Clock.hours>>4))];
+  } else {
+    Indicator1 = Sym_blank;
+  }
   Indicator2 = IndctrNums[(0x0F & Clock.hours)];
   Indicator3 = IndctrNums[(0x0F & (Clock.minutes>>4))];
   Indicator4 = IndctrNums[(0x0F & Clock.minutes)];
@@ -294,12 +326,12 @@ static void getTime(void) {
   if (show_HHMM == State) {
     if (old_sec != Clock.seconds) {
       Flag2.needDot = 1;
+      old_sec = Clock.seconds;
     } else {
       Flag2.needDot = 0;
     }
   }
 
-  old_sec = Clock.seconds;
   Flag.newTime = 1;
 }
 
@@ -495,10 +527,11 @@ __interrupt void TIMER0_OVF_ISR(void) {
   TCNT0 = TIM0_CNT; // reload timer
 
   INDCTR_COMMON_PORT &= ~INDCTR_COMMON_ALL; // off all indikators
+  INDCTR_SEGMENT_PORT = 0;
 
   Flag2.waitIndktr = 0;
 
-  if (1 == Flag2.blankIndktr) {
+  if (1 == Flag2.blinkIndktr) {
     if (blank_time <= 150) {
       flag = 1;
       blank_time ++;

+ 30 - 30
main.h

@@ -41,14 +41,14 @@
  */
 #define INDCTR_SEGMENT_PORT        PORTB
 #define INDCTR_SEGMENT_DDR         DDRB
-#define INDCTR_SEGMENT_A           PB0
-#define INDCTR_SEGMENT_B           PB2
-#define INDCTR_SEGMENT_C           PB4
-#define INDCTR_SEGMENT_D           PB6
-#define INDCTR_SEGMENT_E           PB7
-#define INDCTR_SEGMENT_F           PB1
-#define INDCTR_SEGMENT_G           PB3
-#define INDCTR_SEGMENT_H           PB5
+#define INDCTR_SEGMENT_A           (1<<PB0)
+#define INDCTR_SEGMENT_B           (1<<PB2)
+#define INDCTR_SEGMENT_C           (1<<PB4)
+#define INDCTR_SEGMENT_D           (1<<PB6)
+#define INDCTR_SEGMENT_E           (1<<PB7)
+#define INDCTR_SEGMENT_F           (1<<PB1)
+#define INDCTR_SEGMENT_G           (1<<PB3)
+#define INDCTR_SEGMENT_H           (1<<PB5)
 
 #define INDCTR_COMMON_PORT         PORTD
 #define INDCTR_COMMON_DDR          DDRD
@@ -68,7 +68,7 @@ typedef enum {
   Sym_4 = 0x1E,
   Sym_5 = 0x5B,
   Sym_6 = 0xDB,
-  Sym_7 = 0x19,
+  Sym_7 = 0x15,
   Sym_8 = 0xDF,
   Sym_9 = 0x5F,
   Sym_a = 0x9F,
@@ -77,12 +77,12 @@ typedef enum {
   Sym_d = 0xDC,
   Sym_e = 0xCB,
   Sym_f = 0x8B,
-  Sym_minus = 1<<INDCTR_SEGMENT_G,
-  Sym_minus_t = 1<<INDCTR_SEGMENT_A,
-  Sym_minus_b = 1<<INDCTR_SEGMENT_D,
+  Sym_minus = INDCTR_SEGMENT_G,
+  Sym_minus_t = INDCTR_SEGMENT_A,
+  Sym_minus_b = INDCTR_SEGMENT_D,
   Sym_gradus = 0x0F,
   Sym_t = 0xCA,
-  Sym_dot = 1<<INDCTR_SEGMENT_H,
+  Sym_dot = INDCTR_SEGMENT_H,
   Sym_blank = 0x00
 } indctr_sym_t;
 
@@ -163,43 +163,43 @@ typedef struct {
 } time_t;
 
 /* Global varaibles */
-typedef enum {
-  show_None = 0,
-  show_HHMM,
-  show_MMSS,
-  show_TEMPp,
-  show_TEMPt
-} state_t;
+__no_init indctr_sym_t Indicator1 @15;
+__no_init indctr_sym_t Indicator2 @14;
+__no_init indctr_sym_t Indicator3 @13;
+__no_init indctr_sym_t Indicator4 @12;
+__no_init uint8_t resultADC @11;
 
 __no_init struct {
   uint8_t newTime       : 1;
   uint8_t newTemp       : 1;
   uint8_t newBTN        : 1;
-  uint8_t T1OC          : 1;
-  uint8_t setTime       : 1;
   uint8_t getTime       : 1;
   uint8_t startDS18B20  : 1;
   uint8_t readDS18B20   : 1;
+  uint8_t               : 2;
 } Flag @10;
 
 __no_init struct {
   uint8_t needDot       : 1;
-  uint8_t blankIndktr   : 1;
+  uint8_t blinkIndktr   : 1;
   uint8_t waitIndktr    : 1;
   uint8_t               : 5;
 } Flag2 @9;
 
+typedef enum {
+  show_None = 0,
+  show_HHMM,
+  show_MMSS,
+  show_TEMP,
+  set_TIME
+} state_t;
+
 __no_init state_t State @8;
-__no_init indctr_sym_t Indicator1 @15;
-__no_init indctr_sym_t Indicator2 @14;
-__no_init indctr_sym_t Indicator3 @13;
-__no_init indctr_sym_t Indicator4 @12;
-__no_init uint8_t resultADC @11;
 
-static uint8_t twi_buf[8];
+static uint8_t twi_buf[5];
 static time_t Clock;
 
-#define PERIOD_ADC      50
+#define PERIOD_ADC      100
 #define PERIOD_TWI      500
 #define PERIOD_SHT      5000
 #define PERIOD_DS18B20s 10000