找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13778|回复: 24
打印 上一主题 下一主题
收起左侧

51单片机DS3231+oled显示万年历设计

  [复制链接]
跳转到指定楼层
楼主
用51写的一个万年历程序,包含了DS1302,oled,红外遥控,很好用。


红外遥控接收头  接  P3.3
DS3231 SDA 接 P0.0
DS3231 SCL 接 P0.1
OLED12864 SCL 接 P1.3
OLED12864 SCL 接 P1.3

可根据具体需要自行更改

效果图:


原理图:




单片机源程序如下:
  1. /*****************************************************************************************************
  2. ********************************************头文件、宏定义********************************************
  3. *****************************************************************************************************/
  4. #include <reg52.h>                //oled_12864_IIC连接+DS3231时钟模块+红外遥控和按键+STC90C516RD+
  5. #include <intrins.h>                //年 月 日 时 分 秒 星期 温度显示  温度来源DS3231,64S刷新一次
  6. #define uint unsigned int        //年误差+- 2min
  7. #define uchar unsigned char
  8. /*****************************************************************************************************
  9. **********************************************按键定义************************************************
  10. *****************************************************************************************************/
  11. sbit key1=P0^4;        //设置
  12. sbit key2=P0^5;        //加
  13. sbit key3=P0^6;        //减
  14. sbit key4=P0^7;        //确定
  15. sbit laba=P3^7;        //喇叭
  16. /*****************************************************************************************************
  17. ********************************************红外遥控定义**********************************************
  18. *****************************************************************************************************/
  19. #define Imax 14000//此处为晶振为11.0592时的取值,   //时间计算          //红外接口P3.3
  20. #define Imin 8000 //如用其它频率的晶振时,
  21. #define Inum1 1450//要改变相应的取值。
  22. #define Inum3 3000
  23. #define Inum2 700

  24. uchar f;
  25. uchar IrOK;
  26. unsigned long m,Tc;
  27. uchar Im[4]={0x00,0x00,0x00,0x00};
  28. /*****************************************************************************************************
  29. *******************************************DS3231变量定义*********************************************
  30. *****************************************************************************************************/
  31. sbit DS3231_IIC_SDA=P0^0;
  32. sbit DS3231_IIC_SCL=P0^1;
  33. uchar RTC_Data[8];
  34. uchar RTC_Data1[8];
  35. uchar RTC_Set_ID;
  36. code uchar rtc_address[8]={0x00,0x01,0x02,0x04,0x05,0x03,0x06,0x11};//秒分时日月周年 最低位读写位
  37. /*****************************************************************************************************
  38. *******************************************OLED12864定义**********************************************
  39. *****************************************************************************************************/
  40. sbit oled_SCL=P1^3;                                                                  //串行时钟
  41. sbit oled_SDA=P1^2;                                                                 //串行数据
  42. uchar display_buff[16];                                                         //时间显示数组
  43. /*****************************************************************************************************
  44. *********************************************变量定义*************************************************
  45. *****************************************************************************************************/
  46. bit T0_Flag;                                                                         //定时器T01ms标志位
  47. bit laba_flag;                                                                         //蜂鸣器标志位
  48. bit Open_Flag;                                                                         //蜂鸣器标志位
  49. bit RTC_Save_Flag;                                                                   //设置时间标志位
  50. bit shezhi_display_flag;

  51. void delayms(uint x);                                                         //延时函数
  52. void display1();                                                                 //显示函数
  53. void display2();
  54. void OLED_12864_Write_commomand(uint dat);                 //命令
  55. void OLED_12864_Write_data(uint dat);                         //数据
  56. void OLED_12864_Init();                                                         //初始化
  57. void OLED_Fill(uchar bmp_dat);                                         //屏幕填充
  58. void OLED_SetPos(uchar x, uchar y);                                 //起始坐标
  59. void OLED_8x16Str(uchar x, uchar y, uchar ch);         //8*16的点阵
  60. void OLED_16x16CN(uchar x, uchar y, uchar N);         //16*16的点阵
  61. void OLED_16x32(uchar x, uchar y, uchar ch);

  62. void Time_Fun();                                                                 //时基、走时函数
  63. void DS3231_Read_time();                                                 //读取时间
  64. void DS3231_write_time();                                                 //写入时间
  65. void KeyDataProcess();                                                         //键值处理函数
  66. void DS3231_Init();                                                                 //时间模块初始化
  67. /*****************************************************************************************************
  68. ******************************************OLED12864点阵数组*******************************************
  69. *****************************************************************************************************/
  70. uchar code F16x16[]=
  71. {
  72. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  73. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"不显示",0
  74.                                                                                                                                                                         
  75. 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
  76. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"一",1
  77.         
  78. …………
  79. …………限于本文篇幅 余下代码请从51黑下载附件…………

  80. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//不显示,21
  81. };
  82. /*****************************************************************************************************
  83. ********************************************初始化时间************************************************
  84. *****************************************************************************************************/
  85. void Ram_init()
  86. {
  87.         DS3231_Read_time();                                //读取 秒分时日月周年
  88.         if((!RTC_Data[6])&&(!RTC_Data[5])&&(!RTC_Data[4])&&(!RTC_Data[3])&&(!RTC_Data[2])&&(!RTC_Data[1])&&(!RTC_Data[0]))
  89.         {
  90.                 RTC_Data[0]=0;       //秒                              //秒分时日月周年 最低位读写位
  91.                 RTC_Data[1]=0;                 //分
  92.                 RTC_Data[2]=12;                 //时
  93.                 RTC_Data[3]=3;                 //日
  94.                 RTC_Data[4]=11;                 //月
  95.                 RTC_Data[5]=2;                 //周
  96.                 RTC_Data[6]=15;                 //年
  97.                 DS3231_write_time();                    //写入 秒分时日月周年
  98.         }
  99.         RTC_Set_ID=0;        
  100. }
  101. /*****************************************************************************************************
  102. ************************************************主函数************************************************
  103. *****************************************************************************************************/
  104. void main()
  105. {
  106.         EA=1;                                        //开总中断
  107.         IT1=1;                                                //下降沿有效
  108.         EX1=1;                                                //外部中断开
  109.         ET1=1;                                                //打开允许开关

  110.         TMOD=0x11;                                   //定时/计数器 工作于方式1
  111.         TH1=0xff;                                        //50ms定时常数
  112.         TL1=256-131;                                 
  113.         TR1=1;                                       //启动定时/计数器 中断

  114.         TH0=0;                                                //赋初值
  115.         TL0=0;
  116.         TR0=1;                                                //开始计时
  117.         shezhi_display_flag=0;

  118.         delayms(10);
  119.         OLED_12864_Init();        
  120.         delayms(10);        
  121.         display1();                                        //显示
  122.         display2();                                        //显示
  123.         Ram_init();                                        //初始化时间
  124.         DS3231_Init();                                //模块初始化
  125.         laba=0;        
  126.         while(1)
  127.         {               
  128.                 if(T0_Flag)
  129.                 {
  130.                         T0_Flag=0;
  131.                         Time_Fun();
  132.                 }
  133.         }
  134. }
  135. /*****************************************************************************************************
  136. *********************************************时基、走时函数*******************************************
  137. *****************************************************************************************************/
  138. void Time_Fun()
  139. {
  140.         static        uchar T10Ms_Cnt=0,T200Ms_Cnt=0;
  141.         static uchar Buzz_On_Cnt=0,RTC_Save_Cnt=0;        
  142.         
  143.         T10Ms_Cnt++;        
  144.         if(T10Ms_Cnt>=5)
  145.         {
  146.                 T10Ms_Cnt=0;
  147.                 KeyDataProcess();
  148.                 if(laba_flag)
  149.                 {
  150.                         Buzz_On_Cnt++;
  151.                         if(Buzz_On_Cnt>=10)
  152.                         {
  153.                                 laba_flag=0;
  154.                                 Buzz_On_Cnt=0;
  155.                         }
  156.                 }        
  157.                 if(RTC_Save_Flag)
  158.                 {
  159.                         RTC_Save_Cnt++;
  160.                         if(RTC_Save_Cnt>=50)
  161.                         {
  162.                                 RTC_Save_Cnt=0;
  163.                                 RTC_Save_Flag=0;
  164.                                 RTC_Set_ID=0;
  165.                                 DS3231_write_time();
  166.                         }
  167.                 }
  168.         }
  169.         T200Ms_Cnt++;
  170.         if(T200Ms_Cnt>=100&&shezhi_display_flag==0)
  171.         {
  172.                 T200Ms_Cnt=0;               
  173.                 if(!RTC_Set_ID)
  174.                         DS3231_Read_time();
  175.                 display1();
  176.                 display2();
  177.         }
  178. }
  179. /*****************************************************************************************************
  180. ***********************************************键值处理***********************************************
  181. *****************************************************************************************************/
  182. void KeyDataProcess()        //10mS处理一次
  183. {        //按键操作部分
  184.         if(key1==0)
  185.         {
  186.                 delayms(10);
  187.                 if(key1==0)
  188.                 {
  189.                         while(!key1);
  190.                         laba_flag=1; //蜂鸣器响一声
  191.                         shezhi_display_flag=1;
  192.                         RTC_Set_ID++;
  193.                         if(RTC_Set_ID>=8)
  194.                                 RTC_Set_ID=1;
  195.                         Open_Flag=1;

  196.                         display1();
  197.                         if(RTC_Set_ID==1)
  198.                         {
  199.                                 OLED_Fill(0x00);
  200.                                 OLED_16x16CN(32, 0, 16);//年
  201.                                 OLED_16x16CN(48, 0, 18);//份
  202.                                 OLED_16x16CN(64, 0, 14);//设
  203.                                 OLED_16x16CN(80, 0, 15);//置
  204.                                 OLED_16x32(0, 2, display_buff[2]);//年
  205.                                 OLED_16x32(16, 2, display_buff[3]);
  206.                                 OLED_16x32(32, 2, 11);//-
  207.                                 OLED_16x32(48, 2, display_buff[4]);//月
  208.                                 OLED_16x32(64, 2, display_buff[5]);
  209.                                 OLED_16x32(80, 2, 11);//-
  210.                                 OLED_16x32(96, 2, display_buff[6]);//日
  211.                                 OLED_16x32(112, 2, display_buff[7]);        
  212.                         }
  213.                         else if(RTC_Set_ID==2)
  214.                         {
  215.                                 OLED_16x16CN(32, 0, 17);//月
  216.                                 OLED_16x16CN(48, 0, 18);//份
  217.                                 OLED_16x16CN(64, 0, 14);//设
  218.                                 OLED_16x16CN(80, 0, 15);//置
  219.                         }
  220.                         else if(RTC_Set_ID==3)
  221.                         {
  222.                                 OLED_16x16CN(32, 0, 11);//日
  223.                                 OLED_16x16CN(48, 0, 9);//期
  224.                                 OLED_16x16CN(64, 0, 14);//设
  225.                                 OLED_16x16CN(80, 0, 15);//置
  226.                         }
  227.                         else if(RTC_Set_ID==4)
  228.                         {
  229.                                 OLED_16x16CN(32, 0, 13);//小
  230.                                 OLED_16x16CN(48, 0, 12);//时
  231.                                 OLED_16x16CN(64, 0, 14);//设
  232.                                 OLED_16x16CN(80, 0, 15);//置
  233.                                 OLED_16x32(0, 2, display_buff[8]);//时
  234.                                 OLED_16x32(16, 2, display_buff[9]);
  235.                                 OLED_16x32(32, 2, 10);//:
  236.                                 OLED_16x32(48, 2, display_buff[10]);//分
  237.                                 OLED_16x32(64, 2, display_buff[11]);
  238.                                 OLED_16x32(80, 2, 10);//:
  239.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  240.                                 OLED_16x32(112, 2, display_buff[13]);
  241.                         }
  242.                         else if(RTC_Set_ID==5)
  243.                         {
  244.                                 OLED_16x16CN(32, 0, 19);//分
  245.                                 OLED_16x16CN(48, 0, 20);//钟
  246.                                 OLED_16x16CN(64, 0, 14);//设
  247.                                 OLED_16x16CN(80, 0, 15);//置
  248.                         }
  249.                         else if(RTC_Set_ID==6)
  250.                         {
  251.                                 OLED_16x16CN(32, 0, 21);//秒
  252.                                 OLED_16x16CN(48, 0, 22);//数
  253.                                 OLED_16x16CN(64, 0, 14);//设
  254.                                 OLED_16x16CN(80, 0, 15);//置
  255.                         }
  256.                         else if(RTC_Set_ID==7)
  257.                         {
  258.                                 OLED_Fill(0x00);
  259.                                 OLED_16x16CN(32, 0, 8);//星
  260.                                 OLED_16x16CN(48, 0, 9);//期
  261.                                 OLED_16x16CN(64, 0, 14);//设
  262.                                 OLED_16x16CN(80, 0, 15);//置
  263.                                 OLED_16x32(40, 2, 12);//星
  264.                                 OLED_16x32(56, 2, 13);//期
  265.                                 OLED_16x32(72, 2, display_buff[15]+13);
  266.                         }
  267.                 }
  268.         }
  269.         if(key2==0)
  270.         {
  271.                 delayms(10);
  272.                 if(key2==0)
  273.                 {
  274.                         while(!key2);
  275.                         laba_flag=1;   //蜂鸣器响一声
  276.                         shezhi_display_flag=1;
  277.                         if(RTC_Set_ID==1)
  278.                         {
  279.                                 if(RTC_Data[6]<99)          //年+
  280.                                         RTC_Data[6]++;
  281.                                 display1();
  282.                                 OLED_16x32(0, 2, display_buff[2]);//年
  283.                                 OLED_16x32(16, 2, display_buff[3]);
  284.                                 OLED_16x32(32, 2, 11);//-
  285.                                 OLED_16x32(48, 2, display_buff[4]);//月
  286.                                 OLED_16x32(64, 2, display_buff[5]);
  287.                                 OLED_16x32(80, 2, 11);//-
  288.                                 OLED_16x32(96, 2, display_buff[6]);//日
  289.                                 OLED_16x32(112, 2, display_buff[7]);
  290.                         }
  291.                         else if(RTC_Set_ID==2)
  292.                         {
  293.                                 if(RTC_Data[4]<12)          //月+
  294.                                         RTC_Data[4]++;
  295.                                 display1();
  296.                                 OLED_16x32(0, 2, display_buff[2]);//年
  297.                                 OLED_16x32(16, 2, display_buff[3]);
  298.                                 OLED_16x32(32, 2, 11);//-
  299.                                 OLED_16x32(48, 2, display_buff[4]);//月
  300.                                 OLED_16x32(64, 2, display_buff[5]);
  301.                                 OLED_16x32(80, 2, 11);//-
  302.                                 OLED_16x32(96, 2, display_buff[6]);//日
  303.                                 OLED_16x32(112, 2, display_buff[7]);
  304.                         }
  305.                         else if(RTC_Set_ID==3)
  306.                         {
  307.                                 if(RTC_Data[3]<31)          //日+
  308.                                         RTC_Data[3]++;
  309.                                 display1();
  310.                                 OLED_16x32(0, 2, display_buff[2]);//年
  311.                                 OLED_16x32(16, 2, display_buff[3]);
  312.                                 OLED_16x32(32, 2, 11);//-
  313.                                 OLED_16x32(48, 2, display_buff[4]);//月
  314.                                 OLED_16x32(64, 2, display_buff[5]);
  315.                                 OLED_16x32(80, 2, 11);//-
  316.                                 OLED_16x32(96, 2, display_buff[6]);//日
  317.                                 OLED_16x32(112, 2, display_buff[7]);        
  318.                         }
  319.                         else if(RTC_Set_ID==4)
  320.                         {
  321.                                 if(RTC_Data[2]<23)          //时+
  322.                                         RTC_Data[2]++;
  323.                                 display1();
  324.                                 OLED_16x32(0, 2, display_buff[8]);//时
  325.                                 OLED_16x32(16, 2, display_buff[9]);
  326.                                 OLED_16x32(32, 2, 10);//:
  327.                                 OLED_16x32(48, 2, display_buff[10]);//分
  328.                                 OLED_16x32(64, 2, display_buff[11]);
  329.                                 OLED_16x32(80, 2, 10);//:
  330.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  331.                                 OLED_16x32(112, 2, display_buff[13]);
  332.                         }
  333.                         else if(RTC_Set_ID==5)
  334.                         {
  335.                                 if(RTC_Data[1]<59)          //分+
  336.                                         RTC_Data[1]++;
  337.                                 display1();
  338.                                 OLED_16x32(0, 2, display_buff[8]);//时
  339.                                 OLED_16x32(16, 2, display_buff[9]);
  340.                                 OLED_16x32(32, 2, 10);//:
  341.                                 OLED_16x32(48, 2, display_buff[10]);//分
  342.                                 OLED_16x32(64, 2, display_buff[11]);
  343.                                 OLED_16x32(80, 2, 10);//:
  344.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  345.                                 OLED_16x32(112, 2, display_buff[13]);
  346.                         }
  347.                         else if(RTC_Set_ID==6)
  348.                         {
  349.                                 if(RTC_Data[0]<59)          //秒+
  350.                                         RTC_Data[0]++;
  351.                                 display1();
  352.                                 OLED_16x32(0, 2, display_buff[8]);//时
  353.                                 OLED_16x32(16, 2, display_buff[9]);
  354.                                 OLED_16x32(32, 2, 10);//:
  355.                                 OLED_16x32(48, 2, display_buff[10]);//分
  356.                                 OLED_16x32(64, 2, display_buff[11]);
  357.                                 OLED_16x32(80, 2, 10);//:
  358.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  359.                                 OLED_16x32(112, 2, display_buff[13]);
  360.                         }
  361.                         else if(RTC_Set_ID==7)
  362.                         {
  363.                                 if(RTC_Data[5]<7)          //周+
  364.                                         RTC_Data[5]++;
  365.                                 display1();
  366.                                 OLED_16x32(40, 2, 12);//星
  367.                                 OLED_16x32(56, 2, 13);//期
  368.                                 OLED_16x32(72, 2, display_buff[15]+13);
  369.                         }
  370.                 }
  371.         }
  372.         if(key3==0)
  373.         {
  374.                 delayms(10);
  375.                 if(key3==0)
  376.                 {
  377.                         while(!key3);
  378.                         laba_flag=1;          //蜂鸣器响一声
  379.                         shezhi_display_flag=1;
  380.                         if(RTC_Set_ID==1)
  381.                         {
  382.                                 if(RTC_Data[6])                   //年-
  383.                                         RTC_Data[6]--;
  384.                                 display1();
  385.                                 OLED_16x32(0, 2, display_buff[2]);//年
  386.                                 OLED_16x32(16, 2, display_buff[3]);
  387.                                 OLED_16x32(32, 2, 11);//-
  388.                                 OLED_16x32(48, 2, display_buff[4]);//月
  389.                                 OLED_16x32(64, 2, display_buff[5]);
  390.                                 OLED_16x32(80, 2, 11);//-
  391.                                 OLED_16x32(96, 2, display_buff[6]);//日
  392.                                 OLED_16x32(112, 2, display_buff[7]);
  393.                         }
  394.                         else if(RTC_Set_ID==2)
  395.                         {
  396.                                 if(RTC_Data[4])                   //月-
  397.                                         RTC_Data[4]--;
  398.                                 display1();
  399.                                 OLED_16x32(0, 2, display_buff[2]);//年
  400.                                 OLED_16x32(16, 2, display_buff[3]);
  401.                                 OLED_16x32(32, 2, 11);//-
  402.                                 OLED_16x32(48, 2, display_buff[4]);//月
  403.                                 OLED_16x32(64, 2, display_buff[5]);
  404.                                 OLED_16x32(80, 2, 11);//-
  405.                                 OLED_16x32(96, 2, display_buff[6]);//日
  406.                                 OLED_16x32(112, 2, display_buff[7]);
  407.                         }
  408.                         else if(RTC_Set_ID==3)
  409.                         {
  410.                                 if(RTC_Data[3])                   //日-
  411.                                         RTC_Data[3]--;
  412.                                 display1();
  413.                                 OLED_16x32(0, 2, display_buff[2]);//年
  414.                                 OLED_16x32(16, 2, display_buff[3]);
  415.                                 OLED_16x32(32, 2, 11);//-
  416.                                 OLED_16x32(48, 2, display_buff[4]);//月
  417.                                 OLED_16x32(64, 2, display_buff[5]);
  418.                                 OLED_16x32(80, 2, 11);//-
  419.                                 OLED_16x32(96, 2, display_buff[6]);//日
  420.                                 OLED_16x32(112, 2, display_buff[7]);
  421.                         }
  422.                         else if(RTC_Set_ID==4)
  423.                         {
  424.                                 if(RTC_Data[2])                   //时-
  425.                                         RTC_Data[2]--;
  426.                                 display1();
  427.                                 OLED_16x32(0, 2, display_buff[8]);//时
  428.                                 OLED_16x32(16, 2, display_buff[9]);
  429.                                 OLED_16x32(32, 2, 10);//:
  430.                                 OLED_16x32(48, 2, display_buff[10]);//分
  431.                                 OLED_16x32(64, 2, display_buff[11]);
  432.                                 OLED_16x32(80, 2, 10);//:
  433.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  434.                                 OLED_16x32(112, 2, display_buff[13]);
  435.                         }
  436.                         else if(RTC_Set_ID==5)
  437.                         {
  438.                                 if(RTC_Data[1])                   //分-
  439.                                         RTC_Data[1]--;
  440.                                 display1();
  441.                                 OLED_16x32(0, 2, display_buff[8]);//时
  442.                                 OLED_16x32(16, 2, display_buff[9]);
  443.                                 OLED_16x32(32, 2, 10);//:
  444.                                 OLED_16x32(48, 2, display_buff[10]);//分
  445.                                 OLED_16x32(64, 2, display_buff[11]);
  446.                                 OLED_16x32(80, 2, 10);//:
  447.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  448.                                 OLED_16x32(112, 2, display_buff[13]);
  449.                         }
  450.                         else if(RTC_Set_ID==6)
  451.                         {
  452.                                 if(RTC_Data[0])                   //秒-
  453.                                         RTC_Data[0]--;
  454.                                 display1();
  455.                                 OLED_16x32(0, 2, display_buff[8]);//时
  456.                                 OLED_16x32(16, 2, display_buff[9]);
  457.                                 OLED_16x32(32, 2, 10);//:
  458.                                 OLED_16x32(48, 2, display_buff[10]);//分
  459.                                 OLED_16x32(64, 2, display_buff[11]);
  460.                                 OLED_16x32(80, 2, 10);//:
  461.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  462.                                 OLED_16x32(112, 2, display_buff[13]);
  463.                         }
  464.                         else if(RTC_Set_ID==7)
  465.                         {
  466.                                 if(RTC_Data[5])                   //周-
  467.                                         RTC_Data[5]--;
  468.                                 display1();
  469.                                 OLED_16x32(40, 2, 12);//星
  470.                                 OLED_16x32(56, 2, 13);//期
  471.                                 OLED_16x32(72, 2, display_buff[15]+13);
  472.                         }
  473.                 }
  474.         }
  475.         if(key4==0)
  476.         {
  477.                 delayms(10);
  478.                 if(key4==0)
  479.                 {
  480.                         while(!key4);
  481.                         laba_flag=1;          //蜂鸣器响一声
  482.                         shezhi_display_flag=0;
  483.                         RTC_Save_Flag=1;
  484.                 }
  485.         }
  486.         //红外遥控操作部分
  487.         if(IrOK==1)                                                //设置/遥控器C键
  488.         {
  489.                 if(Im[2]==0x0d)
  490.                 {
  491.                         laba_flag=1; //蜂鸣器响一声
  492.                         shezhi_display_flag=1;
  493.                         RTC_Set_ID++;
  494.                         if(RTC_Set_ID>=8)
  495.                                 RTC_Set_ID=1;
  496.                         Open_Flag=1;

  497.                         display1();
  498.                         if(RTC_Set_ID==1)
  499.                         {
  500.                                 OLED_Fill(0x00);
  501.                                 OLED_16x16CN(32, 0, 16);//年
  502.                                 OLED_16x16CN(48, 0, 18);//份
  503.                                 OLED_16x16CN(64, 0, 14);//设
  504.                                 OLED_16x16CN(80, 0, 15);//置
  505.                                 OLED_16x32(0, 2, display_buff[2]);//年
  506.                                 OLED_16x32(16, 2, display_buff[3]);
  507.                                 OLED_16x32(32, 2, 11);//-
  508.                                 OLED_16x32(48, 2, display_buff[4]);//月
  509.                                 OLED_16x32(64, 2, display_buff[5]);
  510.                                 OLED_16x32(80, 2, 11);//-
  511.                                 OLED_16x32(96, 2, display_buff[6]);//日
  512.                                 OLED_16x32(112, 2, display_buff[7]);        
  513.                         }
  514.                         else if(RTC_Set_ID==2)
  515.                         {
  516.                                 OLED_16x16CN(32, 0, 17);//月
  517.                                 OLED_16x16CN(48, 0, 18);//份
  518.                                 OLED_16x16CN(64, 0, 14);//设
  519.                                 OLED_16x16CN(80, 0, 15);//置
  520.                         }
  521.                         else if(RTC_Set_ID==3)
  522.                         {
  523.                                 OLED_16x16CN(32, 0, 11);//日
  524.                                 OLED_16x16CN(48, 0, 9);//期
  525.                                 OLED_16x16CN(64, 0, 14);//设
  526.                                 OLED_16x16CN(80, 0, 15);//置
  527.                         }
  528.                         else if(RTC_Set_ID==4)
  529.                         {
  530.                                 OLED_16x16CN(32, 0, 13);//小
  531.                                 OLED_16x16CN(48, 0, 12);//时
  532.                                 OLED_16x16CN(64, 0, 14);//设
  533.                                 OLED_16x16CN(80, 0, 15);//置
  534.                                 OLED_16x32(0, 2, display_buff[8]);//时
  535.                                 OLED_16x32(16, 2, display_buff[9]);
  536.                                 OLED_16x32(32, 2, 10);//:
  537.                                 OLED_16x32(48, 2, display_buff[10]);//分
  538.                                 OLED_16x32(64, 2, display_buff[11]);
  539.                                 OLED_16x32(80, 2, 10);//:
  540.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  541.                                 OLED_16x32(112, 2, display_buff[13]);
  542.                         }
  543.                         else if(RTC_Set_ID==5)
  544.                         {
  545.                                 OLED_16x16CN(32, 0, 19);//分
  546.                                 OLED_16x16CN(48, 0, 20);//钟
  547.                                 OLED_16x16CN(64, 0, 14);//设
  548.                                 OLED_16x16CN(80, 0, 15);//置
  549.                         }
  550.                         else if(RTC_Set_ID==6)
  551.                         {
  552.                                 OLED_16x16CN(32, 0, 21);//秒
  553.                                 OLED_16x16CN(48, 0, 22);//数
  554.                                 OLED_16x16CN(64, 0, 14);//设
  555.                                 OLED_16x16CN(80, 0, 15);//置
  556.                         }
  557.                         else if(RTC_Set_ID==7)
  558.                         {
  559.                                 OLED_Fill(0x00);
  560.                                 OLED_16x16CN(32, 0, 8);//星
  561.                                 OLED_16x16CN(48, 0, 9);//期
  562.                                 OLED_16x16CN(64, 0, 14);//设
  563.                                 OLED_16x16CN(80, 0, 15);//置
  564.                                 OLED_16x32(40, 2, 12);//星
  565.                                 OLED_16x32(56, 2, 13);//期
  566.                                 OLED_16x32(72, 2, display_buff[15]+13);
  567.                         }
  568.                 }

  569.                 else if(Im[2]==0x40)//遥控器+键
  570.                 {
  571.                         laba_flag=1;   //蜂鸣器响一声
  572.                         shezhi_display_flag=1;
  573.                         if(RTC_Set_ID==1)
  574.                         {
  575.                                 if(RTC_Data[6]<99)          //年+
  576.                                         RTC_Data[6]++;
  577.                                 display1();
  578.                                 OLED_16x32(0, 2, display_buff[2]);//年
  579.                                 OLED_16x32(16, 2, display_buff[3]);
  580.                                 OLED_16x32(32, 2, 11);//-
  581.                                 OLED_16x32(48, 2, display_buff[4]);//月
  582.                                 OLED_16x32(64, 2, display_buff[5]);
  583.                                 OLED_16x32(80, 2, 11);//-
  584.                                 OLED_16x32(96, 2, display_buff[6]);//日
  585.                                 OLED_16x32(112, 2, display_buff[7]);
  586.                         }
  587.                         else if(RTC_Set_ID==2)
  588.                         {
  589.                                 if(RTC_Data[4]<12)          //月+
  590.                                         RTC_Data[4]++;
  591.                                 display1();
  592.                                 OLED_16x32(0, 2, display_buff[2]);//年
  593.                                 OLED_16x32(16, 2, display_buff[3]);
  594.                                 OLED_16x32(32, 2, 11);//-
  595.                                 OLED_16x32(48, 2, display_buff[4]);//月
  596.                                 OLED_16x32(64, 2, display_buff[5]);
  597.                                 OLED_16x32(80, 2, 11);//-
  598.                                 OLED_16x32(96, 2, display_buff[6]);//日
  599.                                 OLED_16x32(112, 2, display_buff[7]);
  600.                         }
  601.                         else if(RTC_Set_ID==3)
  602.                         {
  603.                                 if(RTC_Data[3]<31)          //日+
  604.                                         RTC_Data[3]++;
  605.                                 display1();
  606.                                 OLED_16x32(0, 2, display_buff[2]);//年
  607.                                 OLED_16x32(16, 2, display_buff[3]);
  608.                                 OLED_16x32(32, 2, 11);//-
  609.                                 OLED_16x32(48, 2, display_buff[4]);//月
  610.                                 OLED_16x32(64, 2, display_buff[5]);
  611.                                 OLED_16x32(80, 2, 11);//-
  612.                                 OLED_16x32(96, 2, display_buff[6]);//日
  613.                                 OLED_16x32(112, 2, display_buff[7]);
  614.                         }
  615.                         else if(RTC_Set_ID==4)
  616.                         {
  617.                                 if(RTC_Data[2]<23)          //时+
  618.                                         RTC_Data[2]++;
  619.                                 display1();
  620.                                 OLED_16x32(0, 2, display_buff[8]);//时
  621.                                 OLED_16x32(16, 2, display_buff[9]);
  622.                                 OLED_16x32(32, 2, 10);//:
  623.                                 OLED_16x32(48, 2, display_buff[10]);//分
  624.                                 OLED_16x32(64, 2, display_buff[11]);
  625.                                 OLED_16x32(80, 2, 10);//:
  626.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  627.                                 OLED_16x32(112, 2, display_buff[13]);
  628.                         }
  629.                         else if(RTC_Set_ID==5)
  630.                         {
  631.                                 if(RTC_Data[1]<59)          //分+
  632.                                         RTC_Data[1]++;
  633.                                 display1();
  634.                                 OLED_16x32(0, 2, display_buff[8]);//时
  635.                                 OLED_16x32(16, 2, display_buff[9]);
  636.                                 OLED_16x32(32, 2, 10);//:
  637.                                 OLED_16x32(48, 2, display_buff[10]);//分
  638.                                 OLED_16x32(64, 2, display_buff[11]);
  639.                                 OLED_16x32(80, 2, 10);//:
  640.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  641.                                 OLED_16x32(112, 2, display_buff[13]);
  642.                         }
  643.                         else if(RTC_Set_ID==6)
  644.                         {
  645.                                 if(RTC_Data[0]<59)          //秒+
  646.                                         RTC_Data[0]++;
  647.                                 display1();
  648.                                 OLED_16x32(0, 2, display_buff[8]);//时
  649.                                 OLED_16x32(16, 2, display_buff[9]);
  650.                                 OLED_16x32(32, 2, 10);//:
  651.                                 OLED_16x32(48, 2, display_buff[10]);//分
  652.                                 OLED_16x32(64, 2, display_buff[11]);
  653.                                 OLED_16x32(80, 2, 10);//:
  654.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  655.                                 OLED_16x32(112, 2, display_buff[13]);
  656.                         }
  657.                         else if(RTC_Set_ID==7)
  658.                         {
  659.                                 if(RTC_Data[5]<7)          //周+
  660.                                         RTC_Data[5]++;
  661.                                 display1();
  662.                                 OLED_16x32(40, 2, 12);//星
  663.                                 OLED_16x32(56, 2, 13);//期
  664.                                 OLED_16x32(72, 2, display_buff[15]+13);
  665.                         }
  666.                 }

  667.                 else if(Im[2]==0x19)//遥控器-键
  668.                 {
  669.                         laba_flag=1;          //蜂鸣器响一声
  670.                         shezhi_display_flag=1;
  671.                         if(RTC_Set_ID==1)
  672.                         {
  673.                                 if(RTC_Data[6])                   //年-
  674.                                         RTC_Data[6]--;
  675.                                 display1();
  676.                                 OLED_16x32(0, 2, display_buff[2]);//年
  677.                                 OLED_16x32(16, 2, display_buff[3]);
  678.                                 OLED_16x32(32, 2, 11);//-
  679.                                 OLED_16x32(48, 2, display_buff[4]);//月
  680.                                 OLED_16x32(64, 2, display_buff[5]);
  681.                                 OLED_16x32(80, 2, 11);//-
  682.                                 OLED_16x32(96, 2, display_buff[6]);//日
  683.                                 OLED_16x32(112, 2, display_buff[7]);
  684.                         }
  685.                         else if(RTC_Set_ID==2)
  686.                         {
  687.                                 if(RTC_Data[4])                   //月-
  688.                                         RTC_Data[4]--;
  689.                                 display1();
  690.                                 OLED_16x32(0, 2, display_buff[2]);//年
  691.                                 OLED_16x32(16, 2, display_buff[3]);
  692.                                 OLED_16x32(32, 2, 11);//-
  693.                                 OLED_16x32(48, 2, display_buff[4]);//月
  694.                                 OLED_16x32(64, 2, display_buff[5]);
  695.                                 OLED_16x32(80, 2, 11);//-
  696.                                 OLED_16x32(96, 2, display_buff[6]);//日
  697.                                 OLED_16x32(112, 2, display_buff[7]);
  698.                         }
  699.                         else if(RTC_Set_ID==3)
  700.                         {
  701.                                 if(RTC_Data[3])                   //日-
  702.                                         RTC_Data[3]--;
  703.                                 display1();
  704.                                 OLED_16x32(0, 2, display_buff[2]);//年
  705.                                 OLED_16x32(16, 2, display_buff[3]);
  706.                                 OLED_16x32(32, 2, 11);//-
  707.                                 OLED_16x32(48, 2, display_buff[4]);//月
  708.                                 OLED_16x32(64, 2, display_buff[5]);
  709.                                 OLED_16x32(80, 2, 11);//-
  710.                                 OLED_16x32(96, 2, display_buff[6]);//日
  711.                                 OLED_16x32(112, 2, display_buff[7]);
  712.                         }
  713.                         else if(RTC_Set_ID==4)
  714.                         {
  715.                                 if(RTC_Data[2])                   //时-
  716.                                         RTC_Data[2]--;
  717.                                 display1();
  718.                                 OLED_16x32(0, 2, display_buff[8]);//时
  719.                                 OLED_16x32(16, 2, display_buff[9]);
  720.                                 OLED_16x32(32, 2, 10);//:
  721.                                 OLED_16x32(48, 2, display_buff[10]);//分
  722.                                 OLED_16x32(64, 2, display_buff[11]);
  723.                                 OLED_16x32(80, 2, 10);//:
  724.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  725.                                 OLED_16x32(112, 2, display_buff[13]);
  726.                         }
  727.                         else if(RTC_Set_ID==5)
  728.                         {
  729.                                 if(RTC_Data[1])                   //分-
  730.                                         RTC_Data[1]--;
  731.                                 display1();
  732.                                 OLED_16x32(0, 2, display_buff[8]);//时
  733.                                 OLED_16x32(16, 2, display_buff[9]);
  734.                                 OLED_16x32(32, 2, 10);//:
  735.                                 OLED_16x32(48, 2, display_buff[10]);//分
  736.                                 OLED_16x32(64, 2, display_buff[11]);
  737.                                 OLED_16x32(80, 2, 10);//:
  738.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  739.                                 OLED_16x32(112, 2, display_buff[13]);
  740.                         }
  741.                         else if(RTC_Set_ID==6)
  742.                         {
  743.                                 if(RTC_Data[0])                   //秒-
  744.                                         RTC_Data[0]--;
  745.                                 display1();
  746.                                 OLED_16x32(0, 2, display_buff[8]);//时
  747.                                 OLED_16x32(16, 2, display_buff[9]);
  748.                                 OLED_16x32(32, 2, 10);//:
  749.                                 OLED_16x32(48, 2, display_buff[10]);//分
  750.                                 OLED_16x32(64, 2, display_buff[11]);
  751.                                 OLED_16x32(80, 2, 10);//:
  752.                                 OLED_16x32(96, 2, display_buff[12]);//秒
  753.                                 OLED_16x32(112, 2, display_buff[13]);
  754.                         }
  755.                         else if(RTC_Set_ID==7)
  756.                         {
  757.                                 if(RTC_Data[5])                   //周-
  758.                                         RTC_Data[5]--;
  759.                                 display1();
  760.                                 OLED_16x32(40, 2, 12);//星
  761.                                 OLED_16x32(56, 2, 13);//期
  762.                                 OLED_16x32(72, 2, display_buff[15]+13);
  763.                         }
  764.                 }
  765.                 else if(Im[2]==0x15)//遥控器播放键
  766.                 {
  767.                         laba_flag=1;
  768.                         shezhi_display_flag=0;
  769.                         RTC_Save_Flag=1;
  770.                 }
  771.                 IrOK=0;
  772.         }
  773. }
  774. void delayms(uint x)
  775. {
  776.         uint i,j;
  777.         for(i=x;i<0;i--)
  778.                 for(j=110;j<0;j--);
  779. }
  780. /*****************************************************************************************************
  781. ***********************************************oled12864函数******************************************
  782. *****************************************************************************************************/
  783. void oled_IIC_Start()//开始
  784. {
  785.    oled_SCL = 1;               
  786.    oled_SDA = 1;
  787.    oled_SDA = 0;
  788.    oled_SCL = 0;
  789. }
  790. void oled_IIC_Stop()//停止
  791. {
  792.    oled_SCL = 0;
  793.    oled_SDA = 0;
  794.    oled_SCL = 1;
  795.    oled_SDA = 1;
  796. }
  797. void oled_Write_IIC_Byte(uchar IIC_Byte)//写字节
  798. {
  799.         uchar i;
  800.         for(i=0;i<8;i++)
  801.         {
  802.                 if(IIC_Byte & 0x80)
  803.                         oled_SDA=1;
  804.                 else
  805.                 oled_SDA=0;
  806.                 oled_SCL=1;
  807.                 oled_SCL=0;
  808.                 IIC_Byte<<=1;
  809.         }
  810.         oled_SDA=1;
  811.         oled_SCL=1;
  812.         oled_SCL=0;
  813. }
  814. void OLED_12864_Write_data(uint dat)//写入数据
  815. {
  816.         oled_IIC_Start();
  817.         oled_Write_IIC_Byte(0x78);
  818.         oled_Write_IIC_Byte(0x40);
  819.         oled_Write_IIC_Byte(dat);
  820.         oled_IIC_Stop();
  821. }
  822. void OLED_12864_Write_commomand(uint dat)//写入命令
  823. {
  824.         oled_IIC_Start();
  825.         oled_Write_IIC_Byte(0x78);
  826.         oled_Write_IIC_Byte(0x00);
  827.         oled_Write_IIC_Byte(dat);
  828.         oled_IIC_Stop();
  829. }
  830. void OLED_SetPos(uchar x, uchar y)//设置起始坐标
  831. {
  832.         OLED_12864_Write_commomand(0xb0+y);
  833.         OLED_12864_Write_commomand(((x&0xf0)>>4)|0x10);
  834.         OLED_12864_Write_commomand((x&0x0f)|0x01);
  835. }
  836. void OLED_Fill(uchar bmp_dat)//屏幕填充
  837. {
  838.         uchar y,x;
  839.         for(y=0;y<8;y++)
  840.         {
  841.                 OLED_12864_Write_commomand(0xb0+y);
  842.                 OLED_12864_Write_commomand(0x01);
  843.                 OLED_12864_Write_commomand(0x10);
  844.                 for(x=0;x<128;x++)
  845.                 OLED_12864_Write_data(bmp_dat);
  846.         }
  847. }
  848. void OLED_12864_Init()//OLED12864初始化
  849. {
  850.         delayms(500);                                                //初始化之前的延时很重要!
  851.         OLED_12864_Write_commomand(0xae);
  852.         OLED_12864_Write_commomand(0x00);
  853.         OLED_12864_Write_commomand(0x10);
  854.         OLED_12864_Write_commomand(0x40);
  855.         OLED_12864_Write_commomand(0x81);
  856.         OLED_12864_Write_commomand(0xcf);
  857.         OLED_12864_Write_commomand(0xa1);
  858.         OLED_12864_Write_commomand(0xc8);
  859.         OLED_12864_Write_commomand(0xa6);
  860.         OLED_12864_Write_commomand(0xa8);
  861.         OLED_12864_Write_commomand(0x3f);
  862.         OLED_12864_Write_commomand(0xd3);
  863.         OLED_12864_Write_commomand(0x00);
  864.         OLED_12864_Write_commomand(0xd5);
  865.         OLED_12864_Write_commomand(0x80);
  866.         OLED_12864_Write_commomand(0xd9);
  867.         OLED_12864_Write_commomand(0xf1);
  868.         OLED_12864_Write_commomand(0xda);
  869.         OLED_12864_Write_commomand(0x12);
  870.         OLED_12864_Write_commomand(0xdb);
  871.         OLED_12864_Write_commomand(0x40);
  872.         OLED_12864_Write_commomand(0x20);
  873.         OLED_12864_Write_commomand(0x02);
  874.         OLED_12864_Write_commomand(0x8d);
  875.         OLED_12864_Write_commomand(0x14);
  876.         OLED_12864_Write_commomand(0xa4);
  877.         OLED_12864_Write_commomand(0xa6);
  878.         OLED_12864_Write_commomand(0xaf);
  879.         OLED_Fill(0x00);                                         //清屏
  880.         OLED_SetPos(0,0);
  881. }
  882. void OLED_8x16Str(uchar x, uchar y, uchar ch)
  883. {
  884.         uchar i=0;
  885.         if(x>120)
  886.         {
  887.                 x=0;y++;
  888.         }

  889.         OLED_SetPos(x,y);
  890.         for(i=0;i<8;i++)
  891.         {
  892.                 OLED_12864_Write_data(F8X16[ch*16+i]);
  893.         }

  894.         OLED_SetPos(x,y+1);
  895.         for(i=0;i<8;i++)
  896.         {
  897.                 OLED_12864_Write_data(F8X16[ch*16+i+8]);
  898.         }
  899. }
  900. void OLED_16x16CN(uchar x,uchar y,uchar N)//显示16*16的坐标(x,y),y为页范围0~7
  901. {
  902.         uchar i=0;
  903.         uint adder=32*N;

  904.         OLED_SetPos(x,y);
  905.         for(i=0;i<16;i++)
  906.         {
  907.                 OLED_12864_Write_data(F16x16[adder]);
  908.                 adder+=1;
  909.         }

  910.         OLED_SetPos(x,y+1);
  911.         for(i=0;i<16;i++)
  912.         {
  913.                 OLED_12864_Write_data(F16x16[adder]);
  914.                 adder+=1;
  915.         }
  916. }
  917. void OLED_16x32(uchar x, uchar y, uchar ch)//显示8*16的坐标(x,y),y为页范围0~7
  918. {
  919.         uchar i=0;
  920.         if(x>120)
  921.         {
  922.                 x=0;y++;
  923.         }

  924.         OLED_SetPos(x,y);
  925.         for(i=0;i<16;i++)
  926.         {
  927.                 OLED_12864_Write_data(F16X32[ch*64+i]);
  928.         }

  929.         OLED_SetPos(x,y+1);
  930.         for(i=0;i<16;i++)
  931.         {
  932.                 OLED_12864_Write_data(F16X32[ch*64+i+16]);
  933.         }
  934.         OLED_SetPos(x,y+2);
  935.         for(i=0;i<16;i++)
  936.         {
  937.                 OLED_12864_Write_data(F16X32[ch*64+i+32]);
  938.         }
  939.         OLED_SetPos(x,y+3);
  940.         for(i=0;i<16;i++)
  941.         {
  942.                 OLED_12864_Write_data(F16X32[ch*64+i+48]);
  943.         }
  944. }
  945. /*****************************************************************************************************
  946. ***********************************************显示函数***********************************************
  947. *****************************************************************************************************/
  948. void display1()
  949. {
  950.         display_buff[0] =2;
  951.         display_buff[1] =0;
  952.         display_buff[2] =RTC_Data[6]/10;
  953.         display_buff[3] =RTC_Data[6]%10;                //年
  954.         
  955.         display_buff[4] =RTC_Data[4]/10;
  956.         display_buff[5] =RTC_Data[4]%10;                //月
  957.         
  958.         display_buff[6] =RTC_Data[3]/10;
  959.         display_buff[7] =RTC_Data[3]%10;                //日
  960.         
  961.         display_buff[8] =RTC_Data[2]/10;
  962.         display_buff[9] =RTC_Data[2]%10;                //时
  963.         
  964.         display_buff[10] =RTC_Data[1]/10;
  965.         display_buff[11] =RTC_Data[1]%10;                //分
  966.         
  967.         display_buff[12] =RTC_Data[0]/10;
  968.         display_buff[13] =RTC_Data[0]%10;                //秒
  969.         
  970.         display_buff[14] =RTC_Data[5]/10;
  971.         display_buff[15] =RTC_Data[5]%10;                //星期

  972.         display_buff[16] =RTC_Data[7]/10;
  973.         display_buff[17] =RTC_Data[7]%10;                //温度
  974. }
  975. void display2()
  976. {
  977.         OLED_8x16Str(24, 0, display_buff[0]);// 年
  978.         OLED_8x16Str(32, 0, display_buff[1]);
  979.         OLED_8x16Str(40, 0, display_buff[2]);
  980.         OLED_8x16Str(48, 0, display_buff[3]);
  981.         OLED_8x16Str(56, 0, 10);                         // -
  982.         OLED_8x16Str(64, 0, display_buff[4]);// 月
  983.         OLED_8x16Str(72, 0, display_buff[5]);
  984.         OLED_8x16Str(80, 0, 10);                         // -
  985.         OLED_8x16Str(88, 0, display_buff[6]);// 日
  986.         OLED_8x16Str(96, 0, display_buff[7]);

  987.         OLED_16x32(0, 2, display_buff[8]);// 时
  988.         OLED_16x32(16, 2, display_buff[9]);

  989.         OLED_16x32(48, 2, display_buff[10]);// 分
  990.         OLED_16x32(64, 2, display_buff[11]);

  991.         OLED_16x32(96, 2, display_buff[12]);// 秒
  992.         OLED_16x32(112, 2, display_buff[13]);

  993.         if(RTC_Data[0]/1%2==0)  OLED_16x32(32, 2, 10);// :
  994.         else  OLED_16x32(32, 2, 21);
  995.         if(RTC_Data[0]/1%2==0)  OLED_16x32(80, 2, 10);// :
  996.         else  OLED_16x32(80, 2, 21);

  997.         OLED_16x16CN(8, 6, 8);// 星
  998.         OLED_16x16CN(24, 6, 9);// 期
  999.         OLED_16x16CN(40, 6, display_buff[15]);// ?

  1000.         OLED_8x16Str(96, 6, display_buff[16]);// 温度
  1001.         OLED_8x16Str(104, 6, display_buff[17]);
  1002.         OLED_16x16CN(112, 6, 10);// ℃
  1003. }
  1004. /*****************************************************************************************************
  1005. **********************************************DS3231函数**********************************************
  1006. *****************************************************************************************************/
  1007. void DS3231_IIC_delay()//IIC延时函数。延时4个机器周期。   
  1008. {
  1009.         _nop_();_nop_();_nop_();_nop_();
  1010. }

  1011. void DS3231_IIC_start()//起始信号
  1012. {   
  1013.      DS3231_IIC_SDA=1;
  1014.      DS3231_IIC_SCL=1;
  1015.      DS3231_IIC_delay();
  1016.      DS3231_IIC_SDA=0;
  1017.      DS3231_IIC_delay();
  1018.      DS3231_IIC_SCL=0;
  1019. }

  1020. void DS3231_IIC_stop()//停止信号
  1021. {
  1022.     DS3231_IIC_SDA=0;
  1023.     DS3231_IIC_delay();
  1024.     DS3231_IIC_SCL=1;
  1025.     DS3231_IIC_delay();
  1026.     DS3231_IIC_SDA=1;
  1027.     DS3231_IIC_delay();
  1028. }

  1029. bit DS3231_IIC_Tack()//接收应答
  1030. {
  1031.     bit ack;
  1032.     DS3231_IIC_SDA=1;
  1033.     DS3231_IIC_delay();
  1034.     DS3231_IIC_SCL=1;
  1035.     DS3231_IIC_delay();
  1036.     ack=DS3231_IIC_SDA;
  1037.     DS3231_IIC_delay();
  1038.     DS3231_IIC_SCL=0;
  1039.     DS3231_IIC_delay();
  1040.     return ack;
  1041. }

  1042. void DS3231_IIC_write_byte(uchar Data)//写入数据函数
  1043. {
  1044.         uchar i;
  1045.         for(i=0;i<8;i++)
  1046.         {
  1047.                 if(Data&0x80)
  1048.                 DS3231_IIC_SDA=1;
  1049.                 else
  1050.                 DS3231_IIC_SDA = 0;
  1051.                 DS3231_IIC_delay();
  1052.                 DS3231_IIC_SCL=1;
  1053.                 DS3231_IIC_delay();
  1054.                 DS3231_IIC_SCL=0;
  1055.                 DS3231_IIC_delay();
  1056.                 Data=Data<<1;
  1057.         }
  1058. }

  1059. uchar DS3231_IIC_read_byte()//读取数据函数
  1060. {
  1061.     uchar i;
  1062.     uchar Data;      
  1063.     for(i=0;i<8;i++)
  1064.     {
  1065.         DS3231_IIC_SCL=1;
  1066.         DS3231_IIC_delay();
  1067.         Data=Data<<1;
  1068.         DS3231_IIC_delay();
  1069.       
  1070.         if(DS3231_IIC_SDA)
  1071.         Data=Data|0x01;
  1072.         DS3231_IIC_SCL=0;
  1073.         DS3231_IIC_delay();
  1074.     }
  1075.     return Data;
  1076. }

  1077. void DS3231_IIC_single_byte_write(uchar Waddr,uchar Data)//写入数据函数
  1078. {
  1079.     DS3231_IIC_start();
  1080.     DS3231_IIC_write_byte(0xd0);
  1081.     DS3231_IIC_Tack();
  1082.     DS3231_IIC_write_byte(Waddr);
  1083.     DS3231_IIC_Tack();
  1084.     DS3231_IIC_write_byte(Data);
  1085.     DS3231_IIC_Tack();
  1086.     DS3231_IIC_stop();
  1087. }

  1088. uchar DS3231_IIC_single_byte_read(uchar Waddr)//读取数据函数
  1089. {
  1090.     uchar Data;
  1091.     DS3231_IIC_start();
  1092.     DS3231_IIC_write_byte(0xd0);
  1093.     DS3231_IIC_Tack();
  1094.     DS3231_IIC_write_byte(Waddr);
  1095.     DS3231_IIC_Tack();
  1096.     DS3231_IIC_stop();
  1097.     DS3231_IIC_start();
  1098.     DS3231_IIC_write_byte(0xd1);
  1099.     DS3231_IIC_Tack();
  1100.     Data=DS3231_IIC_read_byte();
  1101.     DS3231_IIC_delay();
  1102.     DS3231_IIC_stop();
  1103.     return Data;
  1104. }

  1105. void DS3231_Read_time()//读取时间
  1106. {
  1107.     uchar i,tmp,tmp1,tmp2;         
  1108.     for(i=0;i<8;i++)
  1109.     {
  1110.             tmp = DS3231_IIC_single_byte_read(rtc_address[i]);
  1111.             tmp1 = tmp/16;
  1112.             tmp2 = tmp%16;
  1113.                 RTC_Data[i]=tmp1*10+tmp2;
  1114.     }   
  1115. }

  1116. void DS3231_write_time()//写入时间
  1117. {
  1118.     uchar i,tmp;
  1119.     for(i=0;i<7;i++)
  1120.     {      
  1121.         tmp=RTC_Data[i]/10;//BCD处理
  1122.         RTC_Data1[i]=RTC_Data[i]%10;
  1123.         RTC_Data1[i]=RTC_Data1[i]+tmp*16;
  1124.     }
  1125.     for(i=0;i<7;i++)
  1126.     {
  1127.         DS3231_IIC_single_byte_write(rtc_address[i],RTC_Data1[i]);
  1128.     }
  1129.     DS3231_IIC_single_byte_write(0x0e,0x0c);
  1130. }

  1131. void DS3231_Init()
  1132. {
  1133.     DS3231_IIC_SDA=1;
  1134.     DS3231_IIC_SCL=1;
  1135.     DS3231_IIC_single_byte_write(0x0e,0x0c);
  1136. }
  1137. /*****************************************************************************************************
  1138. *****************************************125us定时 中断服务函数***************************************
  1139. *****************************************************************************************************/
  1140. void Time1() interrupt 3
  1141. {
  1142.         static uchar timecount;
  1143.         TF1=0;
  1144.         TH1=0xff;//125us
  1145.         TL1=256-110;
  1146.         
  1147.         timecount++;
  1148.         if(timecount>=16)//1ms
  1149.         {
  1150.                 timecount=0;
  1151.                 T0_Flag=1;
  1152.         }
  1153.         if(laba_flag)
  1154.         {
  1155.                 laba=~laba;
  1156.         }
  1157.         else
  1158.         laba=0;
  1159. }
  1160. /*****************************************************************************************************
  1161. *************************************红外解码定时器程序***********************************************
  1162. *****************************************************************************************************/
  1163. void intersvr1(void) interrupt 2 using 1   //外部中断解码程序_外部中断1          P3.3口
  1164. {
  1165.         Tc=TH0*256+TL0;//提取中断时间间隔时长
  1166.         TH0=0;
  1167.         TL0=0;         //定时中断重新置零

  1168.         if((Tc>Imin)&&(Tc<Imax))
  1169.         {
  1170.                 m=0;
  1171.                 f=1;
  1172.                 return;
  1173.         }              //找到启始码
  1174.         if(f==1)
  1175.         {
  1176.                 if(Tc>Inum1&&Tc<Inum3)
  1177.                 {
  1178.                         Im[m/8]=Im[m/8]>>1|0x80; m++;
  1179.                 }
  1180.                 if(Tc>Inum2&&Tc<Inum1)
  1181.                 {
  1182.                         Im[m/8]=Im[m/8]>>1; m++; //取码
  1183.                 }
  1184.                 if(m==32)
  1185.                 {
  1186.                         m=0;  
  1187.                         f=0;
  1188.                         if(Im[2]==~Im[3])
  1189.                         {
  1190.                                 IrOK=1;
  1191.                         }
  1192.                         else IrOK=0;   //取码完成后判断读码是否正确
  1193.                 }
  1194.         }
  1195. }

复制代码

所有资料51hei提供下载:
OLED_12864万年历.rar (5.61 MB, 下载次数: 398)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏15 分享淘帖 顶1 踩1
回复

使用道具 举报

来自 2#
ID:108715 发表于 2018-9-11 22:30 | 只看该作者
亲!!!!

老师没有教你抄袭的时候修改修改不能照抄不误吗?
http://www.51hei.com/bbs/dpj-77491-1.html

除了一开始这段文字没了,其它完全就是复制黏贴,
这几天忙着调试程序,等过几天准备整理整理后再发帖,pcb版的1.8寸数码管显示,欢迎再次抄袭,不过请亲注明出处。

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:57896 发表于 2017-12-25 21:22 | 只看该作者
这么好的资料没人顶吗?楼主威武!
回复

使用道具 举报

地板
ID:64089 发表于 2017-12-26 08:16 | 只看该作者
非常好用的资料,楼主分享及时,谢谢
回复

使用道具 举报

5#
ID:243748 发表于 2017-12-28 00:19 来自手机 | 只看该作者
赞一个,很好的学习资料
回复

使用道具 举报

6#
ID:304684 发表于 2018-4-9 20:30 | 只看该作者
很好的学习资料,谢谢楼主分享
回复

使用道具 举报

7#
ID:139071 发表于 2018-4-11 10:52 | 只看该作者
这个能用点阵屏吗
回复

使用道具 举报

8#
ID:139071 发表于 2018-4-11 10:54 | 只看该作者
无敌给力。。。
回复

使用道具 举报

9#
ID:4294 发表于 2018-8-5 16:16 | 只看该作者
很好的资料,谢谢了,哈哈
回复

使用道具 举报

10#
ID:380389 发表于 2018-8-8 06:46 来自手机 | 只看该作者
感谢楼主分享
回复

使用道具 举报

11#
ID:382322 发表于 2018-8-10 14:35 | 只看该作者
冒个泡
回复

使用道具 举报

12#
ID:89072 发表于 2018-8-14 18:47 | 只看该作者
学习下楼主厉害啊
回复

使用道具 举报

13#
ID:371527 发表于 2018-8-19 16:50 | 只看该作者
OLED使用寿命是多少小时?
回复

使用道具 举报

14#
ID:397024 发表于 2018-9-12 16:37 | 只看该作者
很好的资料,谢谢了,哈哈
回复

使用道具 举报

15#
ID:497494 发表于 2019-7-6 11:45 来自手机 | 只看该作者
请问走时,时基函数是什么意思,没有注释,看不懂,谢谢楼主

mmexport1562384206242.jpg (123.74 KB, 下载次数: 40)

mmexport1562384206242.jpg

mmexport1562384203690.jpg (89.31 KB, 下载次数: 33)

mmexport1562384203690.jpg
回复

使用道具 举报

16#
ID:547522 发表于 2019-7-6 21:29 来自手机 | 只看该作者
对于我来说超牛啊,51黑有你更精彩。
回复

使用道具 举报

17#
ID:92810 发表于 2019-7-8 16:25 | 只看该作者
谢谢楼主分享了,学习了
回复

使用道具 举报

18#
ID:585455 发表于 2019-7-19 10:15 | 只看该作者
好文必須推一把
回复

使用道具 举报

19#
ID:55219 发表于 2019-8-13 23:54 来自手机 | 只看该作者
啦啦啦1234 发表于 2018-9-11 22:30
亲!!!!

老师没有教你抄袭的时候修改修改不能照抄不误吗?

问下,如果在设置时间的时候,比如设置秒,怎么才能做到在秒个位实现反白显示?有人发过spi总线的实现方式,但是i2c的,我根据那方法没能实现,所以请教一下,我的是0.96的屏
回复

使用道具 举报

20#
ID:594143 发表于 2019-8-14 21:50 | 只看该作者
不错,赞一个!
回复

使用道具 举报

21#
ID:155987 发表于 2020-5-10 11:08 | 只看该作者
显示的有问题,根本不对
回复

使用道具 举报

22#
ID:639106 发表于 2020-5-13 09:12 | 只看该作者
哈哈,终于找到一个实用的程序了!
回复

使用道具 举报

23#
ID:928096 发表于 2021-5-30 23:34 | 只看该作者
7针spi的可以用吗?
回复

使用道具 举报

24#
ID:928096 发表于 2021-6-1 22:52 | 只看该作者
ds1302可以用吗?
回复

使用道具 举报

25#
ID:372579 发表于 2021-6-28 20:52 来自手机 | 只看该作者
不错,下来试验下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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