久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3661|回復: 0
打印 上一主題 下一主題
收起左側

STC89C52單片機0.96寸OLED萬年歷程序(可調節時鐘)

[復制鏈接]
跳轉到指定樓層
樓主
之前學校比賽,于是在網上收集資料,于是做了一個OLED顯示的萬年歷
可通過按鍵調節時間,需要四個按鍵

單片機源程序如下:
  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)//時間設置功能
  22. {
  23.         Buzzer_Time();
  24.         if(KeyNum==2)//按鍵2按下
  25.         {
  26.                 TimeSetSelect++;//設置選擇位加1
  27.                 TimeSetSelect%=6;//越界清零
  28.         }
  29.         if(KeyNum==3)//按鍵3按下
  30.         {
  31.                 Buzzer_Time();
  32.                 DS1302_Time[TimeSetSelect]++;//時間設置位數值加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]--;//時間設置位數值減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.         //更新顯示,根據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();//設置時間
  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)//根據不同的功能執行不同的函數
  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;                //設置定時初值
  154.         TH0 = 0xFC;                //設置定時初值
  155.         T0Count++;
  156.         if(T0Count>=20)//每20ms進入一次
  157.         {
  158.                 T0Count=0;
  159.                 TimeSetFlashFlag=!TimeSetFlashFlag;//閃爍標志位取反
  160.         }
  161. }
復制代碼

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

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美 日韩精品 | 午夜免费视频 | 一区二区三区高清 | 免费成人在线网站 | 亚洲免费在线 | 成人在线免费观看 | 色香蕉在线 | 青青久草 | 国产九九av | 亚洲国产一区二区三区 | 欧美一级久久精品 | 亚洲精品国产电影 | 久久亚 | 性网址| 美女二区| 激情六月丁香婷婷 | 激情91| 成人综合在线视频 | 81精品国产乱码久久久久久 | 国产乱码久久久久久 | 在线欧美亚洲 | 中文字幕在线观看一区二区 | 国产精品视频免费看 | 国产清纯白嫩初高生视频在线观看 | 免费成人av网站 | 久久久蜜桃一区二区人 | 国产a区 | 天天拍天天操 | 欧美激情精品久久久久 | 久久蜜桃av一区二区天堂 | 国产极品粉嫩美女呻吟在线看人 | jizz亚洲人| 在线观看第一区 | 波多野结衣一区二区三区在线观看 | 青青艹在线视频 | 亚洲视频在线看 | 久久久www成人免费精品 | 夜夜骑综合 | 四虎影院免费在线播放 | 亚洲国产精品激情在线观看 | 99热精品国产 |