|
之前學(xué)校比賽,于是在網(wǎng)上收集資料,于是做了一個(gè)OLED顯示的萬(wàn)年歷
可通過(guò)按鍵調(diào)節(jié)時(shí)間,需要四個(gè)按鍵
單片機(jī)源程序如下:
- #include <REGX52.H>
- #include "LCD1602.h"
- #include "DS1302.h"
- #include "Key.h"
- #include "Timer0.h"
- #include "oled.h"
- #include "bmp.h"
- #include "Delay.h"
- #include "Buzzer.h"
- unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;
- void TimeShow(void)//時(shí)間顯示功能
- {
- DS1302_ReadTime();//讀取時(shí)間
- OLED_ShowNum(0,4,DS1302_Time[0],2,16);
- OLED_ShowNum(38,4,DS1302_Time[1],2,16);
- OLED_ShowNum(73,4,DS1302_Time[2],2,16);
- OLED_ShowNum(0,6,DS1302_Time[3],2,16);
- OLED_ShowNum(38,6,DS1302_Time[4],2,16);
- OLED_ShowNum(73,6,DS1302_Time[5],2,16);
- }
- void TimeSet(void)//時(shí)間設(shè)置功能
- {
- Buzzer_Time();
- if(KeyNum==2)//按鍵2按下
- {
- TimeSetSelect++;//設(shè)置選擇位加1
- TimeSetSelect%=6;//越界清零
- }
- if(KeyNum==3)//按鍵3按下
- {
- Buzzer_Time();
- DS1302_Time[TimeSetSelect]++;//時(shí)間設(shè)置位數(shù)值加1
- 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)//日越界判斷
- {
- 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)
- {
- if(DS1302_Time[0]%4==0)
- {
- if(DS1302_Time[2]>29){DS1302_Time[2]=1;}//閏年2月
- }
- else
- {
- if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月
- }
- }
- 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;}//秒越界判斷
- }
- if(KeyNum==4)//按鍵3按下
- {
- Buzzer_Time();
- DS1302_Time[TimeSetSelect]--;//時(shí)間設(shè)置位數(shù)值減1
- if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//年越界判斷
- 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;}//閏年2月
- if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
- }
- else
- {
- if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
- if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
- }
- }
- if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//時(shí)越界判斷
- if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判斷
- if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判斷
- }
- //更新顯示,根據(jù)TimeSetSelect和TimeSetFlashFlag判斷可完成閃爍功能
- if(TimeSetSelect==0 && TimeSetFlashFlag==1){OLED_ShowString(0,4," ",16);}
- else {OLED_ShowNum(0,4,DS1302_Time[0],2,16);}
- if(TimeSetSelect==1 && TimeSetFlashFlag==1){OLED_ShowString(38,4," ",16);}
- else {OLED_ShowNum(38,4,DS1302_Time[1],2,16);}
- if(TimeSetSelect==2 && TimeSetFlashFlag==1){OLED_ShowString(73,4," ",16);}
- else {OLED_ShowNum(73,4,DS1302_Time[2],2,16);}
- if(TimeSetSelect==3 && TimeSetFlashFlag==1){OLED_ShowString(0,6," ",16);}
- else {OLED_ShowNum(0,6,DS1302_Time[3],2,16);}
- if(TimeSetSelect==4 && TimeSetFlashFlag==1){OLED_ShowString(38,6," ",16);}
- else {OLED_ShowNum(38,6,DS1302_Time[4],2,16);}
- if(TimeSetSelect==5 && TimeSetFlashFlag==1){OLED_ShowString(73,6," ",16);}
- else {OLED_ShowNum(73,6,DS1302_Time[5],2,16);}
- }
- void main()
- {
-
- OLED_Init();//
- OLED_ColorTurn(0);//
- OLED_DisplayTurn(0);//
- // DS1302_Init();
- Timer0Init();
-
-
- DS1302_SetTime();//設(shè)置時(shí)間
- OLED_DrawBMP(0,0,128,64,BMP1);
-
- Delay(200);
- OLED_Clear();
- Delay(20);
- OLED_ShowString(0,1,"Time is money",16);
- // OLED_ShowString(0,4, " - - ",16);
- // OLED_ShowString(0,6, " - - ",16);
- OLED_ShowChinese(18,4,0,16);//?D
- OLED_ShowChinese(55,4,1,16);//?°
- OLED_ShowChinese(92,4,2,16);//?°
- OLED_ShowChinese(18,6,3,16);//μ?
- OLED_ShowChinese(55,6,4,16);//×ó
- OLED_ShowChinese(92,6,5,16);//??
- while(1)
- {
- KeyNum=Key();//讀取鍵碼
- if(KeyNum==1)//按鍵1按下
- {
- Buzzer_Time();
- if(MODE==0){MODE=1;TimeSetSelect=0;}//功能切換
- else if(MODE==1){MODE=0;DS1302_SetTime();}
- }
- switch(MODE)//根據(jù)不同的功能執(zhí)行不同的函數(shù)
- {
- case 0:TimeShow();break;
- case 1:TimeSet();break;
- }
- }
-
-
- }
- void Timer0_Routine() interrupt 1
- {
- static unsigned int T0Count;
- TL0 = 0x66; //設(shè)置定時(shí)初值
- TH0 = 0xFC; //設(shè)置定時(shí)初值
- T0Count++;
- if(T0Count>=20)//每20ms進(jìn)入一次
- {
- T0Count=0;
- TimeSetFlashFlag=!TimeSetFlashFlag;//閃爍標(biāo)志位取反
- }
- }
復(fù)制代碼
51hei.png (8.83 KB, 下載次數(shù): 27)
下載附件
2021-7-27 04:17 上傳
上圖所有代碼51hei附件下載:
DS1302可調(diào)時(shí)鐘(OLED) (測(cè)試).zip
(99.36 KB, 下載次數(shù): 116)
2021-7-26 20:50 上傳
點(diǎn)擊文件名下載附件
需要自行下載 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|