找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6177|回复: 14
收起左侧

DS3231_3264双色点阵万年历三种显示

  [复制链接]
ID:115294 发表于 2016-4-19 19:51 | 显示全部楼层 |阅读模式
DS3231_3264双色点阵万年历三种显示

DS3231万年历3264电路图.jpg

程序预览:
  1. #include <STC12C5A60S2.H>
  2. #include <intrins.h>
  3. #define                ulong        unsigned long
  4. #define                uint        unsigned int
  5. #define                uchar        unsigned char
  6. #define NOP4 _nop_();_nop_();_nop_();_nop_()
  7. #define CHAR 0xab

  8. #define ES_ON AUXR |= 0x10; ES=1
  9. #define ES_OFF AUXR &= 0xEF; ES=0

  10. #include "zimo2.h"
  11. #include "DS3231 + AT24C32.h"        // 导入DS3231 + AT24C32驱动程序

  12. sbit KEYS=P2^0;            //调整键,按一次设置状态位加1,轮流切换到设置年,月,日,时,分,秒,星期,正常状态.
  13. sbit KEYA=P2^1;            //加一键,在设置状态时按一次相应设置位加1
  14. sbit KEYD=P2^2;            //减一键,在设置状态时按一次相应设置位减1
  15. sbit KEYM=P2^3;            //显示模式键,在设置三行或二行显示
  16. uchar MODE=0;               //显示模式指示,0为二行显示,1为三行显示

  17. #include <set.h> //键控设时间头文件

  18. //原程序中的联接

  19. sbit G1=P0^4;
  20. sbit G2=P0^5;
  21. sbit R1=P2^6;
  22. sbit R2=P2^7;
  23. sbit LS=P0^6;   
  24. sbit CK=P0^7;  
  25. sbit OE=P2^5;

  26. #define  ABCD P0                   //ABCD接到P2.0-P2.3

  27. bit  SHAN;               //闪烁标志位,
  28. uchar TC=0,TC1=0;                //延时计数用
  29. uchar con=1;                       //秒计数器,用于1.5秒轮显公农历日期,分时显示公农历
  30. uchar CKTIME_1=0;                   //时间快慢调整标志


  31. sbit GPS_POW=P1^7;                                  //gps电源控制

  32. uchar data row;                                        //行扫描变量
  33. uchar data RD1[8];                                //数据缓存
  34. uchar data GD1[8];
  35. uchar data RD2[8];
  36. uchar data GD2[8];

  37. uchar  miao1,miao2;           //秒数据,1十位,2个位
  38. uchar fen1,fen2        ;           //分数据
  39. uchar shi1,shi2        ;           //小时数据
  40. uchar ri1,ri2        ;           //日数据
  41. uchar yue1,yue2;           //月数据
  42. uchar nian1,nian2;           //年数据
  43. uchar week;                 //星期
  44. uchar Dtemp;         //温度

  45. uchar idata NL_yue;                //农历月 1~12
  46. uchar idata NL_ri;                //农历日 1~30
  47. uchar y1,y2,r1,r2;                //农历显示数据
  48. #include "nongli.h"

  49. uchar SJ[6],RQ[6];

  50. bit RX_over;   //GPS数据接收结束标志位
  51. bit DW_OK;           //GPS定位成功标志位

  52. uint ADC_L;                  //ADC亮度数据
  53. uint ADC_T;                  //ADC温度数据
  54. bit ADCL;                  //亮度ADC标志
  55. bit ADCT;                  //温度ADC标志
  56. uchar t1,t2;          //温度显示数据

  57. void Delay (uchar t)
  58. { uchar i,j;
  59.    for (i=0;i<t;i++)
  60.     {
  61.          for(j=0;j<10;j++)
  62.            {  _nop_();
  63.         _nop_();
  64.                 }
  65.          }
  66. }

  67. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  68. /**************************************
  69. 初始化DS3231并设初始时间
  70. **************************************/
  71. void Time_Initial()
  72. {          Delay (200);
  73.         if(read_random(DS3231_AL2MIN) != 1)   //用DS3231的闹铃2位检测失电状态,如标志不是原来的,测初始时钟
  74.     {
  75.                 ModifyTime(DS3231_AL2MIN,1);                //写入初始化标志化闹铃2位为1,并初始化时间日期。
  76.                 ModifyTime(DS3231_SECOND,0);           //秒
  77.                 ModifyTime(DS3231_MINUTE,43);           //分
  78.                 ModifyTime(DS3231_HOUR,10);           //时
  79.                 ModifyTime(DS3231_DAY,4);           //日
  80.                 ModifyTime(DS3231_MONTH,4);           //月
  81.                 ModifyTime(DS3231_YEAR,16);           //年

  82.     }

  83. }


  84. /*******读取当前时间*********/
  85. void GetAllTime()
  86. {
  87.         uchar temp;

  88.         temp=read_random(DS3231_SECOND);           //秒
  89.         miao1=temp/10;
  90.         miao2=temp%10;

  91.         temp=read_random(DS3231_MINUTE);           //分
  92.         fen1=temp/10;
  93.         fen2=temp%10;

  94.         temp=read_random(DS3231_HOUR);           //时
  95.         shi1=temp/10;
  96.         shi2=temp%10;

  97.         temp=read_random(DS3231_DAY);           //日
  98.         ri1=temp/10;
  99.         ri2=temp%10;

  100.         temp=read_random(DS3231_MONTH);           //月
  101.         yue1=temp/10;
  102.         yue2=temp%10;

  103.         temp=read_random(DS3231_YEAR);           //年
  104.         nian1=temp/10;
  105.         nian2=temp%10;
  106.        
  107.         Dtemp = read_random(DS3231_TEMP_H);

  108.         TH3231=        read_temp();
  109. }


  110. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  111. void Uart() interrupt 4 using 1
  112. {   
  113.         uchar data Rx_temp ;
  114.         static uchar fg_count=0;        //数据间隔,计数
  115.         static uchar Rx_count=0;
  116.         static uchar n=0;                     //握手信号计数
  117.         static uchar da_count=0;         //数据计数
  118. //        static bit RX_start;    //GPS数据接收开始标志位
  119.         uchar idata GPRMC[6]={0x24,0x47,0x50,0x52,0x4D,0x43};    //GPS选择接收字符$GPRMC,

  120.            if(RI)                                          
  121.      {
  122.                    RI=0;
  123.                     Rx_temp=SBUF;

  124. /******* 监控握手信号进行软件复位自动下载 ******/
  125.               if(Rx_temp==0x7f)  
  126.               {                                                   //STC下载指令是0x7f
  127.                    n++;                                 
  128.                    if(n>20)                      //如果连续收到20次0x7f
  129.                    {
  130.                                IAP_CONTR=0x60;  //复位至ISP区  
  131.                                         n=0;   
  132.                    }
  133.               }
  134.                   else
  135.                           n=0;

  136. /********* GPS数据处理 **************/
  137.                   if(Rx_count<6)
  138.                   {
  139.                             if(Rx_temp==GPRMC[Rx_count])    //比较开始$GPRMC字符,     
  140.                                Rx_count++;
  141.                      else   
  142.                                  Rx_count=0;        
  143.                    }
  144.                 else  //找到GPRMC开始保存数据
  145.                 {
  146.                          if(Rx_temp==',')                                //如果收到逗号,
  147.                         {
  148.                                 fg_count++;                                        //计数增加
  149.                                 da_count=0;
  150.                         }
  151.                         else
  152.                         {
  153.                                  if(fg_count==1)                                //保存时间数据
  154.                                 {
  155.                                         if(da_count<6)                   //只保存前6位时间数据
  156.                                                 SJ[da_count++]=Rx_temp;
  157.                                 }
  158.                                 else
  159.                                         if(fg_count==2)                        //保存定位信息
  160.                                         {       
  161.                                                 if(Rx_temp=='A')        //如果收到A
  162.                                                         DW_OK=1;                //则定位成功
  163.                                                 else
  164.                                                         DW_OK=0;
  165.                                         }
  166.                                         else
  167.                                                 if(fg_count==9)                                  //保存日期数据
  168.                                                         RQ[da_count++]=Rx_temp;
  169.                                                 else
  170.                                                         if(fg_count>10)                         //接收完毕
  171.                                                         {
  172.                                                                  RX_over=1;
  173. //                                                                RX_start=0;
  174.                                                                 fg_count=0;
  175.                                                                 da_count=0;
  176.                                                                 Rx_count=0;
  177.                                                         }       
  178.                         }       
  179.                 }       
  180.         }

  181. }

  182. void GPSdata()
  183. {

  184.         static uchar idata hour[2],min[2],sec[2],year[2],mon[2],day[2];        //临时时间数据 ,为了预防数据传输的误码,使用了2次数据比较
  185.         static uchar a,max;

  186.         RX_over=0;
  187.                                                                                                    //保存临时时间数据
  188.         hour[a]=(SJ[0]-0x30)*10        + (SJ[1]-0x30);                 //时
  189.         min [a]=(SJ[2]-0x30)*10        + (SJ[3]-0x30);                 //分
  190.         sec [a]=(SJ[4]-0x30)*10        + (SJ[5]-0x30);                 //秒
  191.         day [a]=(RQ[0]-0x30)*10 + (RQ[1]-0x30);                 //日
  192.         mon [a]=(RQ[2]-0x30)*10 + (RQ[3]-0x30);                 //月
  193.         year[a]=(RQ[4]-0x30)*10 + (RQ[5]-0x30);                 //年
  194.         a++;
  195.         for(max=0;max<6;max++)
  196.         {
  197.                  SJ[max]=0;
  198.                 RQ[max]=0;
  199.         }
  200.         if(a>1)
  201.         {
  202.                 a=0;
  203.                 //如果第二次秒比上次小1,并且分,时,日,月年相同
  204.                 if(sec[1]-sec[0]==1&&min[1]==min[0]&&hour[1]==hour[0]&&day[1]==day[0]&&mon[1]==mon[0]&&year[1]==year[0])
  205.                 {
  206.                         sec[1]+=1;                  //GPS时间是包含毫秒的,加上1秒补偿传输和程序处理的延时
  207.                         if(sec[1]>59)
  208.                         {
  209.                                  sec[1]=0;
  210.                                 min[1]+=1;
  211.                                 if(min[1]>59)
  212.                                 {
  213.                                  min[1]=0;
  214.                                  hour[1]+=1;
  215.                                 }
  216.                         }
  217.                         hour[1]+=8;                        //转换为北京时间 ,东8区要+8
  218.                         if(hour[1]>23)                //如果超过23则到了第二天
  219.                         {   
  220.                                 hour[1]-=24;        //
  221.                                 day[1]+=1;                //日+1

  222.                                 switch(mon[1])                //获取每月最大天数
  223.                                 {
  224.                                          case 2:                         //2月
  225.                                                 if(year[1]%4==0)  //判断是否闰月,只取2000-2099年,因此简单的%4运算
  226.                                                         max=29;                  //闰月29天
  227.                                                 else
  228.                                                         max=28;                  //正常28天
  229.                                                 break;
  230.                                         case 4:                case 6:         
  231.                                         case 9:                case 11:     //4,6,9,11月
  232.                                                 max=30;                                 //30天
  233.                                                 break;
  234.                                         default:
  235.                                                 max=31;                  //其他月份1,3,5,7,8,10,12月31天
  236.                                         break;               
  237.                                 }
  238.                                 if(day[1]>max)
  239.                                 {
  240.                                         mon[1]+=1;
  241.                                         day[1]=0;
  242.                                         if(mon[1]>12)
  243.                                         {
  244.                                                  year[1]+=1;
  245.                                                 mon[1]=0;
  246.                                         }
  247.                                 }
  248.                         }
  249.                         //                 写入时间数据到DS3231
  250.                         ModifyTime(DS3231_SECOND, sec[1]/10*16 + sec[1]%10 );          //秒
  251.                         ModifyTime(DS3231_MINUTE, min[1]/10*16 + min[1]%10 );          //分
  252.                         ModifyTime(DS3231_HOUR, hour[1]/10*16 + hour[1]%10 ); //时
  253.                         ModifyTime(DS3231_DAY, day[1]/10*16 + day[1]%10 );         //日
  254.                         ModifyTime(DS3231_MONTH, mon[1]/10*16 + mon[1]%10 );         //月
  255.                         ModifyTime(DS3231_YEAR, year[1]/10*16 + year[1]%10 ); //年
  256.                        
  257.                         GPS_POW=1;                         //关闭GPS电源
  258.                         GetAllTime();                 //读取全部时间
  259.                         GetNL_ri();                         //农历转换
  260.                 }
  261.         }
  262. }

  263. void loaddata1()
  264. {        /**************装载上半屏一线点阵时间数据****************/
  265.            {
  266.          RD1[0]=tab[shi1][row];//~
  267.         if(SHAN&set_S==4) GD1[1]=tab[shi2][row]; else RD1[1]=tab[shi2][row];//调时状态时字闪.
  268.         if(SHAN) RD1[2]=tab[10][row];else RD1[2]=tab[15][row];//~
  269.         RD1[3]=tab[fen1][row];//~
  270.         if(SHAN&set_S==5) GD1[4]=tab[fen2][row]; else RD1[4]=tab[fen2][row];//调时状态分字闪.
  271.         if(SHAN) RD1[5]=tab[10][row]; else RD1[5]=tab[15][row];//~
  272.         RD1[6]=tab[miao1][row];//~
  273.         if(SHAN&set_S==6) GD1[7]=tab[miao2][row]; else RD1[7]=tab[miao2][row];//调秒状态秒字闪.
  274.            }
  275.    /**************装载下半屏一线点阵数据公历****************/
  276.      if(con==1)   
  277.         {
  278.        
  279.         GD2[0]=tab[nian1][row];//~
  280.         if(SHAN&set_S==1) RD2[1]=tab[nian2][row]; else GD2[1]=tab[nian2][row];//调年状态时年闪
  281.         GD2[2]=tab[13][row];//~
  282.         GD2[3]=tab[yue1][row];//~
  283.         if(SHAN&set_S==2) RD2[4]=tab[yue2][row]; else GD2[4]=tab[yue2][row];//调月状态时月闪
  284.         GD2[5]=tab[14][row];//~
  285.         GD2[6]=tab[ri1][row];//~
  286.         if(SHAN&set_S==3)  RD2[7]=tab[ri2][row]; else GD2[7]=tab[ri2][row];//调日状态时日闪
  287.       
  288.         }
  289. /**************装载下半屏一线点阵数据农历****************/                                          
  290.         if(con==2)      
  291.         {
  292.         if(NL_yue==1)                                           //如农历为1月,显”正“月  
  293.              {
  294.         GD2[0]=NLmonth_tab[14][row*2];//~
  295.         GD2[1]=NLmonth_tab[14][row*2+1];
  296.                   }
  297.                   else                                             //其它月份显示正常
  298.                   {
  299.                   GD2[0]=NLmonth_tab[NL_yue][row*2];//~
  300.         GD2[1]=NLmonth_tab[NL_yue][row*2+1];
  301.         }
  302.                   GD2[2]=NLmonth_tab[13][row*2];
  303.         GD2[3]=NLmonth_tab[13][row*2+1];              //显"月"
  304.       
  305.                   if(NL_ri==10) {                                     //如农历日为10,显示"初十",不显"十十"
  306.                   GD2[4]=NLday_S[0][row*2];
  307.         GD2[5]=NLday_S[0][row*2+1];
  308.                   GD2[6]=NLday_S[1][row*2];
  309.         GD2[7]=NLday_S[1][row*2+1];
  310.                                   }  else  if(NL_ri==20) {           //如农历日为20,显示为"二十",不显"廿十"
  311.                   GD2[4]=NLmonth_tab[2][row*2];
  312.         GD2[5]=NLmonth_tab[2][row*2+1];
  313.                   GD2[6]=NLday_S[1][row*2];
  314.         GD2[7]=NLday_S[1][row*2+1];
  315.                                   } else
  316.                                                                 {
  317.        
  318.       GD2[4]=NLday_S[r1][row*2];              //其它日期显示: "初一,十一,廿一"等农历习惯.
  319.         GD2[5]=NLday_S[r1][row*2+1];
  320.         GD2[6]=NLmonth_tab[r2][row*2];
  321.         GD2[7]=NLmonth_tab[r2][row*2+1];
  322.                          }
  323.         }
  324. /**************装载下半屏一线点阵星期数据****************/
  325.           if(con==3)   
  326.   
  327.         {        //没有温度控头,显“星期X”用这段,
  328.          /*   GD2[0]=tab[15][row];   //显空格
  329.         GD2[1]=WEEK_S[8][row*2];//~
  330.         GD2[2]=WEEK_S[8][row*2+1];//~
  331.         GD2[3]=WEEK_S[9][row*2];//~
  332.         GD2[4]=WEEK_S[9][row*2+1];//~
  333.         if(SHAN&set_S==7) GD2[5]=tab[15][row]; else GD2[5]=WEEK_S[now[5]][row*2];//调周状态周字闪.
  334.         if(SHAN&set_S==7) GD2[6]=tab[15][row]; else GD2[6]=WEEK_S[now[5]][row*2+1];//调周状态周字闪.
  335.         GD2[15]=tab[15][row];//~          
  336.                   */
  337.                  //----有温度探头,显“周三,18.6C”用这一段。
  338.         GD2[0]=WEEK_S[10][row*2];//~
  339.         GD2[1]=WEEK_S[10][row*2+1];//~
  340.         if(SHAN&set_S==7) GD2[2]=tab[15][row]; else GD2[2]=WEEK_S[week+1][row*2];//调周状态周字闪.
  341.         if(SHAN&set_S==7) GD2[3]=tab[15][row]; else GD2[3]=WEEK_S[week+1][row*2+1];//调周状态周字闪.
  342.         GD2[4]=tab[15][row];//~显示空格
  343.         if(t1==0)  GD2[5]=tab[15][row]; else GD2[5]=temp10[t1][row];//显示温度十位
  344.         GD2[6]=temp10[t2][row];//~显示温度个位
  345.         GD2[7]=tab[16][row];//~显示℃符号                                                                          
  346.          
  347.       
  348.         }


  349. }

  350. void loaddata()
  351. {
  352.         uchar data row1,row2;

  353.         row1=row+8;                //        上1/2屏行扫描
  354.         row2=row-8;                //        下1/2屏行扫描

  355.         if(row<8)
  356.         {
  357.                 GD1[0]=(Num5[2][row]<<3)|(Num5[0][row]>>3);
  358.                 GD1[1]=(Num5[0][row]<<5)|(Num5[nian1][row]>>1);
  359.                 if(SHAN&set_S==1) RD1[2]=(Num5[nian1][row]<<7)|(Num5[nian2][row]<<1);  else  GD1[2]=(Num5[nian1][row]<<7)|(Num5[nian2][row]<<1) ;
  360.                 GD1[3]=Num5[yue1][row];
  361.                 if(SHAN&set_S==2) RD1[4]=Num5[yue2][row]<<2;  else GD1[4]=Num5[yue2][row]<<2;
  362.                 GD1[5]=Num5[ri1][row]<<1;
  363.                 if(SHAN&set_S==3) RD1[6]=Num5[ri2][row]<<3; else GD1[6]=Num5[ri2][row]<<3;
  364.                 GD1[7]=RD1[7]=Num8[week][row];
  365.                 if(row==3)                //日期点
  366.                 {
  367.                         GD1[3]|=0xC0;
  368.                         GD1[4]|=0x01;
  369.                         GD1[5]|=0x80;
  370.                 }

  371.                 {
  372.                            RD2[0]=Num14[shi1][row1];
  373.                         RD2[1]=Num14[shi2][row1]>>2;
  374.                         RD2[2]=Num14[shi2][row1]<<6;
  375.                         if(SHAN&set_S==4)  { GD2[1]=Num14[shi2][row1]>>2; GD2[2]=Num14[shi2][row1]<<6; }
  376.                         RD2[3]=Num14[fen1][row1];
  377.                         RD2[4]=Num14[fen2][row1]>>2;
  378.                         RD2[5]=Num14[fen2][row1]<<6 ;
  379.                         if(SHAN&set_S==5){          GD2[4]=Num14[fen2][row1]>>2; GD2[5]=Num14[fen2][row1]<<6 ; }
  380.                         RD2[6]=Num12[miao1][row1]<<1;
  381.                         RD2[7]=Num12[miao2][row1];
  382.                         if(SHAN&set_S==6) GD2[7]=Num12[miao2][row1];
  383.                         if(row==3|row==4)
  384.                         {
  385.                                 if( SHAN)
  386.                                 {
  387.                                         RD2[2]|=0x0c;
  388.                                         RD2[5]|=0x0c;
  389.                                 }
  390.                                 else
  391.                                 {
  392.                                         RD2[2]|=0x00;
  393.                                         RD2[5]|=0x00;
  394.                                 }
  395.                         }
  396.                 }
  397.         }
  398.         else
  399.         {
  400.                 {
  401.                            RD1[0]=Num14[shi1][row2];
  402.                         RD1[1]=Num14[shi2][row2]>>2;
  403.                         RD1[2]=Num14[shi2][row2]<<6;
  404.                         if(SHAN&set_S==4) {                         GD1[1]=Num14[shi2][row2]>>2; GD1[2]=Num14[shi2][row2]<<6;}
  405.                         RD1[3]=Num14[fen1][row2];
  406.                         RD1[4]=Num14[fen2][row2]>>2;
  407.                         RD1[5]=Num14[fen2][row2]<<6 ;
  408.                         if(SHAN&set_S==5){                        GD1[4]=Num14[fen2][row2]>>2;GD1[5]=Num14[fen2][row2]<<6 ; }
  409.                         RD1[6]=Num12[miao1][row2]<<1;
  410.                         RD1[7]=Num12[miao2][row2];
  411.                         if(SHAN&set_S==6) GD1[7]=Num12[miao2][row2];
  412.                         if(row==12|row==13)
  413.                         {
  414.                                 if( SHAN)
  415.                                 {
  416.                                         RD1[2]|=0x0c;
  417.                                         RD1[5]|=0x0c;
  418.                                 }
  419.                                 else
  420.                                 {
  421.                                         RD1[2]|=0x00;
  422.                                         RD1[5]|=0x00;
  423.                                 }
  424.                         }
  425.                 }

  426.                 GD2[0]=Num8[y1][row2];
  427.                 GD2[1]=Num8[y2][row2];
  428.                 GD2[2]=Num8[11][row2];
  429.                 GD2[3]=NL  [r1][row2];
  430.                 GD2[4]=Num8[r2][row2]>>1;

  431.                 GD2[5]=Num8[r2][row2]<<7  | Num5[t1][row2-1]>>2;
  432.                 RD2[5]=Num5[t1][row2-1]>>2;
  433.                 GD2[6]=RD2[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;               
  434.                 GD2[7]=RD2[7]=Num5[17][row2];

  435.         }
  436. }

  437. void loaddata2()         //另一种三行显示方式
  438. {
  439.         uchar data row1,row2;

  440.         row1=row+8;                //        上1/2屏行扫描
  441.         row2=row-8;                //        下1/2屏行扫描
  442.          RD1[0]=Num14[shi1][row];
  443.         if(shi1==0)           RD1[0]=tab[15][row];;   //使用这一行将在时十位为0时消隐,注释不使用显示0X
  444.          RD1[1]=Num14[shi2][row];
  445.                  if(SHAN&set_S==4)          RD1[1]=tab[15][row];  //调时状态时闪
  446.          if(SHAN) RD1[2]=tab[10][row]; else RD1[2]=tab[15][row];
  447.      RD1[3]=Num14[fen1][row];
  448.          RD1[4]=Num14[fen2][row];
  449.                           if(SHAN&set_S==5)          RD1[4]=tab[15][row];  //调时状态时闪
  450.          GD2[6]=RD2[6]=tab[ri1][row];
  451.          GD2[7]=RD2[7]=tab[ri2][row];
  452.                  if(SHAN&set_S==3)  GD2[7]=RD2[7]=tab[15][row];
  453.         if(row<8)
  454.            {
  455.              if((shi1*10+shi2)>11) RD1[6]=ampm[1][row];else   RD1[6]=ampm[0][row];          //显示:上 下
  456.                  RD1[7]=ampm[2][row];                                                                                                  //显示:午

  457.                 GD2[0]=RD2[0]=Num5[t1][row];
  458.                 GD2[1]=RD2[1]=Num5[t2][row]<<2|Num5[17][row]>>6;                
  459.                 GD2[2]=RD2[2]=Num5[17][row]<<2;
  460.                 if(yue1>0) GD2[3]=Num5[yue1][row]>>2;
  461.                 GD2[4]=Num5[yue2][row];
  462.                         if(SHAN&set_S==2) GD2[4]=Num5[19][row] ;  //调月时月闪
  463.                 GD2[5]=Num8[11][row];                                                //显示“月”
  464.                 }
  465.                 else
  466.                 {
  467.                         RD1[5]=GD1[5]=Num5[miao1][row-8];
  468.                         RD1[6]=GD1[6]=Num5[miao2][row-8]<<2;
  469.                                                 if(SHAN&set_S==6) RD1[6]=GD1[6]=Num5[19][row-8] ;  //调秒时秒闪
  470.                     GD1[7]=Num8[week][row-8];

  471.                 GD2[0]=Num8[y1][row-8];
  472.                 GD2[1]=Num8[y2][row-8];
  473.                 GD2[2]=Num8[11][row-8];
  474.                 GD2[3]=NL  [r1][row-8];
  475.                 GD2[4]=Num8[r2][row-8]>>1;         //调整下农历日分隔,显得好看
  476.                 GD2[5]=Num8[r2][row-8]<<7;

  477.                 }

  478. }


  479. void xianshi()
  480. {
  481.         uchar i,j;         

  482.         for(row=0;row<16;row++)                           //扫描16行
  483.         {   
  484.                 if(MODE==1)  loaddata1(); else if(MODE==2) loaddata2() ; else loaddata();        //根据MODE键值选择显示方式
  485.                 for(i=0;i<8;i++)                                         //扫描1行
  486.                 {                                                               
  487.                          for(j=0;j<8;j++)                         //发送1个数据
  488.                         {                                        
  489.                                 R1=!(RD1[i]&0x80);                //发送最高位,如是逆向取模则发送最低位 &0x01
  490.                                 R2=!(RD2[i]&0x80);                //由于数据是低电平有效,所以进行取反
  491.                                 G1=!(GD1[i]&0x80);
  492.                                 G2=!(GD2[i]&0x80);
  493.                                 CK=0;                                        //时钟下降
  494.                                 RD1[i]<<=1;                                //数据左移1          如是逆向取模则改为右移>>
  495.                                 RD2[i]<<=1;                                //
  496.                                 GD1[i]<<=1;
  497.                                 GD2[i]<<=1;
  498.                                 CK=1;                                   //时钟上升
  499.                         }
  500.                 }
  501.                 ABCD=row;                        //行选
  502.                  LS=0;
  503.                 NOP4;               
  504.                 LS=1;                                //锁存上升,显示输出
  505.                 OE=0;
  506.                 TH0=255-ADC_L;        //
  507.                 TR0=1;
  508.         }
  509. }

  510. void UartInit(void)                //9600bps@24.576MHz
  511. {
  512.         PCON &= 0x7F;                //波特率不倍速
  513.         SCON = 0x50;                //8位数据,可变波特率
  514.         AUXR |= 0x04;                //独立波特率发生器时钟为Fosc,即1T
  515.         BRT = 0xB0;                //设定独立波特率发生器重装值
  516.         AUXR |= 0x01;                //串口1选择独立波特率发生器为波特率发生器
  517.         AUXR |= 0x10;                //启动独立波特率发生器

  518. }

  519. void TIM0() interrupt 1
  520. {
  521.         OE=1;
  522.         TR0=0;
  523. }

  524. void ADC() interrupt 5         using 2
  525. {       
  526. //        uchar t;
  527.         uint ADC_temp;
  528.         static uchar m;
  529.         static uint TO;
  530.         static uint max,min;


  531.         ADC_CONTR&=0xEF;          //清除ADC中断标志位

  532.         ADC_temp=ADC_RES<<2 | ADC_RESL        ;
  533.        
  534.         if(m==0)
  535.                 min=max=ADC_temp;
  536.         if(ADC_temp>max)
  537.                 max=ADC_temp;
  538.         if(ADC_temp<min)
  539.                 min=ADC_temp;
  540.         TO+=ADC_temp;
  541.         m++;               
  542.         if(m<10)
  543.                 ADC_CONTR |= 0x08;           //启动下次AD转换
  544.         else
  545.         {
  546.                 ADC_temp=(TO-min-max+4)>>3;        //
  547.                 TO=0;
  548.                 m=0;
  549.                        
  550.                 if(ADCL)
  551.                         {
  552.                                 ADC_L=ADC_temp/16;
  553.                                 if(ADC_L>7)//限制最高亮度或者时间夜晚无人时自动降低亮度
  554.                                         {
  555.                                                 if((shi1*10+shi2)>7&(shi1*10+shi2)<23)
  556.                                                         {
  557.                                                                 ADC_L=7;                               
  558.                                                                 ADCL=0;       
  559.                                                         }
  560.                                                 else
  561.                                                         {
  562.                                                                 ADC_L=1;
  563.                                                                 ADCL=0;       
  564.                                                         }
  565.                                         }
  566.                         }
  567.        
  568.                 if(ADCT)
  569.                 {
  570. /*
  571.                         ADC_T=(ADC_temp>>2);
  572.                         if(ADC_T>39 & ADC_T<190)
  573.                         {
  574. //                                t=temp[ADC_T-40];
  575.                                 //////////////////////////////////////////
  576.                                 t1=temp[ADC_T-40]/10;
  577.                                 t2=temp[ADC_T-40]%10;
  578.                                
  579.                                 //////////////////////////////////////////
  580.                                 if(t1==0)         //首位0消隐
  581.                                         t1=19;
  582.                                 if(ADC_T<60)  //低于0显示-
  583.                                         t1=18;
  584.                         }
  585.                         else
  586.                                 t1=t2=18;
  587.                         ADCT=0;
  588. */                       
  589.                                 t1=Dtemp/10;
  590.                                 t2=Dtemp%10;
  591.                 }
  592.         }

  593.        

  594. }

  595. void main()
  596. {
  597.         static uchar count,a;
  598.         WDT_CONTR=0x36;                  //启动看门狗,64分频,约1s多
  599.         P0M1=0x00;
  600.         P0M0=0xff;          //以下为接LED点阵屏设为强推,适应有下拉或上拉电阻输入的屏
  601.         P2M1=0x00;
  602.         P2M0=0xe0;
  603.   P4M1=0x00;
  604.         P4M0=0xff;          


  605.         P1M1=0x18;                          //P13,P14高阻模式        ,0001100
  606.         P1ASF=0x18;                          //P13,P14做ADC输入       
  607.         UartInit();                         //串口初始化
  608.         TMOD=0x11;                         //16bit
  609.         AUXR |= 0x80;                //         1T
  610.         EA=1;          ES=1;        ET0=1;
  611.         EADC=1;                                  //开启ADC中断


  612.         Time_Initial();   //根据DS1302状态是否进行初始化       
  613.         GetAllTime();                //读取全部时间
  614.         GetNL_ri();                        //农历运算
  615.         GPS_POW=0;

  616.         while(1)
  617.         {
  618.    //以下代码是作为秒点延时之用,

  619.                    TC++;
  620.              if(TC==35)         //        具体数据根据时钟频率调整,0.5秒换一次。
  621.             {
  622.                     TC=0;       
  623.                     SHAN=!SHAN;             //闪烁标志取反
  624.                         }

  625.                    TC1++;                //每循环一次TC1加1
  626.                 if(TC1==90)             //计时设CON值轮换,参数根据时钟频率调整,基本上1.5秒变一次
  627.                 {                     
  628.                            TC1=0;          //TC1清零,重新计数
  629.                            con++;        //con加1,轮换显公农历,星期
  630.                            if(con==4)    con=1;   //2秒公农历星期期轮流显示.
  631.                            if((set_S>0)&(set_S<4))   con=1;   //调年月日状态下,第三行不轮换.
  632.                           }

  633.                 WDT_CONTR|=0x10;                   //喂狗
  634.                 keyscan();               //扫键并设置时间
  635.                 GetAllTime();                //读取全部时间
  636.                 GetNL_ri();                        //农历运算

  637.                 //GetTime();                                   //读取时间
  638.                 //GetNL_ri();
  639.                 if(RX_over&&DW_OK)           //接收完一帧数据并且收到定位成功信息后进行数据处理,定位后的时间肯定是准确的
  640.                 if(RX_over && (RQ[4]>0x30 & RQ[4]<0x39) )        //如果信号较差能收到时间却没有定位可以用这句降低处理条件
  641.                          GPSdata();

  642.                 if(shi1==1&&shi2==0&&fen1==0&&fen2==0)         //1点同步时间
  643.                  {
  644.                         ES_ON;                                //打开独立波特率发生器 ]
  645.                         GPS_POW=0;                        //打开GPS电源
  646.                  }

  647.                 count++;
  648.                 if(count>40)
  649.                 {
  650.                         count=0;
  651.                         a++;
  652.                         ADCL=1;
  653.                         ADC_CONTR=0xcb;                         //进行亮度AD转换
  654.                         if(a>4)
  655.                         {
  656.                                  a=0;                               
  657.                                 while(ADCL);
  658.                                 ADCT=1;
  659.                                 ADC_CONTR=0xcc;                 //进行温度AD转换
  660.                                 }
  661.                          }
  662.                         
  663.                  xianshi();
  664.         }
  665. }
复制代码


3264_DS3231三种显示时钟.zip

638.12 KB, 下载次数: 114, 下载积分: 黑币 -5

评分

参与人数 2黑币 +51 收起 理由
amlj + 1 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:109731 发表于 2016-4-19 22:28 | 显示全部楼层
有用数码管显示的吗?
回复

使用道具 举报

ID:67678 发表于 2016-4-20 00:25 | 显示全部楼层
应该注明是“转”------这桃源客的程序。程序中的“GPS”意义不大,3231的精度满可以了。
回复

使用道具 举报

ID:140127 发表于 2016-9-22 15:11 | 显示全部楼层
有用数码管显示的吗???
回复

使用道具 举报

ID:91165 发表于 2016-10-15 10:52 | 显示全部楼层
刚收到一块3264,正需要,谢谢楼主
回复

使用道具 举报

ID:91165 发表于 2016-10-15 10:53 | 显示全部楼层
刚收到一块,正需要,谢谢楼主
回复

使用道具 举报

ID:59279 发表于 2017-2-9 22:04 | 显示全部楼层
正好有一块屏,可以借鉴一下。谢谢楼主
回复

使用道具 举报

ID:104838 发表于 2017-3-8 03:50 | 显示全部楼层
谢谢分享做一玩玩
回复

使用道具 举报

ID:146910 发表于 2017-11-7 22:46 | 显示全部楼层
正好有一块屏,可以借鉴一下。谢谢楼主
回复

使用道具 举报

ID:367948 发表于 2019-2-27 11:57 | 显示全部楼层
谢谢,正学习点阵屏
回复

使用道具 举报

ID:8977 发表于 2019-2-27 13:31 | 显示全部楼层
刚好在显示,谢谢楼主分享
回复

使用道具 举报

ID:191243 发表于 2019-9-19 17:03 | 显示全部楼层
点阵 用什么软件生成的
回复

使用道具 举报

ID:613618 发表于 2019-9-20 18:29 来自手机 | 显示全部楼层
编译都不过
回复

使用道具 举报

ID:193022 发表于 2020-6-23 19:39 | 显示全部楼层

谢谢分享正在学习DS3231
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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