|
DS3231_3264双色点阵万年历三种显示
程序预览:
- #include <STC12C5A60S2.H>
- #include <intrins.h>
- #define ulong unsigned long
- #define uint unsigned int
- #define uchar unsigned char
- #define NOP4 _nop_();_nop_();_nop_();_nop_()
- #define CHAR 0xab
- #define ES_ON AUXR |= 0x10; ES=1
- #define ES_OFF AUXR &= 0xEF; ES=0
- #include "zimo2.h"
- #include "DS3231 + AT24C32.h" // 导入DS3231 + AT24C32驱动程序
- sbit KEYS=P2^0; //调整键,按一次设置状态位加1,轮流切换到设置年,月,日,时,分,秒,星期,正常状态.
- sbit KEYA=P2^1; //加一键,在设置状态时按一次相应设置位加1
- sbit KEYD=P2^2; //减一键,在设置状态时按一次相应设置位减1
- sbit KEYM=P2^3; //显示模式键,在设置三行或二行显示
- uchar MODE=0; //显示模式指示,0为二行显示,1为三行显示
- #include <set.h> //键控设时间头文件
- //原程序中的联接
- sbit G1=P0^4;
- sbit G2=P0^5;
- sbit R1=P2^6;
- sbit R2=P2^7;
- sbit LS=P0^6;
- sbit CK=P0^7;
- sbit OE=P2^5;
- #define ABCD P0 //ABCD接到P2.0-P2.3
- bit SHAN; //闪烁标志位,
- uchar TC=0,TC1=0; //延时计数用
- uchar con=1; //秒计数器,用于1.5秒轮显公农历日期,分时显示公农历
- uchar CKTIME_1=0; //时间快慢调整标志
- sbit GPS_POW=P1^7; //gps电源控制
- uchar data row; //行扫描变量
- uchar data RD1[8]; //数据缓存
- uchar data GD1[8];
- uchar data RD2[8];
- uchar data GD2[8];
- uchar miao1,miao2; //秒数据,1十位,2个位
- uchar fen1,fen2 ; //分数据
- uchar shi1,shi2 ; //小时数据
- uchar ri1,ri2 ; //日数据
- uchar yue1,yue2; //月数据
- uchar nian1,nian2; //年数据
- uchar week; //星期
- uchar Dtemp; //温度
- uchar idata NL_yue; //农历月 1~12
- uchar idata NL_ri; //农历日 1~30
- uchar y1,y2,r1,r2; //农历显示数据
- #include "nongli.h"
- uchar SJ[6],RQ[6];
- bit RX_over; //GPS数据接收结束标志位
- bit DW_OK; //GPS定位成功标志位
- uint ADC_L; //ADC亮度数据
- uint ADC_T; //ADC温度数据
- bit ADCL; //亮度ADC标志
- bit ADCT; //温度ADC标志
- uchar t1,t2; //温度显示数据
- void Delay (uchar t)
- { uchar i,j;
- for (i=0;i<t;i++)
- {
- for(j=0;j<10;j++)
- { _nop_();
- _nop_();
- }
- }
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /**************************************
- 初始化DS3231并设初始时间
- **************************************/
- void Time_Initial()
- { Delay (200);
- if(read_random(DS3231_AL2MIN) != 1) //用DS3231的闹铃2位检测失电状态,如标志不是原来的,测初始时钟
- {
- ModifyTime(DS3231_AL2MIN,1); //写入初始化标志化闹铃2位为1,并初始化时间日期。
- ModifyTime(DS3231_SECOND,0); //秒
- ModifyTime(DS3231_MINUTE,43); //分
- ModifyTime(DS3231_HOUR,10); //时
- ModifyTime(DS3231_DAY,4); //日
- ModifyTime(DS3231_MONTH,4); //月
- ModifyTime(DS3231_YEAR,16); //年
- }
- }
- /*******读取当前时间*********/
- void GetAllTime()
- {
- uchar temp;
- temp=read_random(DS3231_SECOND); //秒
- miao1=temp/10;
- miao2=temp%10;
- temp=read_random(DS3231_MINUTE); //分
- fen1=temp/10;
- fen2=temp%10;
- temp=read_random(DS3231_HOUR); //时
- shi1=temp/10;
- shi2=temp%10;
- temp=read_random(DS3231_DAY); //日
- ri1=temp/10;
- ri2=temp%10;
- temp=read_random(DS3231_MONTH); //月
- yue1=temp/10;
- yue2=temp%10;
- temp=read_random(DS3231_YEAR); //年
- nian1=temp/10;
- nian2=temp%10;
-
- Dtemp = read_random(DS3231_TEMP_H);
- TH3231= read_temp();
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void Uart() interrupt 4 using 1
- {
- uchar data Rx_temp ;
- static uchar fg_count=0; //数据间隔,计数
- static uchar Rx_count=0;
- static uchar n=0; //握手信号计数
- static uchar da_count=0; //数据计数
- // static bit RX_start; //GPS数据接收开始标志位
- uchar idata GPRMC[6]={0x24,0x47,0x50,0x52,0x4D,0x43}; //GPS选择接收字符$GPRMC,
- if(RI)
- {
- RI=0;
- Rx_temp=SBUF;
- /******* 监控握手信号进行软件复位自动下载 ******/
- if(Rx_temp==0x7f)
- { //STC下载指令是0x7f
- n++;
- if(n>20) //如果连续收到20次0x7f
- {
- IAP_CONTR=0x60; //复位至ISP区
- n=0;
- }
- }
- else
- n=0;
- /********* GPS数据处理 **************/
- if(Rx_count<6)
- {
- if(Rx_temp==GPRMC[Rx_count]) //比较开始$GPRMC字符,
- Rx_count++;
- else
- Rx_count=0;
- }
- else //找到GPRMC开始保存数据
- {
- if(Rx_temp==',') //如果收到逗号,
- {
- fg_count++; //计数增加
- da_count=0;
- }
- else
- {
- if(fg_count==1) //保存时间数据
- {
- if(da_count<6) //只保存前6位时间数据
- SJ[da_count++]=Rx_temp;
- }
- else
- if(fg_count==2) //保存定位信息
- {
- if(Rx_temp=='A') //如果收到A
- DW_OK=1; //则定位成功
- else
- DW_OK=0;
- }
- else
- if(fg_count==9) //保存日期数据
- RQ[da_count++]=Rx_temp;
- else
- if(fg_count>10) //接收完毕
- {
- RX_over=1;
- // RX_start=0;
- fg_count=0;
- da_count=0;
- Rx_count=0;
- }
- }
- }
- }
- }
- void GPSdata()
- {
- static uchar idata hour[2],min[2],sec[2],year[2],mon[2],day[2]; //临时时间数据 ,为了预防数据传输的误码,使用了2次数据比较
- static uchar a,max;
- RX_over=0;
- //保存临时时间数据
- hour[a]=(SJ[0]-0x30)*10 + (SJ[1]-0x30); //时
- min [a]=(SJ[2]-0x30)*10 + (SJ[3]-0x30); //分
- sec [a]=(SJ[4]-0x30)*10 + (SJ[5]-0x30); //秒
- day [a]=(RQ[0]-0x30)*10 + (RQ[1]-0x30); //日
- mon [a]=(RQ[2]-0x30)*10 + (RQ[3]-0x30); //月
- year[a]=(RQ[4]-0x30)*10 + (RQ[5]-0x30); //年
- a++;
- for(max=0;max<6;max++)
- {
- SJ[max]=0;
- RQ[max]=0;
- }
- if(a>1)
- {
- a=0;
- //如果第二次秒比上次小1,并且分,时,日,月年相同
- 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])
- {
- sec[1]+=1; //GPS时间是包含毫秒的,加上1秒补偿传输和程序处理的延时
- if(sec[1]>59)
- {
- sec[1]=0;
- min[1]+=1;
- if(min[1]>59)
- {
- min[1]=0;
- hour[1]+=1;
- }
- }
- hour[1]+=8; //转换为北京时间 ,东8区要+8
- if(hour[1]>23) //如果超过23则到了第二天
- {
- hour[1]-=24; //
- day[1]+=1; //日+1
- switch(mon[1]) //获取每月最大天数
- {
- case 2: //2月
- if(year[1]%4==0) //判断是否闰月,只取2000-2099年,因此简单的%4运算
- max=29; //闰月29天
- else
- max=28; //正常28天
- break;
- case 4: case 6:
- case 9: case 11: //4,6,9,11月
- max=30; //30天
- break;
- default:
- max=31; //其他月份1,3,5,7,8,10,12月31天
- break;
- }
- if(day[1]>max)
- {
- mon[1]+=1;
- day[1]=0;
- if(mon[1]>12)
- {
- year[1]+=1;
- mon[1]=0;
- }
- }
- }
- // 写入时间数据到DS3231
- ModifyTime(DS3231_SECOND, sec[1]/10*16 + sec[1]%10 ); //秒
- ModifyTime(DS3231_MINUTE, min[1]/10*16 + min[1]%10 ); //分
- ModifyTime(DS3231_HOUR, hour[1]/10*16 + hour[1]%10 ); //时
- ModifyTime(DS3231_DAY, day[1]/10*16 + day[1]%10 ); //日
- ModifyTime(DS3231_MONTH, mon[1]/10*16 + mon[1]%10 ); //月
- ModifyTime(DS3231_YEAR, year[1]/10*16 + year[1]%10 ); //年
-
- GPS_POW=1; //关闭GPS电源
- GetAllTime(); //读取全部时间
- GetNL_ri(); //农历转换
- }
- }
- }
- void loaddata1()
- { /**************装载上半屏一线点阵时间数据****************/
- {
- RD1[0]=tab[shi1][row];//~
- if(SHAN&set_S==4) GD1[1]=tab[shi2][row]; else RD1[1]=tab[shi2][row];//调时状态时字闪.
- if(SHAN) RD1[2]=tab[10][row];else RD1[2]=tab[15][row];//~
- RD1[3]=tab[fen1][row];//~
- if(SHAN&set_S==5) GD1[4]=tab[fen2][row]; else RD1[4]=tab[fen2][row];//调时状态分字闪.
- if(SHAN) RD1[5]=tab[10][row]; else RD1[5]=tab[15][row];//~
- RD1[6]=tab[miao1][row];//~
- if(SHAN&set_S==6) GD1[7]=tab[miao2][row]; else RD1[7]=tab[miao2][row];//调秒状态秒字闪.
- }
- /**************装载下半屏一线点阵数据公历****************/
- if(con==1)
- {
-
- GD2[0]=tab[nian1][row];//~
- if(SHAN&set_S==1) RD2[1]=tab[nian2][row]; else GD2[1]=tab[nian2][row];//调年状态时年闪
- GD2[2]=tab[13][row];//~
- GD2[3]=tab[yue1][row];//~
- if(SHAN&set_S==2) RD2[4]=tab[yue2][row]; else GD2[4]=tab[yue2][row];//调月状态时月闪
- GD2[5]=tab[14][row];//~
- GD2[6]=tab[ri1][row];//~
- if(SHAN&set_S==3) RD2[7]=tab[ri2][row]; else GD2[7]=tab[ri2][row];//调日状态时日闪
-
- }
- /**************装载下半屏一线点阵数据农历****************/
- if(con==2)
- {
- if(NL_yue==1) //如农历为1月,显”正“月
- {
- GD2[0]=NLmonth_tab[14][row*2];//~
- GD2[1]=NLmonth_tab[14][row*2+1];
- }
- else //其它月份显示正常
- {
- GD2[0]=NLmonth_tab[NL_yue][row*2];//~
- GD2[1]=NLmonth_tab[NL_yue][row*2+1];
- }
- GD2[2]=NLmonth_tab[13][row*2];
- GD2[3]=NLmonth_tab[13][row*2+1]; //显"月"
-
- if(NL_ri==10) { //如农历日为10,显示"初十",不显"十十"
- GD2[4]=NLday_S[0][row*2];
- GD2[5]=NLday_S[0][row*2+1];
- GD2[6]=NLday_S[1][row*2];
- GD2[7]=NLday_S[1][row*2+1];
- } else if(NL_ri==20) { //如农历日为20,显示为"二十",不显"廿十"
- GD2[4]=NLmonth_tab[2][row*2];
- GD2[5]=NLmonth_tab[2][row*2+1];
- GD2[6]=NLday_S[1][row*2];
- GD2[7]=NLday_S[1][row*2+1];
- } else
- {
-
- GD2[4]=NLday_S[r1][row*2]; //其它日期显示: "初一,十一,廿一"等农历习惯.
- GD2[5]=NLday_S[r1][row*2+1];
- GD2[6]=NLmonth_tab[r2][row*2];
- GD2[7]=NLmonth_tab[r2][row*2+1];
- }
- }
- /**************装载下半屏一线点阵星期数据****************/
- if(con==3)
-
- { //没有温度控头,显“星期X”用这段,
- /* GD2[0]=tab[15][row]; //显空格
- GD2[1]=WEEK_S[8][row*2];//~
- GD2[2]=WEEK_S[8][row*2+1];//~
- GD2[3]=WEEK_S[9][row*2];//~
- GD2[4]=WEEK_S[9][row*2+1];//~
- if(SHAN&set_S==7) GD2[5]=tab[15][row]; else GD2[5]=WEEK_S[now[5]][row*2];//调周状态周字闪.
- if(SHAN&set_S==7) GD2[6]=tab[15][row]; else GD2[6]=WEEK_S[now[5]][row*2+1];//调周状态周字闪.
- GD2[15]=tab[15][row];//~
- */
- //----有温度探头,显“周三,18.6C”用这一段。
- GD2[0]=WEEK_S[10][row*2];//~
- GD2[1]=WEEK_S[10][row*2+1];//~
- if(SHAN&set_S==7) GD2[2]=tab[15][row]; else GD2[2]=WEEK_S[week+1][row*2];//调周状态周字闪.
- if(SHAN&set_S==7) GD2[3]=tab[15][row]; else GD2[3]=WEEK_S[week+1][row*2+1];//调周状态周字闪.
- GD2[4]=tab[15][row];//~显示空格
- if(t1==0) GD2[5]=tab[15][row]; else GD2[5]=temp10[t1][row];//显示温度十位
- GD2[6]=temp10[t2][row];//~显示温度个位
- GD2[7]=tab[16][row];//~显示℃符号
-
-
- }
- }
- void loaddata()
- {
- uchar data row1,row2;
- row1=row+8; // 上1/2屏行扫描
- row2=row-8; // 下1/2屏行扫描
- if(row<8)
- {
- GD1[0]=(Num5[2][row]<<3)|(Num5[0][row]>>3);
- GD1[1]=(Num5[0][row]<<5)|(Num5[nian1][row]>>1);
- 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) ;
- GD1[3]=Num5[yue1][row];
- if(SHAN&set_S==2) RD1[4]=Num5[yue2][row]<<2; else GD1[4]=Num5[yue2][row]<<2;
- GD1[5]=Num5[ri1][row]<<1;
- if(SHAN&set_S==3) RD1[6]=Num5[ri2][row]<<3; else GD1[6]=Num5[ri2][row]<<3;
- GD1[7]=RD1[7]=Num8[week][row];
- if(row==3) //日期点
- {
- GD1[3]|=0xC0;
- GD1[4]|=0x01;
- GD1[5]|=0x80;
- }
- {
- RD2[0]=Num14[shi1][row1];
- RD2[1]=Num14[shi2][row1]>>2;
- RD2[2]=Num14[shi2][row1]<<6;
- if(SHAN&set_S==4) { GD2[1]=Num14[shi2][row1]>>2; GD2[2]=Num14[shi2][row1]<<6; }
- RD2[3]=Num14[fen1][row1];
- RD2[4]=Num14[fen2][row1]>>2;
- RD2[5]=Num14[fen2][row1]<<6 ;
- if(SHAN&set_S==5){ GD2[4]=Num14[fen2][row1]>>2; GD2[5]=Num14[fen2][row1]<<6 ; }
- RD2[6]=Num12[miao1][row1]<<1;
- RD2[7]=Num12[miao2][row1];
- if(SHAN&set_S==6) GD2[7]=Num12[miao2][row1];
- if(row==3|row==4)
- {
- if( SHAN)
- {
- RD2[2]|=0x0c;
- RD2[5]|=0x0c;
- }
- else
- {
- RD2[2]|=0x00;
- RD2[5]|=0x00;
- }
- }
- }
- }
- else
- {
- {
- RD1[0]=Num14[shi1][row2];
- RD1[1]=Num14[shi2][row2]>>2;
- RD1[2]=Num14[shi2][row2]<<6;
- if(SHAN&set_S==4) { GD1[1]=Num14[shi2][row2]>>2; GD1[2]=Num14[shi2][row2]<<6;}
- RD1[3]=Num14[fen1][row2];
- RD1[4]=Num14[fen2][row2]>>2;
- RD1[5]=Num14[fen2][row2]<<6 ;
- if(SHAN&set_S==5){ GD1[4]=Num14[fen2][row2]>>2;GD1[5]=Num14[fen2][row2]<<6 ; }
- RD1[6]=Num12[miao1][row2]<<1;
- RD1[7]=Num12[miao2][row2];
- if(SHAN&set_S==6) GD1[7]=Num12[miao2][row2];
- if(row==12|row==13)
- {
- if( SHAN)
- {
- RD1[2]|=0x0c;
- RD1[5]|=0x0c;
- }
- else
- {
- RD1[2]|=0x00;
- RD1[5]|=0x00;
- }
- }
- }
- GD2[0]=Num8[y1][row2];
- GD2[1]=Num8[y2][row2];
- GD2[2]=Num8[11][row2];
- GD2[3]=NL [r1][row2];
- GD2[4]=Num8[r2][row2]>>1;
- GD2[5]=Num8[r2][row2]<<7 | Num5[t1][row2-1]>>2;
- RD2[5]=Num5[t1][row2-1]>>2;
- GD2[6]=RD2[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;
- GD2[7]=RD2[7]=Num5[17][row2];
- }
- }
- void loaddata2() //另一种三行显示方式
- {
- uchar data row1,row2;
- row1=row+8; // 上1/2屏行扫描
- row2=row-8; // 下1/2屏行扫描
- RD1[0]=Num14[shi1][row];
- if(shi1==0) RD1[0]=tab[15][row];; //使用这一行将在时十位为0时消隐,注释不使用显示0X
- RD1[1]=Num14[shi2][row];
- if(SHAN&set_S==4) RD1[1]=tab[15][row]; //调时状态时闪
- if(SHAN) RD1[2]=tab[10][row]; else RD1[2]=tab[15][row];
- RD1[3]=Num14[fen1][row];
- RD1[4]=Num14[fen2][row];
- if(SHAN&set_S==5) RD1[4]=tab[15][row]; //调时状态时闪
- GD2[6]=RD2[6]=tab[ri1][row];
- GD2[7]=RD2[7]=tab[ri2][row];
- if(SHAN&set_S==3) GD2[7]=RD2[7]=tab[15][row];
- if(row<8)
- {
- if((shi1*10+shi2)>11) RD1[6]=ampm[1][row];else RD1[6]=ampm[0][row]; //显示:上 下
- RD1[7]=ampm[2][row]; //显示:午
- GD2[0]=RD2[0]=Num5[t1][row];
- GD2[1]=RD2[1]=Num5[t2][row]<<2|Num5[17][row]>>6;
- GD2[2]=RD2[2]=Num5[17][row]<<2;
- if(yue1>0) GD2[3]=Num5[yue1][row]>>2;
- GD2[4]=Num5[yue2][row];
- if(SHAN&set_S==2) GD2[4]=Num5[19][row] ; //调月时月闪
- GD2[5]=Num8[11][row]; //显示“月”
- }
- else
- {
- RD1[5]=GD1[5]=Num5[miao1][row-8];
- RD1[6]=GD1[6]=Num5[miao2][row-8]<<2;
- if(SHAN&set_S==6) RD1[6]=GD1[6]=Num5[19][row-8] ; //调秒时秒闪
- GD1[7]=Num8[week][row-8];
- GD2[0]=Num8[y1][row-8];
- GD2[1]=Num8[y2][row-8];
- GD2[2]=Num8[11][row-8];
- GD2[3]=NL [r1][row-8];
- GD2[4]=Num8[r2][row-8]>>1; //调整下农历日分隔,显得好看
- GD2[5]=Num8[r2][row-8]<<7;
- }
- }
- void xianshi()
- {
- uchar i,j;
- for(row=0;row<16;row++) //扫描16行
- {
- if(MODE==1) loaddata1(); else if(MODE==2) loaddata2() ; else loaddata(); //根据MODE键值选择显示方式
- for(i=0;i<8;i++) //扫描1行
- {
- for(j=0;j<8;j++) //发送1个数据
- {
- R1=!(RD1[i]&0x80); //发送最高位,如是逆向取模则发送最低位 &0x01
- R2=!(RD2[i]&0x80); //由于数据是低电平有效,所以进行取反
- G1=!(GD1[i]&0x80);
- G2=!(GD2[i]&0x80);
- CK=0; //时钟下降
- RD1[i]<<=1; //数据左移1 如是逆向取模则改为右移>>
- RD2[i]<<=1; //
- GD1[i]<<=1;
- GD2[i]<<=1;
- CK=1; //时钟上升
- }
- }
- ABCD=row; //行选
- LS=0;
- NOP4;
- LS=1; //锁存上升,显示输出
- OE=0;
- TH0=255-ADC_L; //
- TR0=1;
- }
- }
- void UartInit(void) //9600bps@24.576MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位数据,可变波特率
- AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
- BRT = 0xB0; //设定独立波特率发生器重装值
- AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
- AUXR |= 0x10; //启动独立波特率发生器
- }
- void TIM0() interrupt 1
- {
- OE=1;
- TR0=0;
- }
- void ADC() interrupt 5 using 2
- {
- // uchar t;
- uint ADC_temp;
- static uchar m;
- static uint TO;
- static uint max,min;
- ADC_CONTR&=0xEF; //清除ADC中断标志位
- ADC_temp=ADC_RES<<2 | ADC_RESL ;
-
- if(m==0)
- min=max=ADC_temp;
- if(ADC_temp>max)
- max=ADC_temp;
- if(ADC_temp<min)
- min=ADC_temp;
- TO+=ADC_temp;
- m++;
- if(m<10)
- ADC_CONTR |= 0x08; //启动下次AD转换
- else
- {
- ADC_temp=(TO-min-max+4)>>3; //
- TO=0;
- m=0;
-
- if(ADCL)
- {
- ADC_L=ADC_temp/16;
- if(ADC_L>7)//限制最高亮度或者时间夜晚无人时自动降低亮度
- {
- if((shi1*10+shi2)>7&(shi1*10+shi2)<23)
- {
- ADC_L=7;
- ADCL=0;
- }
- else
- {
- ADC_L=1;
- ADCL=0;
- }
- }
- }
-
- if(ADCT)
- {
- /*
- ADC_T=(ADC_temp>>2);
- if(ADC_T>39 & ADC_T<190)
- {
- // t=temp[ADC_T-40];
- //////////////////////////////////////////
- t1=temp[ADC_T-40]/10;
- t2=temp[ADC_T-40]%10;
-
- //////////////////////////////////////////
- if(t1==0) //首位0消隐
- t1=19;
- if(ADC_T<60) //低于0显示-
- t1=18;
- }
- else
- t1=t2=18;
- ADCT=0;
- */
- t1=Dtemp/10;
- t2=Dtemp%10;
- }
- }
-
- }
- void main()
- {
- static uchar count,a;
- WDT_CONTR=0x36; //启动看门狗,64分频,约1s多
- P0M1=0x00;
- P0M0=0xff; //以下为接LED点阵屏设为强推,适应有下拉或上拉电阻输入的屏
- P2M1=0x00;
- P2M0=0xe0;
- P4M1=0x00;
- P4M0=0xff;
- P1M1=0x18; //P13,P14高阻模式 ,0001100
- P1ASF=0x18; //P13,P14做ADC输入
- UartInit(); //串口初始化
- TMOD=0x11; //16bit
- AUXR |= 0x80; // 1T
- EA=1; ES=1; ET0=1;
- EADC=1; //开启ADC中断
- Time_Initial(); //根据DS1302状态是否进行初始化
- GetAllTime(); //读取全部时间
- GetNL_ri(); //农历运算
- GPS_POW=0;
- while(1)
- {
- //以下代码是作为秒点延时之用,
- TC++;
- if(TC==35) // 具体数据根据时钟频率调整,0.5秒换一次。
- {
- TC=0;
- SHAN=!SHAN; //闪烁标志取反
- }
- TC1++; //每循环一次TC1加1
- if(TC1==90) //计时设CON值轮换,参数根据时钟频率调整,基本上1.5秒变一次
- {
- TC1=0; //TC1清零,重新计数
- con++; //con加1,轮换显公农历,星期
- if(con==4) con=1; //2秒公农历星期期轮流显示.
- if((set_S>0)&(set_S<4)) con=1; //调年月日状态下,第三行不轮换.
- }
- WDT_CONTR|=0x10; //喂狗
- keyscan(); //扫键并设置时间
- GetAllTime(); //读取全部时间
- GetNL_ri(); //农历运算
- //GetTime(); //读取时间
- //GetNL_ri();
- if(RX_over&&DW_OK) //接收完一帧数据并且收到定位成功信息后进行数据处理,定位后的时间肯定是准确的
- if(RX_over && (RQ[4]>0x30 & RQ[4]<0x39) ) //如果信号较差能收到时间却没有定位可以用这句降低处理条件
- GPSdata();
- if(shi1==1&&shi2==0&&fen1==0&&fen2==0) //1点同步时间
- {
- ES_ON; //打开独立波特率发生器 ]
- GPS_POW=0; //打开GPS电源
- }
- count++;
- if(count>40)
- {
- count=0;
- a++;
- ADCL=1;
- ADC_CONTR=0xcb; //进行亮度AD转换
- if(a>4)
- {
- a=0;
- while(ADCL);
- ADCT=1;
- ADC_CONTR=0xcc; //进行温度AD转换
- }
- }
-
- xianshi();
- }
- }
复制代码
|
评分
-
查看全部评分
|