|
本帖最后由 man1234567 于 2023-10-27 09:59 編輯
主要看主程序里的注釋自己調(diào)整就好,總體感覺(jué)有些啰嗦有點(diǎn)亂 
#include <REGX51.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Timer0.h"
#include "Key.h"
unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;
void TimeShow(void)//讀時(shí)間并按指定位置顯示
{
DS1302_ReadTime();//讀時(shí)間
LCD_ShowNum(1,1,DS1302_Time[0],2);//按指定位置顯示年
LCD_ShowNum(1,4,DS1302_Time[1],2);//按指定位置顯示月
LCD_ShowNum(1,7,DS1302_Time[2],2);//按指定位置顯示日
LCD_ShowNum(2,1,DS1302_Time[3],2);//按指定位置顯示時(shí)
LCD_ShowNum(2,4,DS1302_Time[4],2);//按指定位置顯示分
LCD_ShowNum(2,7,DS1302_Time[5],2);//按指定位置顯示秒
}
void TimeSet(void)//修改時(shí)間并實(shí)時(shí)顯示
{
if(KeyNum==2)//按下2號(hào)鍵
{
TimeSetSelect++;//年月日時(shí)分秒循環(huán)跳轉(zhuǎn)
if(TimeSetSelect>5)//單向跳轉(zhuǎn)的防溢出
{
TimeSetSelect=0;
}
}
if(KeyNum==3)//按下3號(hào)鍵
{
DS1302_Time[TimeSetSelect]++;//時(shí)間內(nèi)容循環(huán)跳轉(zhuǎn),上行,+
if(DS1302_Time[0]>99){DS1302_Time[0]=0;}//年
if(DS1302_Time[1]>12){DS1302_Time[1]=1;}//月
if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12)//適應(yīng)月大小等
{
if(DS1302_Time[2]>31)//雙月大防溢出
{
DS1302_Time[2]=1;
}
}
else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)//單月小防溢出
{
if(DS1302_Time[2]>30)
{
DS1302_Time[2]=1;
}
}
else if(DS1302_Time[1]==2)//2月平潤(rùn)防溢出
{
if(DS1302_Time[0]%4==0)
{
if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
}
else
{
if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
}
}
if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//時(shí)防溢出
if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分防溢出
if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒防溢出
// DS1302_SetTime();//不奇怪,原因看看主程序注釋。
}
if(KeyNum==4)////時(shí)間內(nèi)容循環(huán)跳轉(zhuǎn),下行,-
{
DS1302_Time[TimeSetSelect]--;
if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//同+相關(guān)原理,有些啰嗦可以合寫
if(DS1302_Time[1]<1){DS1302_Time[1]=12;}
if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12)
{
if(DS1302_Time[2]<1)
{
DS1302_Time[2]=31;
}
if(DS1302_Time[2]>31)
{
DS1302_Time[2]=1;
}
}
else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
{
if(DS1302_Time[2]<1)
{
DS1302_Time[2]=30;
}
if(DS1302_Time[2]>30)
{
DS1302_Time[2]=1;
}
}
else if(DS1302_Time[1]==2)
{
if(DS1302_Time[0]%4==0)
{
if(DS1302_Time[2]<1){DS1302_Time[2]=29;}
if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
}
else
{
if(DS1302_Time[2]<1){DS1302_Time[2]=28;}
if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
}
DS1302_SetTime();
}
if(DS1302_Time[3]<0){DS1302_Time[3]=23;}
if(DS1302_Time[4]<0){DS1302_Time[4]=59;}
if(DS1302_Time[5]<0){DS1302_Time[5]=59;}
}
if(TimeSetSelect==0&&TimeSetFlashFlag==1){LCD_ShowString(1,1," ");}//依選擇調(diào)整類別的顯示定位,同樣感覺(jué)啰嗦
else{ LCD_ShowNum(1,1,DS1302_Time[0],2);}
if(TimeSetSelect==1&&TimeSetFlashFlag==1){LCD_ShowString(1,4," ");}
else{ LCD_ShowNum(1,4,DS1302_Time[1],2);}
if(TimeSetSelect==2&&TimeSetFlashFlag==1){LCD_ShowString(1,7," ");}
else{ LCD_ShowNum(1,7,DS1302_Time[2],2);}
if(TimeSetSelect==3&&TimeSetFlashFlag==1){LCD_ShowString(2,1," ");}
else{ LCD_ShowNum(2,1,DS1302_Time[3],2);}
if(TimeSetSelect==4&&TimeSetFlashFlag==1){LCD_ShowString(2,4," ");}
else{ LCD_ShowNum(2,4,DS1302_Time[4],2);}
if(TimeSetSelect==5&&TimeSetFlashFlag==1){LCD_ShowString(2,7," ");}
else{ LCD_ShowNum(2,7,DS1302_Time[5],2);}
// DS1302_SetTime();//寫時(shí)間,可以退出調(diào)整后寫,否則過(guò)于頻繁
}
void main()
{
LCD_Init();//1602初始化,圖片中正常顯示就沒(méi)看了
DS1302_Init();//1302初始化,圖片中正常顯示就沒(méi)看了
Timer0_Init();//定時(shí)器初始化,建議在調(diào)整時(shí)間開(kāi)始時(shí)執(zhí)行,停留在調(diào)時(shí)狀態(tài)過(guò)長(zhǎng)時(shí)自動(dòng)返回顯示
LCD_ShowString(1,1," - - ");//美化上行
LCD_ShowString(2,1," : : ");//美化下行
while(1)//主循環(huán),先讀按鍵,有1按下時(shí)反轉(zhuǎn)狀態(tài)關(guān)并執(zhí)行相關(guān)語(yǔ)句,然后有無(wú)按1鍵都選擇狀態(tài)執(zhí)行顯示/寫時(shí)。
{
KeyNum=Key();//讀按鍵,1為調(diào)時(shí)/顯時(shí)切換,2為調(diào)時(shí)時(shí)選擇調(diào)整類別,3、4分別是調(diào)整的+和-。
if(KeyNum==1)//按下1號(hào)鍵后切換調(diào)時(shí)/顯示
{
if(MODE==0)//如果正常顯示時(shí)
{
MODE=1;//立即先切換到調(diào)時(shí)模式
TimeSetSelect=0;//然后選擇從年開(kāi)始調(diào)整,然后并不立即調(diào)時(shí),而是隨后寫入時(shí)間
}
else if(MODE==1)//如果調(diào)時(shí)模式時(shí)
{
MODE=0;//立即先切換到正常顯示模式,然后執(zhí)行調(diào)時(shí)
DS1302_SetTime();//開(kāi)始調(diào)時(shí),隨后不執(zhí)行寫時(shí)(TimeSet();),往下執(zhí)行就是顯示新讀取1302的時(shí)間
}
}
switch(MODE)//選擇顯時(shí)(模式0)和調(diào)時(shí)(模式1),順序執(zhí)行不受按鍵影響:
{
case 0:TimeShow();break;//顯時(shí)(因?yàn)樵诎聪骆I后已反轉(zhuǎn)模式,因此顯示的以是重新讀1302的時(shí)間而不是調(diào)整后的時(shí)間,此時(shí)顯示的時(shí)間不是以前的而是以前的時(shí)間加上你在調(diào)時(shí)中停留的時(shí)間,理論有一定概率顯示是和以前一樣的)
case 1:TimeSet();break;//寫時(shí)間(因?yàn)樵诎聪骆I后已反轉(zhuǎn)模式所以不在調(diào)時(shí)后執(zhí)行,此時(shí)并寫入時(shí)間上次讀出的時(shí)間,不按鍵就一直這樣寫且理論上極小概率可能回退一秒,再按1鍵就進(jìn)入調(diào)時(shí)再反轉(zhuǎn)進(jìn)入顯示模式)
}
}
}
void Timer0_Routine() interrupt 1//每隔一秒執(zhí)行一次中斷
{
static unsigned int T0Count;
TH0=64535/256;
TL0=64535%256;
T0Count++;
if(T0Count>=500)
{
T0Count=0;
TimeSetFlashFlag=!TimeSetFlashFlag;
}
}
|
|