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