找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3215|回复: 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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表