This implements 25hr Clock in LCD1602_I2C mode with alarm setting capabilities

Dependencies:   MBEDI2C_CLOCK_Timers

Revision:
0:cca0f1245b6e
Child:
1:d00e1d87ce42
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun May 22 09:16:53 2022 +0000
@@ -0,0 +1,192 @@
+
+#include "mbed.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "platform/mbed_thread.h"
+#include "LiquidCrystal_I2C.h"
+
+typedef struct Clock_Typedef
+
+{
+    int hour;
+    int Minutes;
+    int Second;
+    int Param_Select;
+    int Alarm_State;
+    char Alrm[3];
+} Clock_Typedef;
+
+
+typedef enum Clock_Set {
+    ClockTime=0,
+    ClockAlarm
+} Clock_Set;
+
+
+//structures to hold the Clock and alarm parameters
+Clock_Typedef clock1= {0};
+Clock_Typedef  Alarm= {0};
+int set_choice=0;
+char Hold[17];
+LiquidCrystal_I2C lcd(0x4E, 16, 2);
+Ticker TIMER;
+DigitalOut Buzzer(PA_5);                        //ALARM BUZZER connected to Pin PA_5
+InterruptIn CLOCK_STATE(PC_13);                  //User-button PC13 is configured as interrupt to switch from time to alarm
+InterruptIn T0_Set_Alarm(PA_6);                  //User-button PA6 is configured to set alarm by incrementinting alarm hourss,min or seconds according to setchoice in alarm stucture
+InterruptIn Increment_Alarm_par(PA_7);           //User-button PA7 is used to select which alarm parameter to setChoice of inrementinted variabale in Alarm, either Minutes or Hours
+InterruptIn ALARM_ON_OFF(PB_12);                 //User-button PC7 is used to set alarm ON or OFF
+InterruptIn To_SnoozeAlrm(PA_8);                 //User-button PA_8 is used snooze alarm for 5 minutes
+
+
+void UPdat_Alarm_Time(Clock_Typedef *Choice)
+{
+    if(set_choice==0) {
+        Choice->Minutes++;
+        if(Choice->Minutes>59) {
+            Choice->Minutes=0;
+        }
+    }
+    if(set_choice==1) {
+        Choice->hour++;
+        if(Choice->hour>23) {
+            Choice->hour=0;
+        }
+    }
+}
+void Time_increment(Clock_Typedef *Clock_Param)
+{
+    Clock_Param->Second++;
+    if(Clock_Param->Second>59)
+    {
+        Clock_Param->Second=0;
+        Clock_Param->Minutes++;
+    }
+    if(Clock_Param->Minutes>59) {
+        Clock_Param->Minutes=0;
+        Clock_Param->hour++;
+    }
+    if(Clock_Param->hour>23) {
+        Clock_Param->hour++;
+    }
+}
+
+void Set_Alarm_Time()
+{
+    if(clock1.Param_Select==0) {
+        UPdat_Alarm_Time(&clock1);
+    } else {
+        UPdat_Alarm_Time(&Alarm);
+    }
+}
+void Set_Alarm_ON_OFF()
+{
+    Buzzer=0;
+    if(++clock1.Alarm_State>1) {
+        clock1.Alarm_State=0;
+    }
+    if( clock1.Alarm_State==0)
+    {
+        sprintf(clock1.Alrm,"%s","OFF");
+    }
+    if(clock1.Alarm_State==1)
+    {
+        sprintf(clock1.Alrm,"%s","ON");
+    }
+}
+
+
+void Time_move()
+{
+    Time_increment(&clock1);
+}
+void increment(void)
+{
+    if(++set_choice>1) {
+        set_choice=0;
+    }
+}
+void Set_CLOCK_STATE(void)
+{
+    if(clock1.Param_Select==0) {
+        clock1.Param_Select=1;
+    } else {
+        clock1.Param_Select=0;
+    }
+}
+void Snooze()
+{
+        if(clock1.Alarm_State==1)
+        {
+            Buzzer=0;
+            int compu=Alarm.Minutes+5;
+            if(compu>59)
+            {
+                Alarm.Minutes=compu-60;
+                Alarm.hour++;
+                if(Alarm.hour>23)
+                {
+                    Alarm.hour=0;
+                }
+            }
+            else
+            {
+                Alarm.Minutes=compu;
+            }
+            Alarm.Alarm_State=1;
+        }
+}
+
+int IsAlarmOn(void)
+{
+    if(clock1.Alarm_State==1) 
+    {
+        if(Alarm.Minutes==clock1.Minutes && Alarm.hour==clock1.hour) {
+            return 1;
+
+        }
+    }
+    return 0;
+}
+
+int main()
+{
+    TIMER.attach(&Time_move, 1s);
+    CLOCK_STATE.mode(PullUp);
+    T0_Set_Alarm.mode(PullUp);
+    Increment_Alarm_par.mode(PullUp);
+    ALARM_ON_OFF.mode(PullUp);
+    To_SnoozeAlrm.mode(PullUp);
+    CLOCK_STATE.fall(&Set_CLOCK_STATE);
+    T0_Set_Alarm.fall(&Set_Alarm_Time);
+    Increment_Alarm_par.fall(&increment);
+    ALARM_ON_OFF.fall(&Set_Alarm_ON_OFF);
+    To_SnoozeAlrm.fall(&Snooze);
+    sprintf(clock1.Alrm,"%s","OFF");
+    while (1) {
+        switch(clock1.Param_Select) {
+            case 0:
+                lcd.clear();
+                lcd.setCursor(0,0);
+                sprintf(Hold,"TIME : %d%d:%d%d:%d%d",clock1.hour/10,clock1.hour%10,clock1.Minutes/10,clock1.Minutes%10,clock1.Second/10,clock1.Second%10);
+                lcd.print(Hold);
+                if(IsAlarmOn()==1)
+                {
+                    Buzzer=1;
+                }
+                break;
+            case 1:
+                lcd.clear();
+                lcd.setCursor(0,0);
+                sprintf(Hold,"ALARM: %d%d:%d%d",Alarm.hour/10,Alarm.hour%10,Alarm.Minutes/10, Alarm.Minutes%10);
+                lcd.print(Hold);
+                lcd.setCursor(0,1);
+                sprintf(Hold,"ALARM:%s",clock1.Alrm);
+                lcd.print(Hold);
+                IsAlarmOn();
+                break;
+        }
+        wait_us(100000);
+
+    }
+}
\ No newline at end of file