标题: 单片机驱动DS1302时钟显示proteus仿真电路 程序 [打印本页]

作者: 差不多111111    时间: 2017-5-18 00:28
标题: 单片机驱动DS1302时钟显示proteus仿真电路 程序
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <REG51.H>
  2. #include <intrins.h>
  3. //#include "LCD1602.h"
  4. //#include "DS1302.h"
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. sbit  DS1302_CLK = P1^7;              //实时时钟时钟线引脚
  8. sbit  DS1302_IO  = P1^6;              //实时时钟数据线引脚
  9. sbit  DS1302_RST = P1^5;              //实时时钟复位线引脚
  10. sbit  wireless_1 = P3^0;
  11. sbit  wireless_2 = P3^1;
  12. sbit  wireless_3 = P3^2;
  13. sbit  wireless_4 = P3^3;
  14. sbit  ACC0 = ACC^0;
  15. sbit  ACC7 = ACC^7;
  16. char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数
  17. sbit Set = P2^0;       //模式切换键
  18. sbit Up = P2^1;        //加法按钮
  19. sbit Down = P2^2;      //减法按钮
  20. sbit out = P2^3;       //立刻跳出调整模式按钮

  21. char done,count,temp,flag,up_flag,down_flag;

  22. uchar week_value[2];


  23. void show_time();   //液晶显示程序
  24. /***********1602液晶显示部分子程序****************/


  25. //Port Definitions**********************************************************
  26. sbit LcdRs                = P2^5;
  27. sbit LcdRw                = P2^6;
  28. sbit LcdEn          = P2^7;
  29. sfr  DBPort         = 0x80;                //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

  30. //内部等待函数**************************************************************************
  31. unsigned char LCD_Wait(void)
  32. {
  33.         LcdRs=0;
  34.         LcdRw=1;        _nop_();
  35.         LcdEn=1;        _nop_();
  36.                                                 
  37.         LcdEn=0;
  38.         return DBPort;               
  39. }
  40. //向LCD写入命令或数据************************************************************
  41. #define LCD_COMMAND                        0      // Command
  42. #define LCD_DATA                        1      // Data
  43. #define LCD_CLEAR_SCREEN        0x01      // 清屏
  44. #define LCD_HOMING                  0x02      // 光标返回原点
  45. void LCD_Write(bit style, unsigned char input)
  46. {
  47.         LcdEn=0;
  48.         LcdRs=style;
  49.         LcdRw=0;                _nop_();
  50.         DBPort=input;        _nop_();//注意顺序
  51.         LcdEn=1;                _nop_();//注意顺序
  52.         LcdEn=0;                _nop_();
  53.         LCD_Wait();        
  54. }

  55. //设置显示模式************************************************************
  56. #define LCD_SHOW                        0x04    //显示开
  57. #define LCD_HIDE                        0x00    //显示关         

  58. #define LCD_CURSOR                        0x02         //显示光标
  59. #define LCD_NO_CURSOR                0x00    //无光标                     

  60. #define LCD_FLASH                        0x01    //光标闪动
  61. #define LCD_NO_FLASH                0x00    //光标不闪动

  62. void LCD_SetDisplay(unsigned char DisplayMode)
  63. {
  64.         LCD_Write(LCD_COMMAND, 0x08|DisplayMode);        
  65. }

  66. //设置输入模式************************************************************
  67. #define LCD_AC_UP                        0x02
  68. #define LCD_AC_DOWN                        0x00      // default

  69. #define LCD_MOVE                        0x01      // 画面可平移
  70. #define LCD_NO_MOVE                        0x00      //default

  71. void LCD_SetInput(unsigned char InputMode)
  72. {
  73.         LCD_Write(LCD_COMMAND, 0x04|InputMode);
  74. }

  75. //初始化LCD************************************************************
  76. void LCD_Initial()
  77. {
  78.         LcdEn=0;
  79.         LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
  80.         LCD_Write(LCD_COMMAND,0x38);
  81.         LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
  82.         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  83.         LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
  84. }

  85. //液晶字符输入的位置************************
  86. void GotoXY(unsigned char x, unsigned char y)
  87. {
  88.         if(y==0)
  89.                 LCD_Write(LCD_COMMAND,0x80|x);
  90.         if(y==1)
  91.                 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  92. }

  93. //将字符输出到液晶显示
  94. void Print(unsigned char *str)
  95. {
  96.         while(*str!='\0')
  97.         {
  98.                 LCD_Write(LCD_DATA,*str);
  99.                 str++;
  100.         }
  101. }






  102. /***********DS1302时钟部分子程序******************/
  103. typedef struct __SYSTEMTIME__
  104. {
  105.         unsigned char Second;
  106.         unsigned char Minute;
  107.         unsigned char Hour;
  108.         unsigned char Week;
  109.         unsigned char Day;
  110.         unsigned char Month;
  111.         unsigned char  Year;
  112.         unsigned char DateString[11];
  113.         unsigned char TimeString[9];
  114. }SYSTEMTIME;        //定义的时间类型
  115. SYSTEMTIME CurrentTime;


  116. #define AM(X)        X
  117. #define PM(X)        (X+12)                      // 转成24小时制
  118. #define DS1302_SECOND        0x80          //时钟芯片的寄存器位置,存放时间
  119. #define DS1302_MINUTE        0x82
  120. #define DS1302_HOUR                0x84
  121. #define DS1302_WEEK                0x8A
  122. #define DS1302_DAY                0x86
  123. #define DS1302_MONTH        0x88
  124. #define DS1302_YEAR                0x8C

  125. void DS1302InputByte(unsigned char d)         //实时时钟写入一字节(内部函数)
  126. {
  127.     unsigned char i;
  128.     ACC = d;
  129.     for(i=8; i>0; i--)
  130.     {
  131.         DS1302_IO = ACC0;                   //相当于汇编中的 RRC
  132.         DS1302_CLK = 1;
  133.         DS1302_CLK = 0;
  134.         ACC = ACC >> 1;
  135.     }
  136. }

  137. unsigned char DS1302OutputByte(void)         //实时时钟读取一字节(内部函数)
  138. {
  139.     unsigned char i;
  140.     for(i=8; i>0; i--)
  141.     {
  142.         ACC = ACC >>1;                                 //相当于汇编中的 RRC
  143.         ACC7 = DS1302_IO;
  144.         DS1302_CLK = 1;
  145.         DS1302_CLK = 0;
  146.     }
  147.     return(ACC);
  148. }

  149. void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要写的数据
  150. {
  151.     DS1302_RST = 0;
  152.     DS1302_CLK = 0;
  153.     DS1302_RST = 1;
  154.     DS1302InputByte(ucAddr);               // 地址,命令
  155.     DS1302InputByte(ucDa);               // 写1Byte数据
  156.     DS1302_CLK = 1;
  157.     DS1302_RST = 0;
  158. }

  159. unsigned char Read1302(unsigned char ucAddr)        //读取DS1302某地址的数据
  160. {
  161.     unsigned char ucData;
  162.     DS1302_RST = 0;
  163.     DS1302_CLK = 0;
  164.     DS1302_RST = 1;
  165.     DS1302InputByte(ucAddr|0x01);        // 地址,命令
  166.     ucData = DS1302OutputByte();         // 读1Byte数据
  167.     DS1302_CLK = 1;
  168.     DS1302_RST = 0;
  169.     return(ucData);
  170. }



  171. void DS1302_GetTime(SYSTEMTIME *Time)  //获取时钟芯片的时钟数据到自定义的结构型数组
  172. {
  173.         unsigned char ReadValue;
  174.         ReadValue = Read1302(DS1302_SECOND);
  175.         Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  176.         ReadValue = Read1302(DS1302_MINUTE);
  177.         Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  178.         ReadValue = Read1302(DS1302_HOUR);
  179.         Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  180.         ReadValue = Read1302(DS1302_DAY);
  181.         Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
  182.         ReadValue = Read1302(DS1302_WEEK);
  183.         Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  184.         ReadValue = Read1302(DS1302_MONTH);
  185.         Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  186.         ReadValue = Read1302(DS1302_YEAR);
  187.         Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
  188. }

  189. void DateToStr(SYSTEMTIME *Time)    //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
  190. {   if(hide_year<2)                 //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
  191.     {                              
  192.           Time->DateString[0] = '2';
  193.           Time->DateString[1] = '0';         
  194.           Time->DateString[2] = Time->Year/10 + '0';
  195.           Time->DateString[3] = Time->Year%10 + '0';
  196.         }
  197.           else
  198.             {
  199.               Time->DateString[0] = ' ';
  200.               Time->DateString[1] = ' ';                 
  201.               Time->DateString[2] = ' ';
  202.               Time->DateString[3] = ' ';
  203.                 }
  204.         Time->DateString[4] = '/';
  205.         if(hide_month<2)
  206.         {
  207.           Time->DateString[5] = Time->Month/10 + '0';
  208.           Time->DateString[6] = Time->Month%10 + '0';
  209.         }
  210.           else
  211.           {
  212.             Time->DateString[5] = ' ';
  213.             Time->DateString[6] = ' ';
  214.           }
  215.         Time->DateString[7] = '/';
  216.         if(hide_day<2)
  217.         {
  218.           Time->DateString[8] = Time->Day/10 + '0';
  219.           Time->DateString[9] = Time->Day%10 + '0';
  220.         }
  221.           else
  222.           {
  223.             Time->DateString[8] = ' ';
  224.             Time->DateString[9] = ' ';            
  225.           }
  226.         if(hide_week<2)
  227.         {
  228.           week_value[0] = Time->Week%10 + '0';  //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
  229.         }
  230.           else
  231.           {
  232.             week_value[0] = ' ';
  233.           }
  234.           week_value[1] = '\0';

  235.         Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
  236. }

  237. void TimeToStr(SYSTEMTIME *Time)  //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
  238. {   if(hide_hour<2)
  239.     {
  240.           Time->TimeString[0] = Time->Hour/10 + '0';
  241.           Time->TimeString[1] = Time->Hour%10 + '0';
  242.         }
  243.           else
  244.             {
  245.               Time->TimeString[0] = ' ';
  246.               Time->TimeString[1] = ' ';
  247.                 }
  248.         Time->TimeString[2] = ':';
  249.     if(hide_min<2)
  250.         {
  251.           Time->TimeString[3] = Time->Minute/10 + '0';
  252.           Time->TimeString[4] = Time->Minute%10 + '0';
  253.         }
  254.           else
  255.             {
  256.               Time->TimeString[3] = ' ';
  257.               Time->TimeString[4] = ' ';
  258.                }
  259.         Time->TimeString[5] = ':';
  260.     if(hide_sec<2)
  261.     {
  262.           Time->TimeString[6] = Time->Second/10 + '0';
  263.           Time->TimeString[7] = Time->Second%10 + '0';
  264.     }
  265.       else
  266.        {
  267.          Time->TimeString[6] = ' ';
  268.              Time->TimeString[7] = ' ';
  269.        }
  270.         Time->DateString[8] = '\0';
  271. }


  272. void Initial_DS1302(void)   //时钟芯片初始化
  273. {   
  274.         unsigned char Second=Read1302(DS1302_SECOND);
  275.         if(Second&0x80)              //判断时钟芯片是否关闭         
  276.     {
  277.         Write1302(0x8e,0x00); //写入允许
  278.         Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
  279.         Write1302(0x88,0x07);
  280.         Write1302(0x86,0x25);
  281.         Write1302(0x8a,0x07);
  282.         Write1302(0x84,0x23);
  283.         Write1302(0x82,0x59);
  284.         Write1302(0x80,0x55);
  285.         Write1302(0x8e,0x80); //禁止写入
  286.         }

  287. }








  288. /*延时子程序*/
  289. void mdelay(uint delay)
  290. {        uint i;
  291.          for(;delay>0;delay--)
  292.                    {for(i=0;i<62;i++) //1ms延时.
  293.                        {;}
  294.                    }
  295. }


  296. void outkey()                    //跳出调整模式,返回默认显示
  297. { uchar Second;
  298.   if(out==0)         
  299.   { mdelay(8);
  300.         count=0;
  301.         hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
  302.         Second=Read1302(DS1302_SECOND);
  303.     Write1302(0x8e,0x00); //写入允许
  304.         Write1302(0x80,Second&0x7f);
  305.         Write1302(0x8E,0x80);          //禁止写入
  306.         done=0;           
  307.         while(out==0);

  308.   }
  309. }
  310. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  311. void Upkey()//升序按键
  312. {           
  313.                 Up=1;
  314.                 if(Up==0)
  315.                           {
  316.                                    mdelay(8);
  317.                                        switch(count)
  318.                                           {case 1:
  319.                                   temp=Read1302(DS1302_SECOND);  //读取秒数
  320.                                                                   temp=temp+1;  //秒数加1
  321.                                   up_flag=1;    //数据调整后更新标志
  322.                                                                   if((temp&0x7f)>0x59)   //超过59秒,清零
  323.                                   temp=0;                                                                  
  324.                                                                   break;
  325.                                            case 2:
  326.                                   temp=Read1302(DS1302_MINUTE);  //读取分数
  327.                                                                   temp=temp+1;  //分数加1
  328.                                   up_flag=1;
  329.                                                                   if(temp>0x59)          //超过59分,清零
  330.                                                                   temp=0;
  331.                                                                   break;
  332.                                            case 3:
  333.                                   temp=Read1302(DS1302_HOUR);  //读取小时数
  334.                                                                   temp=temp+1;  //小时数加1
  335.                                   up_flag=1;
  336.                                                                   if(temp>0x23)   //超过23小时,清零
  337.                                                                   temp=0;
  338.                                                                   break;
  339.                                            case 4:
  340.                                   temp=Read1302(DS1302_WEEK);  //读取星期数
  341.                                                                   temp=temp+1;  //星期数加1
  342.                                   up_flag=1;
  343.                                                                   if(temp>0x7)  
  344.                                                                   temp=1;
  345.                                                                   break;
  346.                                            case 5:
  347.                                   temp=Read1302(DS1302_DAY);  //读取日数
  348.                                                                   temp=temp+1;  //日数加1
  349.                                   up_flag=1;
  350.                                                                   if(temp>0x31)
  351.                                                                   temp=1;
  352.                                                                   break;
  353.                                            case 6:
  354.                                   temp=Read1302(DS1302_MONTH);  //读取月数
  355.                                                                   temp=temp+1;  //月数加1
  356.                                   up_flag=1;
  357.                                                                   if(temp>0x12)
  358.                                                                   temp=1;
  359.                                                                   break;
  360.                                            case 7:
  361.                                   temp=Read1302(DS1302_YEAR);  //读取年数
  362.                                                                   temp=temp+1;  //年数加1
  363.                                   up_flag=1;
  364.                                                                   if(temp>0x85)
  365.                                                                   temp=0;
  366.                                                                   break;
  367.                                                default:break;
  368.                                           }
  369.                                           
  370.                                    while(Up==0);
  371.                        
  372.                                   }
  373. }

  374. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  375. void Downkey()//降序按键
  376. {            
  377.                 Down=1;
  378.             if(Down==0)
  379.                           {
  380.                                    mdelay(8);
  381.                                      switch(count)
  382.                                           {case 1:
  383.                                   temp=Read1302(DS1302_SECOND);  //读取秒数
  384.                                                                   temp=temp-1;                                                    //秒数减1
  385.                                   down_flag=1;       //数据调整后更新标志
  386.                                                                   if(temp==0x7f)     //小于0秒,返回59秒
  387.                                                                   temp=0x59;
  388.                                                                   break;
  389.                                            case 2:
  390.                                   temp=Read1302(DS1302_MINUTE);  //读取分数
  391.                                                                   temp=temp-1;  //分数减1
  392.                                   down_flag=1;
  393.                                                                   if(temp==-1)
  394.                                                                   temp=0x59;      //小于0秒,返回59秒
  395.                                                                   break;
  396.                                            case 3:
  397.                                   temp=Read1302(DS1302_HOUR);  //读取小时数
  398.                                                                   temp=temp-1;  //小时数减1
  399.                                   down_flag=1;
  400.                                                                   if(temp==-1)
  401.                                                                   temp=0x23;
  402.                                                                   break;
  403.                                            case 4:
  404.                                   temp=Read1302(DS1302_WEEK);  //读取星期数
  405.                                                                   temp=temp-1;  //星期数减1
  406.                                   down_flag=1;
  407.                                                                   if(temp==0)
  408.                                                                   temp=0x7;;
  409.                                                                   break;
  410.                                            case 5:
  411.                                   temp=Read1302(DS1302_DAY);  //读取日数
  412.                                                                   temp=temp-1;  //日数减1
  413.                                   down_flag=1;
  414.                                                                   if(temp==0)
  415.                                                                   temp=31;
  416.                                                                   break;
  417.                                            case 6:
  418.                                   temp=Read1302(DS1302_MONTH);  //读取月数
  419.                                                                   temp=temp-1;  //月数减1
  420.                                   down_flag=1;
  421.                                                                   if(temp==0)
  422.                                                                   temp=12;
  423.                                                                   break;
  424.                                            case 7:
  425.                                   temp=Read1302(DS1302_YEAR);  //读取年数
  426.                                                                   temp=temp-1;  //年数减1
  427.                                   down_flag=1;
  428.                                                                   if(temp==-1)
  429.                                                                   temp=0x85;
  430.                                                                   break;
  431.                                               default:break;
  432.                                          }
  433.                                          
  434.                                    while(Down==0);
  435.                                 
  436.                                   }
  437. }

  438. void Setkey()//模式选择按键
  439. {
  440.                 Set=1;
  441.                 if(Set==0)
  442.             {
  443.            mdelay(8);
  444.            count=count+1;         //Setkey按一次,count就加1
  445.                    done=1;                         //进入调整模式
  446.            while(Set==0);
  447.         
  448.                  }

  449. }

  450. void keydone()//按键功能执行
  451. {        uchar Second;
  452.                  if(flag==0)    //关闭时钟,停止计时
  453.          { Write1302(0x8e,0x00); //写入允许
  454.            temp=Read1302(0x80);
  455.            Write1302(0x80,temp|0x80);
  456.                Write1302(0x8e,0x80); //禁止写入
  457.            flag=1;
  458.          }
  459.          Setkey();                                            //扫描模式切换按键
  460.                  switch(count)
  461.                  {case 1:do                                                //count=1,调整秒
  462.                           {
  463.                    outkey();                           //扫描跳出按钮
  464.                                    Upkey();                //扫描加按钮
  465.                                    Downkey();              //扫描减按钮
  466.                                    if(up_flag==1||down_flag==1)  //数据更新,重新写入新的数据
  467.                                    {
  468.                                    Write1302(0x8e,0x00); //写入允许
  469.                                    Write1302(0x80,temp|0x80); //写入新的秒数
  470.                                    Write1302(0x8e,0x80); //禁止写入
  471.                                    up_flag=0;
  472.                                    down_flag=0;
  473.                                    }

  474.                                    hide_sec++;          //位闪计数
  475.                                    if(hide_sec>3)
  476.                                      hide_sec=0;
  477.                    show_time();         //液晶显示数据
  478.                                   }while(count==2);break;  
  479.                   case 2:do                                                //count=2,调整分
  480.                           {
  481.                                    hide_sec=0;
  482.                                    outkey();
  483.                                    Upkey();
  484.                                    Downkey();
  485.                                    if(temp>0x60)
  486.                                      temp=0;
  487.                                    if(up_flag==1||down_flag==1)
  488.                                    {
  489.                                    Write1302(0x8e,0x00); //写入允许
  490.                                    Write1302(0x82,temp); //写入新的分数
  491.                                    Write1302(0x8e,0x80); //禁止写入
  492.                                    up_flag=0;
  493.                                    down_flag=0;
  494.                                    }
  495.                                    hide_min++;
  496.                                    if(hide_min>3)
  497.                                      hide_min=0;
  498.                    show_time();
  499.                                   }while(count==3);break;
  500.                   case 3:do                                                //count=3,调整小时
  501.                           {
  502.                    hide_min=0;
  503.                                    outkey();
  504.                                    Upkey();
  505.                                    Downkey();
  506.                                    if(up_flag==1||down_flag==1)
  507.                                    {
  508.                                    Write1302(0x8e,0x00); //写入允许
  509.                                    Write1302(0x84,temp); //写入新的小时数
  510.                                    Write1302(0x8e,0x80); //禁止写入
  511.                                    up_flag=0;
  512.                                    down_flag=0;
  513.                                    }
  514.                                    hide_hour++;
  515.                                    if(hide_hour>3)
  516.                                      hide_hour=0;
  517.                    show_time();
  518.                                   }while(count==4);break;
  519.                   case 4:do                                                //count=4,调整星期
  520.                           {
  521.                    hide_hour=0;
  522.                                    outkey();
  523.                                    Upkey();
  524.                                    Downkey();
  525.                                    if(up_flag==1||down_flag==1)
  526.                                    {
  527.                                    Write1302(0x8e,0x00); //写入允许
  528.                                    Write1302(0x8a,temp); //写入新的星期数
  529.                                    Write1302(0x8e,0x80); //禁止写入
  530.                                    up_flag=0;
  531.                                    down_flag=0;
  532.                                    }
  533.                                    hide_week++;
  534.                                    if(hide_week>3)
  535.                                      hide_week=0;
  536.                    show_time();
  537.                                   }while(count==5);break;
  538.                   case 5:do                                                //count=5,调整日
  539.                           {
  540.                                    hide_week=0;
  541.                                    outkey();
  542.                                    Upkey();
  543.                                    Downkey();
  544.                                    if(up_flag==1||down_flag==1)
  545.                                    {
  546.                                    Write1302(0x8e,0x00); //写入允许
  547.                                    Write1302(0x86,temp); //写入新的日数
  548.                                    Write1302(0x8e,0x80); //禁止写入
  549.                                    up_flag=0;
  550.                                    down_flag=0;
  551.                                    }
  552.                                    hide_day++;
  553.                                    if(hide_day>3)
  554.                                      hide_day=0;
  555.                    show_time();
  556.                                   }while(count==6);break;
  557.                   case 6:do                                                //count=6,调整月
  558.                           {
  559.                    hide_day=0;
  560.                                    outkey();
  561.                                    Upkey();
  562.                                    Downkey();
  563.                                    if(up_flag==1||down_flag==1)
  564.                                    {
  565.                                    Write1302(0x8e,0x00); //写入允许
  566.                                    Write1302(0x88,temp); //写入新的月数
  567.                                    Write1302(0x8e,0x80); //禁止写入
  568.                                    up_flag=0;
  569.                                    down_flag=0;
  570.                                    }
  571.                                    hide_month++;
  572.                                    if(hide_month>3)
  573.                                      hide_month=0;
  574.                    show_time();
  575.                                   }while(count==7);break;
  576.                   case 7:do                                                //count=7,调整年
  577.                           {
  578.                    hide_month=0;
  579.                                    outkey();
  580.                                    Upkey();
  581.                                    Downkey();
  582.                                    if(up_flag==1||down_flag==1)
  583.                                    {
  584.                                    Write1302(0x8e,0x00); //写入允许
  585.                                    Write1302(0x8c,temp); //写入新的年数
  586.                                    Write1302(0x8e,0x80); //禁止写入
  587.                                    up_flag=0;
  588.                                    down_flag=0;
  589.                                    }
  590.                                    hide_year++;
  591.                                    if(hide_year>3)
  592.                                      hide_year=0;
  593.                    show_time();
  594.                                   }while(count==8);break;
  595.                   case 8: count=0;hide_year=0;  //count8, 跳出调整模式,返回默认显示状态
  596.                       Second=Read1302(DS1302_SECOND);
  597.                   Write1302(0x8e,0x00); //写入允许
  598.                       Write1302(0x80,Second&0x7f);
  599.                       Write1302(0x8E,0x80);          //禁止写入
  600.                                   done=0;
  601.                   break; //count=7,开启中断,标志位置0并退出
  602.                   default:break;

  603.                  }

  604. }


  605. void show_time()   //液晶显示程序
  606. {
  607.   DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
  608.   TimeToStr(&CurrentTime);       //时间数据转换液晶字符
  609. ……………………

  610. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
000.zip (69.46 KB, 下载次数: 98)



作者: 吴海晨o    时间: 2019-4-24 22:13
这个程序和标题扯了哈




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1