項(xiàng)目15-任務(wù)20-小組18
DS3231?+?LCD顯示?+?按鍵調(diào)表(畫出電路圖屯烦,寫出包含完整注釋的代碼舔株,連接幾個(gè)按鍵洁灵,實(shí)現(xiàn)從運(yùn)行狀態(tài)到調(diào)表狀態(tài)切換饱岸、年月日時(shí)分秒字段的切換、數(shù)值的增減等)
LCD1602
工業(yè)字符型液晶徽千,能夠同時(shí)顯示16x02即32個(gè)字符苫费。(16列2行)1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)双抽。
1602液晶也叫1602字符型液晶百框,它是一種專門用來顯示字母、數(shù)字牍汹、符號等的點(diǎn)陣型液晶模塊铐维。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符慎菲,每位之間有一個(gè)點(diǎn)距的間隔嫁蛇,每行之間也有間隔,起到了字符間距和行間距的作用露该,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形睬棚。
LCD引腳說明
第1腳:VSS為電源地
第2腳:VCC接5V電源正極
第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時(shí)對比度最弱解幼,接地電源時(shí)對比度最高(對比度過高時(shí)會
產(chǎn)生“鬼影”抑党,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對比度)。
第4腳:RS為寄存器選擇书幕,高電平1時(shí)選擇數(shù)據(jù)寄存器新荤、低電平0時(shí)選擇指令寄存器。
第5腳:RW為讀寫信號線台汇,高電平(1)時(shí)進(jìn)行讀操作苛骨,低電平(0)時(shí)進(jìn)行寫操作篱瞎。
第6腳:E(或EN)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令痒芝。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)端俐筋。
第15~16腳:空腳或背燈電源。15腳背光正極严衬,16腳背光負(fù)極澄者。
按鍵調(diào)表實(shí)驗(yàn)
實(shí)驗(yàn)代碼
#include <DS3231.h> //時(shí)鐘模塊的庫
#include <LiquidCrystal.h> //1602庫文件
#define Key1 8 //設(shè)置按鍵
#define Key2 9 //加按鍵
#define Key3 10 //減按鍵
LiquidCrystal lcd(7,6,5,4,3,2); //定義1602腳位
DS3231 Clock;
byte count = 0; //設(shè)置按鍵按下次數(shù)
bool Century=false;
bool h12;
bool APM;
byte year, month, date, hour, minute, second; //時(shí)間變量
void setup() {
Wire.begin(); //IIC初始化
lcd.begin(16,2); //1602初始化
Serial.begin(115200); //串口波特率115200
pinMode(Key1,INPUT_PULLUP);
pinMode(Key2,INPUT_PULLUP); //按鍵設(shè)置為輸入上拉模式,默認(rèn)高電平 pinMode(Key3,INPUT_PULLUP);
}
void loop() { //主程序
KeyPress(); //按鍵掃描
if(count==0){ //如果設(shè)置鍵未按下
ReadDS3231(); //正常走時(shí)
}
}
void LIMIT(byte &x,byte Min,byte Max) //用于限制最大最小值
{
if(x < Min)x = Max;
else if(x > Max)x = Min;
else x;
}
void KeyPress() //按鍵掃描
{ if(!digitalRead(Key1)) //設(shè)置按鍵按下
{ delay(5); //消抖
if(!digitalRead(Key1))
{
count>5 ? count=0 : count++; //計(jì)數(shù)值+1请琳,最大到6
switch(count){
case1:lcd.clear();lcd.setCursor(0,0);lcd.print("SetYear");lcd.setCursor(9,0);lcd.print(2000+year);break; //顯示界面相應(yīng)變化
case2:lcd.clear();lcd.setCursor(0,0);lcd.print("SetMonth");lcd.setCursor(9,0);lcd.print(month);break;
case3:lcd.clear();lcd.setCursor(0,0);lcd.print("SetDate");lcd.setCursor(9,0);lcd.print(date);break;
case4:lcd.clear();lcd.setCursor(0,0);lcd.print("SetHour");lcd.setCursor(9,0);lcd.print(hour);break;
case5:lcd.clear();lcd.setCursor(0,0);lcd.print("SetMinu");lcd.setCursor(9,0);lcd.print(minute);break;
case6:lcd.clear();lcd.setCursor(0,0);lcd.print("SetSec");lcd.setCursor(9,0);lcd.print(second);break;
default:Clock.setYear(year); //將調(diào)整后的時(shí)間寫到時(shí)鐘芯片中
Clock.setMonth(month);
Clock.setDate(date);
Clock.setHour(hour);
Clock.setMinute(minute);
Clock.setSecond(second);
break;
}
while(!digitalRead(Key1)); //等待松開按鍵
}
}
if(!digitalRead(Key2)) //+按鍵按下
{
delay(5);
if(!digitalRead(Key2))
{
switch(count){
case1:year++;LIMIT(year,0,99);lcd.clear();lcd.setCursor(0,0);lcd.print("SetYear");lcd.setCursor(9,0);lcd.print(2000+year);break;//年份+1并顯示
case2:month++;LIMIT(month,1,12);lcd.clear();lcd.setCursor(0,0);lcd.print("SetMonth");lcd.setCursor(9,0);lcd.print(month);break; //月份+1粱挡,以下同理
case3:date++;LIMIT(date,1,31);lcd.clear();lcd.setCursor(0,0);lcd.print("SetDate");lcd.setCursor(9,0);lcd.print(date);break;
case4:hour++;LIMIT(hour,0,23);lcd.clear();lcd.setCursor(0,0);lcd.print("SetHour");lcd.setCursor(9,0);lcd.print(hour);break;
case5:minute++;LIMIT(minute,0,59);lcd.clear();lcd.setCursor(0,0);lcd.print("SetMinu");lcd.setCursor(9,0);lcd.print(minute);break;
case6:second++;LIMIT(second,0,59);lcd.clear();lcd.setCursor(0,0);lcd.print("SetSec");lcd.setCursor(9,0);lcd.print(second);break; default:break; }
while(!digitalRead(Key2));
}
}
if(!digitalRead(Key3)) //-按鍵按下
{
delay(5);
if(!digitalRead(Key3))
{
switch(count){
case1:year-;LIMIT(year,0,99);lcd.clear();lcd.setCursor(0,0);lcd.print("SetYear");lcd.setCursor(9,0);lcd.print(2000+year);break;//年份-1并顯示,以下同理
case2:month-;LIMIT(month,1,12);lcd.clear();lcd.setCursor(0,0);lcd.print("SetMonth");lcd.setCursor(9,0);lcd.print(month);break;
case3:date-;LIMIT(date,1,31);lcd.clear();lcd.setCursor(0,0);lcd.print("SetDate");lcd.setCursor(9,0);lcd.print(date);break;
case4:hour-;LIMIT(hour,0,23);lcd.clear();lcd.setCursor(0,0);lcd.print("SetHour");lcd.setCursor(9,0);lcd.print(hour);break;
case5:minute-;LIMIT(minute,0,59);lcd.clear();lcd.setCursor(0,0);lcd.print("SetMinu");lcd.setCursor(9,0);lcd.print(minute);break;
case6:second-;LIMIT(second,0,59);lcd.clear();lcd.setCursor(0,0);lcd.print("SetSec");lcd.setCursor(9,0);lcd.print(second);break; default:break; }
while(!digitalRead(Key3));
}}
}
void ReadDS3231() //從時(shí)鐘芯片讀取時(shí)間
{
second=Clock.getSecond();
minute=Clock.getMinute();
hour=Clock.getHour(h12,APM);
date=Clock.getDate();
month=Clock.getMonth(Century);
year=Clock.getYear();
lcd.clear(); //清屏幕
lcd.setCursor(3,0); //設(shè)置顯示位置
lcd.print(2000+year); //顯示年份俄精,以下同理
lcd.print('-');
lcd.print(month);
lcd.print('-');
lcd.print(date);
lcd.setCursor(4,1);
lcd.print(hour);
lcd.print(':');
lcd.print(minute);
lcd.print(':');
lcd.print(second);
Serial.print("20"); //串口輸出時(shí)間询筏,方便調(diào)試程序,可以刪除
Serial.print(year,DEC);
Serial.print('-');
Serial.print(month,DEC);
Serial.print('-');
Serial.print(date,DEC);
Serial.print(' ');
Serial.print(hour,DEC);
Serial.print(':');
Serial.print(minute,DEC);
Serial.print(':');
Serial.print(second,DEC);
Serial.print('\n'); delay(250); //延時(shí)800毫秒竖慧,防止屏幕刷新太快顯示不清楚
}