happy 发表于 2023-4-1 18:19:52

ds1302可调时钟没法在oled上显示

只显示时钟就能显示,吧调节时间的程序加上去过后就没法正常运行了,请各位大佬帮我看看#include <REGX52.H>
#include "OLED.h"
#include "DS1302.h"
#include "Key.h"
#include "Timer0.h"
#include "Delay.H"

#define uchar unsigned char   
#define uint unsigned int

unsigned char KeyNum,SHOW_MODE,TimeSetFlashFlag;
char TimeSetSelect;

void TimeShow(void)
{
      DS1302_ReadTime();
      OLED_ShowNum(0,3,DS1302_Time/10,1,8);      
      OLED_ShowNum(7,3,DS1302_Time%10,1,8);      
      OLED_ShowString(15,3,"-",8);               
      OLED_ShowNum(22,3,DS1302_Time/10,1,8);      
      OLED_ShowNum(29,3,DS1302_Time%10,1,8);
      OLED_ShowString(35,3,"-",8);
      OLED_ShowNum(42,3,DS1302_Time/10,1,8);
      OLED_ShowNum(49,3,DS1302_Time%10,1,8);
      OLED_ShowNum(0,4,DS1302_Time/10,1,8);
      OLED_ShowNum(7,4,DS1302_Time%10,1,8);
      OLED_ShowString(15,4,":",8);
      OLED_ShowNum(22,4,DS1302_Time/10,1,8);
      OLED_ShowNum(29,4,DS1302_Time%10,1,8);
      OLED_ShowString(35,4,":",8);
      OLED_ShowNum(42,4,DS1302_Time/10,1,8);
      OLED_ShowNum(49,4,DS1302_Time%10,1,8);
}

void TimeSet(void)
{
      if(KeyNum==2){TimeSetSelect++;if(TimeSetSelect>5){TimeSetSelect=0;}}
      if(KeyNum==3){TimeSetSelect--;if(TimeSetSelect<0){TimeSetSelect=5;}}      
      
      if(KeyNum==4)
      {
                DS1302_Time++;
                if(DS1302_Time>99){DS1302_Time=0;}
                if(DS1302_Time>12){DS1302_Time=1;}
                if( DS1302_Time==1 || DS1302_Time==3 || DS1302_Time==5 || DS1302_Time==7 ||
                        DS1302_Time==8 || DS1302_Time==10 || DS1302_Time==12)
                {
                        if(DS1302_Time>31){DS1302_Time=1;}
                }
                else if(DS1302_Time==4 || DS1302_Time==6 || DS1302_Time==9 || DS1302_Time==11)
                {
                        if(DS1302_Time>30){DS1302_Time=1;}
                }
                else if(DS1302_Time==2)
                {
                        if(DS1302_Time%4==0)
                        {
                              if(DS1302_Time>29){DS1302_Time=1;}
                        }
                        else
                        {
                              if(DS1302_Time>28){DS1302_Time=1;}
                        }
                }
                if(DS1302_Time>23){DS1302_Time=0;}
                if(DS1302_Time>59){DS1302_Time=0;}
                if(DS1302_Time>59){DS1302_Time=0;}
      }
      if(KeyNum==5)
      {
                DS1302_Time--;
                if(DS1302_Time<0){DS1302_Time=99;}
                if(DS1302_Time<1){DS1302_Time=12;}
                if( DS1302_Time==1 || DS1302_Time==3 || DS1302_Time==5 || DS1302_Time==7 ||
                        DS1302_Time==8 || DS1302_Time==10 || DS1302_Time==12)
                {
                        if(DS1302_Time<1){DS1302_Time=31;}
                        if(DS1302_Time>31){DS1302_Time=1;}
                }
                else if(DS1302_Time==4 || DS1302_Time==6 || DS1302_Time==9 || DS1302_Time==11)
                {
                        if(DS1302_Time<1){DS1302_Time=30;}
                        if(DS1302_Time>30){DS1302_Time=1;}
                }
                else if(DS1302_Time==2)
                {
                        if(DS1302_Time%4==0)
                        {
                              if(DS1302_Time<1){DS1302_Time=29;}
                              if(DS1302_Time>29){DS1302_Time=1;}
                        }
                        else
                        {
                              if(DS1302_Time<1){DS1302_Time=28;}
                              if(DS1302_Time>28){DS1302_Time=1;}
                        }
                }
                if(DS1302_Time<0){DS1302_Time=23;}
                if(DS1302_Time<0){DS1302_Time=59;}
                if(DS1302_Time<0){DS1302_Time=59;}
      }
      if(TimeSetSelect==0 && TimeSetFlashFlag==1){OLED_ShowString(0,3,"",8);}
      else {OLED_ShowNum(0,3,DS1302_Time/10,1,8);OLED_ShowNum(7,3,DS1302_Time%10,1,8);}
      if(TimeSetSelect==1 && TimeSetFlashFlag==1){OLED_ShowString(22,3,"",8);}
      else {OLED_ShowNum(22,3,DS1302_Time/10,1,8);OLED_ShowNum(29,3,DS1302_Time%10,1,8);}
      if(TimeSetSelect==2 && TimeSetFlashFlag==1){OLED_ShowString(42,3,"",8);}
      else {OLED_ShowNum(42,3,DS1302_Time/10,1,8);OLED_ShowNum(49,3,DS1302_Time%10,1,8);}
      if(TimeSetSelect==3 && TimeSetFlashFlag==1){OLED_ShowString(0,4,"",8);}
      else {OLED_ShowNum(0,4,DS1302_Time/10,1,8);OLED_ShowNum(7,4,DS1302_Time%10,1,8);}
      if(TimeSetSelect==4 && TimeSetFlashFlag==1){OLED_ShowString(22,4,"",8);}
      else {OLED_ShowNum(22,4,DS1302_Time/10,1,8);OLED_ShowNum(29,4,DS1302_Time%10,1,8);}
      if(TimeSetSelect==5 && TimeSetFlashFlag==1){OLED_ShowString(42,4,"",8);}
      else {OLED_ShowNum(42,4,DS1302_Time/10,1,8);OLED_ShowNum(49,4,DS1302_Time%10,1,8);}
}


void main()
{
      OLED_Init();
      OLED_Clear();
      DS1302_Init();
    Timer0_Init();
      
      DS1302_SetTime();//设置时间
      
      while(1)
      {
                KeyNum=Key_shi();
                if(KeyNum==1)
                {
                        if(SHOW_MODE==0){SHOW_MODE=1;TimeSetSelect=0;}
                        else if(SHOW_MODE==1){SHOW_MODE=0;DS1302_SetTime();}
                }
                switch(SHOW_MODE)
                {
                        case 0:TimeShow();break;
                        case 1:TimeSet();break;
                }                              

      }
}


void Timer0_Routine() interrupt 1
{
      static unsigned int T0Count;
      TL0 = 0x66;               
      TH0 = 0xFC;               
      T0Count++;
      if(T0Count>=500)
      {
                T0Count=0;
                TimeSetFlashFlag=!TimeSetFlashFlag;
      }
}


神农鼎 发表于 2023-4-1 19:06:55

你先把问题分开:
1, 先搞定 OLED12864显示;
2, 再搞定 DS1302这个 RTC.

OLED12864, 我们给你 老刘爱捣鼓的演示程序,就是OLED12864
RTC, 你用STC8H8K64U实验箱的 RTC演示程序就可以省掉 外部的 RTC


这是 经典的 【老刘爱捣鼓示波器】 + 【三角波,正玄波,方波,波形发声器】
https://www.stcaimcu.com/data/attachment/forum/202304/01/183531i85hz7685wk67kh6.png

https://www.stcaimcu.com/data/attachment/forum/202304/01/183531z5xgqezd5luhef56.png
第25个程序是【老刘爱捣鼓示波器】 + 【三角波,正玄波,方波,波形发声器】
第26个程序是:
【科学计算器】 + 【虚拟OLED12864显示,虚拟键盘,USB不停电下载,USB-CDC/就是最简单最强大的串口】
===做菜单,做汉字字模
第24个程序是【强大的STC-老梁开源示波器简化版】 + 【波形发声器】


电子DIY小家 发表于 2023-4-17 10:03:41

“吧调节时间的程序加上去过后就没法正常运行了”
请详细描述下不能正常运行的现象,操作步骤等越详细越好
页: [1]
查看完整版本: ds1302可调时钟没法在oled上显示