標(biāo)題: STC89C52單片機(jī)0.96寸OLED萬年歷程序(可調(diào)節(jié)時鐘) [打印本頁]

作者: queen11    時間: 2021-7-26 20:53
標(biāo)題: STC89C52單片機(jī)0.96寸OLED萬年歷程序(可調(diào)節(jié)時鐘)
之前學(xué)校比賽,于是在網(wǎng)上收集資料,于是做了一個OLED顯示的萬年歷
可通過按鍵調(diào)節(jié)時間,需要四個按鍵

單片機(jī)源程序如下:
  1. #include <REGX52.H>
  2. #include "LCD1602.h"
  3. #include "DS1302.h"
  4. #include "Key.h"
  5. #include "Timer0.h"
  6. #include "oled.h"
  7. #include "bmp.h"
  8. #include "Delay.h"
  9. #include "Buzzer.h"


  10. unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;

  11. void TimeShow(void)//時間顯示功能
  12. {
  13.         DS1302_ReadTime();//讀取時間
  14.         OLED_ShowNum(0,4,DS1302_Time[0],2,16);
  15.         OLED_ShowNum(38,4,DS1302_Time[1],2,16);
  16.         OLED_ShowNum(73,4,DS1302_Time[2],2,16);
  17.         OLED_ShowNum(0,6,DS1302_Time[3],2,16);
  18.         OLED_ShowNum(38,6,DS1302_Time[4],2,16);
  19.         OLED_ShowNum(73,6,DS1302_Time[5],2,16);
  20. }

  21. void TimeSet(void)//時間設(shè)置功能
  22. {
  23.         Buzzer_Time();
  24.         if(KeyNum==2)//按鍵2按下
  25.         {
  26.                 TimeSetSelect++;//設(shè)置選擇位加1
  27.                 TimeSetSelect%=6;//越界清零
  28.         }
  29.         if(KeyNum==3)//按鍵3按下
  30.         {
  31.                 Buzzer_Time();
  32.                 DS1302_Time[TimeSetSelect]++;//時間設(shè)置位數(shù)值加1
  33.                 if(DS1302_Time[0]>99){DS1302_Time[0]=0;}//年越界判斷
  34.                 if(DS1302_Time[1]>12){DS1302_Time[1]=1;}//月越界判斷
  35.                 if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 ||
  36.                         DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判斷
  37.                 {
  38.                         if(DS1302_Time[2]>31){DS1302_Time[2]=1;}//大月
  39.                 }
  40.                 else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
  41.                 {
  42.                         if(DS1302_Time[2]>30){DS1302_Time[2]=1;}//小月
  43.                 }
  44.                 else if(DS1302_Time[1]==2)
  45.                 {
  46.                         if(DS1302_Time[0]%4==0)
  47.                         {
  48.                                 if(DS1302_Time[2]>29){DS1302_Time[2]=1;}//閏年2月
  49.                         }
  50.                         else
  51.                         {
  52.                                 if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月
  53.                         }
  54.                 }
  55.                 if(DS1302_Time[3]>23){DS1302_Time[3]=0;}//時越界判斷
  56.                 if(DS1302_Time[4]>59){DS1302_Time[4]=0;}//分越界判斷
  57.                 if(DS1302_Time[5]>59){DS1302_Time[5]=0;}//秒越界判斷
  58.         }
  59.         if(KeyNum==4)//按鍵3按下
  60.         {
  61.                 Buzzer_Time();
  62.                 DS1302_Time[TimeSetSelect]--;//時間設(shè)置位數(shù)值減1
  63.                 if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//年越界判斷
  64.                 if(DS1302_Time[1]<1){DS1302_Time[1]=12;}//月越界判斷
  65.                 if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 ||
  66.                         DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判斷
  67.                 {
  68.                         if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月
  69.                         if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
  70.                 }
  71.                 else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
  72.                 {
  73.                         if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月
  74.                         if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
  75.                 }
  76.                 else if(DS1302_Time[1]==2)
  77.                 {
  78.                         if(DS1302_Time[0]%4==0)
  79.                         {
  80.                                 if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//閏年2月
  81.                                 if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
  82.                         }
  83.                         else
  84.                         {
  85.                                 if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
  86.                                 if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
  87.                         }
  88.                 }
  89.                 if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//時越界判斷
  90.                 if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判斷
  91.                 if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判斷
  92.         }
  93.         //更新顯示,根據(jù)TimeSetSelect和TimeSetFlashFlag判斷可完成閃爍功能
  94.         if(TimeSetSelect==0 && TimeSetFlashFlag==1){OLED_ShowString(0,4,"  ",16);}
  95.         else {OLED_ShowNum(0,4,DS1302_Time[0],2,16);}
  96.         if(TimeSetSelect==1 && TimeSetFlashFlag==1){OLED_ShowString(38,4,"  ",16);}
  97.         else {OLED_ShowNum(38,4,DS1302_Time[1],2,16);}
  98.         if(TimeSetSelect==2 && TimeSetFlashFlag==1){OLED_ShowString(73,4,"  ",16);}
  99.         else {OLED_ShowNum(73,4,DS1302_Time[2],2,16);}
  100.         if(TimeSetSelect==3 && TimeSetFlashFlag==1){OLED_ShowString(0,6,"  ",16);}
  101.         else {OLED_ShowNum(0,6,DS1302_Time[3],2,16);}
  102.         if(TimeSetSelect==4 && TimeSetFlashFlag==1){OLED_ShowString(38,6,"  ",16);}
  103.         else {OLED_ShowNum(38,6,DS1302_Time[4],2,16);}
  104.         if(TimeSetSelect==5 && TimeSetFlashFlag==1){OLED_ShowString(73,6,"  ",16);}
  105.         else {OLED_ShowNum(73,6,DS1302_Time[5],2,16);}
  106. }

  107. void main()
  108. {
  109.         
  110.         OLED_Init();//
  111.         OLED_ColorTurn(0);//
  112.   OLED_DisplayTurn(0);//
  113. //        DS1302_Init();
  114.         Timer0Init();
  115.         
  116.         
  117.         DS1302_SetTime();//設(shè)置時間
  118.         OLED_DrawBMP(0,0,128,64,BMP1);
  119.                
  120.         Delay(200);
  121.         OLED_Clear();
  122.         Delay(20);
  123.         OLED_ShowString(0,1,"Time is money",16);
  124.         //        OLED_ShowString(0,4, "  -   -  ",16);
  125.         //        OLED_ShowString(0,6, "  -   -  ",16);
  126.         OLED_ShowChinese(18,4,0,16);//?D
  127.         OLED_ShowChinese(55,4,1,16);//?°
  128.         OLED_ShowChinese(92,4,2,16);//?°
  129.         OLED_ShowChinese(18,6,3,16);//μ?
  130.         OLED_ShowChinese(55,6,4,16);//×ó
  131.         OLED_ShowChinese(92,6,5,16);//??
  132.         while(1)
  133.         {
  134.                 KeyNum=Key();//讀取鍵碼
  135.                 if(KeyNum==1)//按鍵1按下
  136.                 {
  137.                         Buzzer_Time();
  138.                         if(MODE==0){MODE=1;TimeSetSelect=0;}//功能切換
  139.                         else if(MODE==1){MODE=0;DS1302_SetTime();}
  140.                 }
  141.                 switch(MODE)//根據(jù)不同的功能執(zhí)行不同的函數(shù)
  142.                 {
  143.                         case 0:TimeShow();break;
  144.                         case 1:TimeSet();break;
  145.                 }
  146.         }
  147.         
  148.         
  149. }

  150. void Timer0_Routine() interrupt 1
  151. {
  152.         static unsigned int T0Count;
  153.         TL0 = 0x66;                //設(shè)置定時初值
  154.         TH0 = 0xFC;                //設(shè)置定時初值
  155.         T0Count++;
  156.         if(T0Count>=20)//每20ms進(jìn)入一次
  157.         {
  158.                 T0Count=0;
  159.                 TimeSetFlashFlag=!TimeSetFlashFlag;//閃爍標(biāo)志位取反
  160.         }
  161. }
復(fù)制代碼

上圖所有代碼51hei附件下載:
DS1302可調(diào)時鐘(OLED) (測試).zip (99.36 KB, 下載次數(shù): 116)






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1