欢迎光临散文网 会员登陆 & 注册

八八八八

2023-06-06 09:49 作者:芜湖男神建勋  | 我要投稿

//8563时钟模块、DHT11模块。

//在LCD上显示时钟和日历,温度和湿度。通过确认键切换显示内容。#include <Rtc Pcf8563.h>

#include <Liquidcrystal.h>

#include"dht11.h”

Rtc_Pcf8563rtc; //定义一个对象rtc

dht11 DHT11;

#define DHT11PIN2 //定义DHT11模块引脚

//LCD1602 引脚

const intrs=8, en=9, d4= 4, d5= 5,d6= 6,d7=7;//LCD1602引脚

LiquidCrystallcd(rs, en, d4, d5, d6, d7);

byte day, weekday, month, century, year; //定义日期变量

byte hr, minute, sec; //定义时间变量

char time_str[16]; //时间

char data str[16] ; //日历

char strout [8];

char time_Out[16];

intkey_in = A0; //模拟量按键

intkey_v[4]= (0x2D,0x13,0x8,0x00 );//预存键值

intflag=0; //显示时钟状态

intflag1= 0xff; //初始没有按键状态

int key; //按键

int key1; //防止重键

String week[7] ={"Mon","Tue ", "Wed ","Thur", "Fri","sat ", "Sun "};

byte Centigrade[8]={ //定义C显示符号

  B10000,

  B00110,

  B01001,

  B01000,

  B01000,

  B01001,

  B00110,

  B00000

};

void setup() {

  lcd.begin(16,2); //液晶初始化

  lcd.createChar(0, Centigrade); //在地址0创造C字符

  getclock(); //读取当前时钟

}

void loop() { //主循环函数

  read key();

  if(key != 0)

{

    switch (key)(

      case l: Select(); break; //选择键

      case 2: Reduce(); break; //增加键

      case3:Increase(); break; //减少键

      case 4: Return(); break; //确认键

       }

    key =0;

}

  if (flag == 0)

    time display();

  else if (flag ==1)

    temp display();

  else if(flag == 2)

    set display();

}

void getclock(){ //读日历、时钟

  rtc.getDateTime();

  sec = rtc.getSecond();

  minute = rtc.getMinute();

  hr=rtc.getHour();

  day = rtc.getDay();

  month = rtc.getMonth();

  year = rtc.getYear();

  weekday = rtc.getWeekday();

}

voidset display() {//参数修改状态,在相应位置光标闪烁

  lcd.cursor();

  lcd.blink();

  if (flagl != 0xff) {

    switch (flag1) {

    case 0: 1cd.setCursor(10,0);lcd.print(sec /10);lcd.print(sec % 10);1cd.setCursor(11, 0); break;

    case 1: 1cd.setCursor(7, 0);1cd.print(minute / 10); 1cd.print(minute /10);lcd.setCursor(8, 0);break;

    case 2: lcd.setCursor(4, 0);lcd.print(hr /10); lcd.print(hr % 10); 1cd.setCursor(5, 0); break;

    case 3: lcd.setCursor(12,1);1cd.print(week[weekday -1]);1cd.setCursor(15,1);break;

    case 4:lcd.setCursor(8, 1);lcd.print(day/ 10);lcd.print(day % 10);1cd.setCursor(9, 1);break;

    case5:lcd.setCursor(5, 1);1cd.print(month /10);lcd.print(month % 10);lcd.setCursor(6, 1); break;

    case6:lcd.setCursor(0,1);lcd.print("20");lcd.print(year/10);lcd.print(year810);lcd.setCursor(3,1); break;

    }

  }

}

void time_display() //显示日历、时钟

{

  lcd.noCursor();

  lcd.noBlink();

  lcd.setCursor(4, 0);

  lcd.print(rtc.formatTime());

  lcd.setCursor(0,1);

  lcd.print(rtc.formatDate(RTCC_DATE_ASIA));

  lcd.setCursor(12,1);

  lcd.print(week[rtc.getWeekday() -1]);

}

void temp_display() { //温湿度显示

  DHT11.read(DHT11PIN);

  int temperature = DHT11.temperature; //温度

  int humidity = DHT11.humidity; //湿度

  lcd.setCursor(4, 0);

  lcd.print("T=");

  lcd.print(temperature);

  lcd.write(byte(0));

  lcd.print("");

  lcd.setCursor(4, 1);

  lcd.print("H=");

  lcd.print(humiditv);

  lcd.print("% ");

}

void read_key() {  //读按键

  int key_Value = analogRead(A0) >> 4;  //读取AD高8位

  if(key Value != 0x3f) {                //无键按下时键值是0x3f

    delay(120);

    key Value = analogRead(key_in) >> 4;

    if(key_Value != 0x3f) {

      for (int i= 0; i < 4; i++) {

if (key_Value >= key_v[i] -1 && key_Value <= key_v[i]+ 1) //取一个范围

            key=i +1; //键值从1开始 

      }

    }

    if (key1 != key) //防止连键

      keyl = key;

    else

      key=0;

  }

}

void Select() { //参数修改键

  getclock();

  rtc.setDateTime (day, weekday, month, 0, year, hr, minute, sec); 

  if (flag == 1) {

    flag = 0;

    }

  else  {

    flag=2;

    if  (flag1==0xff)

      flaq1= 0;

    elseif (flag1 < 6){

      flag1 +=1;

      rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);

    }

    else flagl=0;

  }

}

void Reduce() { //减少键

  if (flag1 !=0xff) {

    switch (flag1) {

      case 0: if(sec == 0) sec = 59; else sec -= 1; break;

      case l: if(minute==0) minute = 59; else minute -= 1; break;

      case 2: if(hr== 0) hr=23; else hr -= 1; break;

      case 3: if (weekday==1) weekday =7; else weekday -= 1;break;

      case 4: if (day==1) day = 31;else day -= 1; break;

      case 5: if(month == 1) month = 12;else month -= 1; break;

      case 6: if(year == 0) year = 99;else year -= 1; break;

    }

    rtc.setDateTime (day, weekday, month, 0, year, hr, minute, sec);

    }

}

void Increase() {//增加键

  if (flag1!=0xff) {

    switch(flag1) {

      case 0: if (sec == 59) sec =0; else sec += 1; break;

      case 1:if (minute ==59) minute = 0; else minute += 1; break;

      case 2:if (hr == 23) hr=0; else hr +=1;break;

      case 3: if (weekday ==7) weekday = 1; else weekday += 1;break;

      case 4:if (day ==31) day =1;else day += 1; break;

      case 5: if (month == 12)month = 1; else month += 1; break;

      case 6: if (year == 99) year = 0; else year += 1; break;

    }

    rtc.setDateTime(day, weekday, month, 0, year, hr, minute, sec);一

  }

}

void Return() {//确认键

  if (flag1 != Oxff) {

    rtc.setDateTime (day, weekday, month, 0, year, hr, minute, sec);

    flagl = 0xff;

    flag = 0;

  }

  else {

    flag =!flag;

    lcd.clear();

    flagl=0xff;

  }

}


八八八八的评论 (共 条)

分享到微博请遵守国家法律