|
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();
- }
- }
復制代碼
|
評分
-
查看全部評分
|