/* Hello Wokwi! */
#include <LiquidCrystal_I2C.h>
unsigned long Hour,Minute,Second,disH,disM,disS,alaH,alaM,alaS,alaF;
LiquidCrystal_I2C lcd(0x27, 20, 4);
void disClock();//显示时间函数
void setTime();//设置时间函数
void setAlarm();//设置闹钟函数
void setup() //初始化
{
pinMode(9, INPUT_PULLUP);//四按钮
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
pinMode(13, OUTPUT);//LED闹钟
Serial.begin(9600);;
Hour=Minute=Second=alaH=alaM=alaS=alaF=0;//初始时间设为0
lcd.init();//设置表面
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("fuck");
}
void loop() //循环
{
if(!digitalRead(9))//按下设置闹钟按钮
{
alaF+=1;
}
if(alaF%2)//根据当前状态设置时间或设置闹钟
{
setAlarm();
}else{
alaF=0;
setTime();
disClock();
}
delay(200);
}
void setTime() //设置时间
{
int h,m;//进位标志
if(!digitalRead(10)) //按下按钮相应变量加一
{
Second+=1;
}else if(!digitalRead(11)){
Minute+=1;
}else if(!digitalRead(12)){
Hour+=1;
}
disS=(Second+millis() / 1000)%60; //计算时间
m=(Second+millis() / 1000)/60;
disM=(Minute+m)%60;
h=(Minute+m)/60;
disH=(Hour+h)%24;
if(disH==alaH&&disM==alaM&&disS==alaS) //达到闹钟时间灯亮
{
digitalWrite(13, HIGH);
}
}
void disClock() //输出时间
{
lcd.setCursor(5, 1);
lcd.print(disH);
lcd.print(":");
lcd.print(disM);
lcd.print(":");
lcd.print(disS);
lcd.print(" ");
}
void setAlarm() //闹钟
{
digitalWrite(13, LOW); //灭灯
lcd.setCursor(5, 1);
lcd.print(alaH);
lcd.print(":");
lcd.print(alaM);
lcd.print(":");
lcd.print(alaS);
lcd.print(" ");
if(!digitalRead(10)) //按下按钮设置闹钟
{
alaS+=1;
if(alaS>=60)alaS=0;
}else if(!digitalRead(11)){
alaM+=1;
if(alaM>=60)alaM=0;
}else if(!digitalRead(12)){
alaH+=1;
if(alaH>=24)alaH=0;
}
}