熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2023-10-25 21:22
正文摘要:為什么我的按鍵可調(diào)時(shí)鐘不按照我的設(shè)置的顯示呢 我可以按鍵改變設(shè)置的時(shí)間LCD也會(huì)對應(yīng)顯示我設(shè)置過的時(shí)間,但是我只要一按鍵推出TimeSet模式,它就又顯示之前的時(shí)間了。我明明聲明了全局?jǐn)?shù)組。但是我在每個(gè)時(shí)間改變 ... |
是時(shí)序上出問題了,寫入操作沒有完成時(shí)序? |
Diameter 發(fā)表于 2023-10-27 16:56 你畫個(gè)框圖就知道邏輯錯(cuò)在哪里了 ![]() |
我之前試過修改不成功,后來每次修改之后重新初始化DS1302就可以了。 |
man1234567 發(fā)表于 2023-10-27 14:59 逆天我跟著視頻教程做的 DS1302寫完還要加保存程序么 不是寫入 就自動(dòng)覆蓋DS1302芯片原來的數(shù)據(jù)啊 |
Diameter 發(fā)表于 2023-10-27 11:55 細(xì)讀我的注釋就知道了。 改的方式很多,比如模式的切換可以在相應(yīng)模式工作完成后進(jìn)行。 你的程序現(xiàn)在是顯示模式時(shí)寫時(shí)間到1302而修改后不保存只是重讀1302再顯示。 |
man1234567 發(fā)表于 2023-10-26 18:18 “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í)間,理論有一定概率顯示是和以前一樣的)” 為啥我的DS1302_SetTime只要調(diào)用過不就會(huì)把我全局?jǐn)?shù)組里改變的時(shí)間寫到DS1302里面 我DS1302不應(yīng)該存在以前的時(shí)間的啊 |
本帖最后由 man1234567 于 2023-10-27 09:59 編輯 主要看主程序里的注釋自己調(diào)整就好,總體感覺有些啰嗦有點(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月平潤防溢出 { 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)整類別的顯示定位,同樣感覺啰嗦 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)整后寫,否則過于頻繁 } void main() { LCD_Init();//1602初始化,圖片中正常顯示就沒看了 DS1302_Init();//1302初始化,圖片中正常顯示就沒看了 Timer0_Init();//定時(shí)器初始化,建議在調(diào)整時(shí)間開始時(shí)執(zhí)行,停留在調(diào)時(shí)狀態(tài)過長時(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)語句,然后有無按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;//然后選擇從年開始調(diào)整,然后并不立即調(diào)時(shí),而是隨后寫入時(shí)間 } else if(MODE==1)//如果調(diào)時(shí)模式時(shí) { MODE=0;//立即先切換到正常顯示模式,然后執(zhí)行調(diào)時(shí) DS1302_SetTime();//開始調(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; } } |
把單片機(jī)STC89C56換成89C52,單片機(jī)性能不完全一致 |
Diameter 發(fā)表于 2023-10-25 21:23 把這個(gè)示例的端口定義按你的實(shí)際電路重新定義即可運(yùn)行。 ![]() ![]() |
那就改為修改立即生效,不能成功的原因極大可能是讀取,或在調(diào)節(jié)時(shí)停止讀取并在更新后恢復(fù)讀取. |
沒有細(xì)看你的代碼圖片,能讀寫,說明時(shí)序正常,顯示不對可能是你的數(shù)據(jù)轉(zhuǎn)換沒做好: 1302讀寫的是十進(jìn)制BCD碼,你該不會(huì)是當(dāng)做16進(jìn)制來處理了吧? |
全部的源代碼和開發(fā)板原理圖已上傳 |
Powered by 單片機(jī)教程網(wǎng)