成功仿制的51單片機+3264點陣屏DS3231高精度時鐘芯片_搖控_GPS時鐘,留下紀念,制作出來的實物圖如下:
1.jpg (92.63 KB, 下載次數: 108)
下載附件
2019-5-6 16:16 上傳
2.jpg (101.95 KB, 下載次數: 91)
下載附件
2019-5-6 16:16 上傳
3.png (813.62 KB, 下載次數: 112)
下載附件
2019-5-6 16:16 上傳
4.jpg (98.33 KB, 下載次數: 109)
下載附件
2019-5-6 16:16 上傳
5.png (1.11 MB, 下載次數: 87)
下載附件
2019-5-6 16:16 上傳
6.png (954.41 KB, 下載次數: 93)
下載附件
2019-5-6 16:16 上傳
7.png (771.11 KB, 下載次數: 98)
下載附件
2019-5-6 16:16 上傳
8.png (1.09 MB, 下載次數: 92)
下載附件
2019-5-6 16:16 上傳
09.png (409.2 KB, 下載次數: 96)
下載附件
2019-5-6 04:54 上傳
10.png (481.87 KB, 下載次數: 101)
下載附件
2019-5-6 04:54 上傳
11.png (333.47 KB, 下載次數: 98)
下載附件
2019-5-6 04:55 上傳
12.png (349.1 KB, 下載次數: 108)
下載附件
2019-5-6 04:55 上傳
13.png (303.79 KB, 下載次數: 100)
下載附件
2019-5-6 04:55 上傳
14.png (402.01 KB, 下載次數: 95)
下載附件
2019-5-6 04:55 上傳
15.png (431.61 KB, 下載次數: 104)
下載附件
2019-5-6 04:56 上傳
16.png (456.5 KB, 下載次數: 87)
下載附件
2019-5-6 04:56 上傳
電路原理圖如下:
0.png (117.6 KB, 下載次數: 92)
下載附件
2019-5-6 16:17 上傳
元件清單:
名稱
二手GPS 剪線(不保好壞,建議買兩個以上)
F3.75雙色LED顯示屏32X64點
DS18B20 溫度IC
雙排彎針(2.54MM雙排彎針2*40)
micro USB接口座
40腳 IC插座
STC12C5A60S2(40腳 IC)
7*9CM萬能板
9*15CM萬能板(割一小塊下來焊按鍵接收板)
排線 杜邦線2P 20CM
排線 杜邦線4P 20CM
排線 杜邦線5P 20CM
排線 杜邦線8P 20CM
DS3231 AT24C32時鐘模塊(帶電池)
紅外遙控接收頭 VS838
熱敏電阻 MF52-10K B值3950
24.576M/24M晶振
5MM光敏電阻5528
104全新直插CA42鉭電容 0.1UF
25V470UF 8*12mm電解電容
25V10UF 4*7mm電解電容
IN4007
1K金屬膜電阻1/4W 1%(100個)
4.7K金屬膜電阻1/4W 1%(100個)
10K金屬膜電阻1/4W 1%(100個)
30PF全新獨石電容直插
8550三極管
按鍵 6x6臥式帶支架
單片機源程序如下:
- //原程序為Benli所創(chuàng),只是把DS1302計時芯片換成DS3231+24C32模塊。
- // 本時鐘使用STC12C5A60S2單片機,24/24.576M晶振,DS3231高精度RTC芯片,GPS時間校正
- // 多模式顯示,有三大模式,每個模式分別有時間粗體/細體,有秒/無秒,12時/24時8種模式,共計24模式
- // GPS時間校正,每天定時開啟GPS校正本地時間
- // DS18B20/NTC溫度傳感器自適應,優(yōu)先使用DS18B20
- // 自動亮度調節(jié),根據環(huán)境光線自動調節(jié)屏幕亮度,白天清晰,晚上柔和而且省電
- // 學習型紅外遙控
- // 停電后由電池供電并進入省電模式
- // 按鍵說明:
- // 在非設置模式下,按+鍵切換顯示模式,-鍵切換12/24時制
- // 按SET分別設置 正常顯示/年/月/日/時/分/秒/亮度/最低亮度/綠補償/NTC補償/遙控開關/學習模式
- // 按+/-調整數據,
- // ESC退出設置
- // 在學習模式下按遙控學習按鍵
- #include <STC12C5A60S2.H>
- #include <intrins.h>
- #define ulong unsigned long
- #define uint unsigned int
- #define uchar unsigned char
- #include "zimo2.h"
- #define NOP _nop_()
- #define NOP4 _nop_();_nop_();_nop_();_nop_()
- #define XSMOD_Max 11 //顯示模式最大數
- #define Set_Max 15 //設置項目數
- #define Liangdu_Max 19
- #define Min_Liangdu_Max 9
- #define Liangdu_G_Max 9
- #define ES_ON AUXR |= 0x10; ES=1
- #define ES_OFF AUXR &= 0xEF; ES=0
- //#define BRT_INT 0x62 //4800bps@24M
- #define BRT_INT 0xb1 //9600bps@24M
- #define EN_OFF() OE=1 //使能低電平有效,高電平有效取反
- #define EN_ON() OE=0
- //#define DATAHI //數據高電平有效保留,低電平有效需去掉
- uchar code banben[4]="2.4";
- uchar idata GPRMC[]="$GPRMC"; //GPS選擇接收字符$GPRMC,
- //uchar idata GPRMC[6]={0x24,0x47,0x50,0x52,0x4D,0x43}; //GPS選擇接收字符$GPRMC,
- 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接到P0.0-P0.3
- sbit GPS_POW=P1^5; //gps電源控制
- sbit POW_OK= P3^2; //外部電源檢測
- sbit IR_POW=P3^4; //紅外接收電源
- sbit KeySet= P2^3; //調整按鍵
- sbit KeyAdd= P2^2; //加按鍵
- sbit KeyDec= P2^1; //減按鍵
- sbit KeyEsc= P2^0; //退出鍵
- bit K_ADD,K_DEC,K_SET,K_ESC; //按鍵標志
- 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; //星期
- bit SHAN,SHAN2; //閃爍標志
- uchar idata Set_S=0;
- uchar idata NL_yue; //農歷月 1~12
- uchar idata NL_ri; //農歷日 1~30
- uchar y1,y2,r1,r2; //農歷顯示數據
- 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; //溫度顯示數據
- bit NTC; //是否使用NTC測溫標志
- bit Zhi_12,PM; //12/24時制標示,0/24 1/12
- uchar idata XSMOD; //顯示模式
- char idata Liangdu; //亮度
- char idata Min_Liangdu; //最低亮度
- char idata Liangdu_G; //綠亮度
- char idata Light_R,Light_L,Light_G; //亮度控制用變量
- uchar idata Li;
- uchar idata NTC_buchang; //NTC補償
- uchar idata IR_date[7]={0,0,0,0,0,0,0}; //date數組為存放地址原碼,反碼,數據原碼,反碼,標志位,
- //連發(fā)標志,臨時數據(執(zhí)行數據
- uchar idata IR_Key[5]; //紅外鍵值,用戶碼,SET,+,-.ESC
- bit xuexi_OK ; //紅外學習成功標示
-
- #include "nongli.h"
- #include "DS3231+AT24C32.h"
- #include "18b20.h"
- #include "set.h"
- #include "eep.h"
- void Delayus(uint x);
- void Delay (uchar t)
- { uchar i,j;
- for (i=0;i<t;i++)
- for(j=0;j<10;j++);
- }
- void Delayus(uint x)
- {
- while(x--);
- }
- void GPSdata()
- {
- static uchar idata hour[2],min[2],sec[2],year[2],mon[2],day[2]; //臨時時間數據 ,為了預防數據傳輸的誤碼,使用了2次數據比較
- static uchar idata a;
- uchar idata max;
-
- RX_over=0;
- for(max=0;max<6;max++)
- {
- SJ[max]-=0x30;
- RQ[max]-=0x30;
- } //保存臨時時間數據
- hour[a]=SJ[0]*10 + SJ[1]; //時
- min [a]=SJ[2]*10 + SJ[3]; //分
- sec[a]=SJ[4]*10 + SJ[5]; //秒
- day [a]=RQ[0]*10 + RQ[1]; //日
- mon [a]=RQ[2]*10 + RQ[3]; //月
- year[a]=RQ[4]*10 + RQ[5]; //年
- a++;
- 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區(qū)要+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]=1;
- if(mon[1]>12)
- {
- year[1]+=1;
- mon[1]=1;
- }
- }
- }
- // 寫入時間數據到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電源
- // ES_OFF;
- GetAllTime(); //讀取全部時間
- GetNL_ri(); //農歷轉換
- }
- }
- }
- void ShowLogo()
- {
- uchar i,j;
- uint x=300;
- uchar code *p;
-
- while(x--)
- {
- WDT_CONTR=0x34;
- for(row=0;row<16;row++) //掃描16行
- {
- GD1[0]=ZMlogo[20][row]; //GPSclock
- GD1[1]=ZMlogo[21][row];
- GD1[2]=ZMlogo[22][row];
- GD1[3]=ZMlogo[23][row];
- RD1[4]=GD1[4]=ZMlogo[24][row];
- RD1[5]=GD1[5]=ZMlogo[25][row];
- RD1[6]=GD1[6]=ZMlogo[26][row];
- RD1[7]=GD1[7]=ZMlogo[27][row];
-
- RD2[0]=ZMlogo[28][row]; //V
- RD2[1]=ZMlogo[29][row];
- RD2[2]=ZMlogo[30][row]; //2
- RD2[3]=ZMlogo[31][row];
- RD2[4]=ZMlogo[32][row];
- RD2[5]=ZMlogo[33][row];
- {
- RD2[6]=ZMlogo[34][row]; //D
- }
-
- {
- RD2[7]=ZMlogo[35][row]; //S
- }
-
- for(i=0;i<8;i++) //掃描1行
- {
- for(j=0;j<8;j++) //發(fā)送1個數據
- {
- #ifdef DATAHI
- RD1[i]<<=1; //數據左移1 如是逆向取模則改為右移>>
- R1=CY; //發(fā)送最高位,
- RD2[i]<<=1;
- R2=CY;
- GD1[i]<<=1;
- G1=CY;
- GD2[i]<<=1;
- G2=CY;
- CK=0; //時鐘下降
- NOP4;
- CK=1; //時鐘上升
- #else
- RD1[i]<<=1; //數據左移1 如是逆向取模則改為右移>>
- R1=!CY; //發(fā)送最高位,
- RD2[i]<<=1;
- R2=!CY; //由于數據是低電平有效,所以進行取反
- GD1[i]<<=1;
- G1=!CY;
- GD2[i]<<=1;
- G2=!CY;
- CK=0; //時鐘下降
- NOP4;
- CK=1; //時鐘上升
- #endif
- }
- }
- ABCD=row; //行選
- LS=0;
- NOP4;
- LS=1; //鎖存上升,顯示輸出
- EN_ON(); //顯示開
- Delay(40);
- // TH0=255-ADC_L;
- // TR0=1;
- EN_OFF(); //顯示關
- // Delay(1);
- }
- }
- }
- void Mode0123_RQ_G() // 模式1234日期 綠數據
- {
- uchar row1,row2;
- row1=row+8; // 上1/2屏行掃描
- row2=row-8; // 下1/2屏行掃描
- if(row<8) //上1/2屏
- {
- GD1[0]=(Num5[2][row]<<3)|(Num5[0][row]>>3);
- GD1[1]=(Num5[0][row]<<5)|(Num5[nian1][row]>>1);
- GD1[2]=(Num5[nian1][row]<<7)|(Num5[nian2][row]<<1);
- GD1[3]=Num5[yue1][row];
- GD1[4]=Num5[yue2][row]<<2;
- GD1[5]=Num5[ri1][row]<<1;
- GD1[6]=Num5[ri2][row]<<3;
- GD1[7]=Num8[week][row];
- if(row==3) //日期點
- {
- GD1[3]|=0xC0;
- GD1[4]|=0x01;
- GD1[5]|=0x80;
- }
- }
- else //下1/2/屏
- {
- GD2[0]=Num8[y1][row2]; //農歷日期
- GD2[1]=Num8[y2][row2];
- GD2[2]=Num8[11][row2];
- GD2[3]=NL8 [r1][row2];
- GD2[4]=Num8[r2][row2]>>1;
- GD2[5]=Num8[r2][row2]<<7 | Num5[t1][row2-1]>>2; //溫度
- GD2[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;
- GD2[7]=Num5[17][row2];
- // GD2[0]=Num5[Zhi_12][row2];
- // GD2[1]=Num5[PM][row2];
- // GD2[0]=Num5[Li/10][row2];
- // GD2[1]=Num5[Li%10][row2];
- // GD2[2]=0;
- // GD2[3]=Num5[XSMOD/10][row2];
- // GD2[4]=Num5[XSMOD%10][row2]<<2;
- // GD2[5]=Num5[TH0/100][row2];
- // GD2[6]=Num5[TH0%100/10][row2];
- // GD2[7]=Num5[TH0%10][row2];
- }
- }
- void Mode0123_RQ_R() //模式1234日期 紅數據
- {
- uchar row1,row2;
- row1=row+8; // 上1/2屏行掃描
- row2=row-8; // 下1/2屏行掃描
- if(row<8)
- RD1[7]=Num8[week][row];
- else
- {
- RD2[5]=Num5[t1][row2-1]>>2; //溫度
- RD2[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;
- // RD2[7]=Num5[17][row2];
- }
- }
- void Mode0_SJ_G()
- {
- uchar data row1,row2;
- row1=row+8; // 上1/2屏行掃描
- row2=row-8; // 下1/2屏行掃描
- if(row<8)
- {
- if(GPS_POW)
- NOP;
- else
- {
- GD2[2]|=maohao[0][row1];
- GD2[6]|=maohao[1][row1];
- }
- }
- else
- {
- if(GPS_POW)
- NOP;
- else
- {
- GD1[2]|=maohao[0][row2];
- GD1[6]|=maohao[1][row2];
- }
- }
- }
- void Mode0_SJ_R() //三行有秒,粗體時間
- {
- uchar row1,row2,row3;
- if(row<8)
- {
- row1=(row+8)*2; // 上1/2屏行掃描
- row2=(row+8)*2+1; // 下1/2屏行掃描
- row3=row+8;
-
- if(shi1==0)
- {
- RD2[0]=0;
- RD2[1]=Num14B[shi2][row1]>>3;
- }
- else
- {
- RD2[0]=Num14B[shi1][row1]; //時
- RD2[1]=Num14B[shi1][row2] | Num14B[shi2][row1]>>3;
- }
- RD2[2]=Num14B[shi2][row1]<<5 | Num14B[shi2][row2]>>3;
- RD2[3]=Num14B[fen1][row1]>>2; // 分
- RD2[4]=Num14B[fen1][row1]<<6 | Num14B[fen1][row2]>>2 | Num14B[fen2][row1]>>5;
- RD2[5]=Num14B[fen2][row1]<<3 | Num14B[fen2][row2]>>5;
- RD2[6]=Num12[miao1][row3]>>2; //秒
- RD2[7]=Num12[miao2][row3]>>1 | Num12[miao1][row3]<<6;
- if(GPS_POW)
- {
- RD2[2]|=maohao[0][row3];
- RD2[6]|=maohao[1][row3];
- }
- }
- else //時間上半部
- {
- row1=(row-8)*2; // 上1/2屏行掃描
- row2=(row-8)*2+1; // 下1/2屏行掃描
- row3=row-8;
-
- if(shi1==0)
- {
- RD1[0]=0;
- RD1[1]=Num14B[shi2][row1]>>3;
- }
- else
- {
- RD1[0]=Num14B[shi1][row1]; //時
- RD1[1]=Num14B[shi1][row2] | Num14B[shi2][row1]>>3;
- }
- RD1[2]=Num14B[shi2][row1]<<5 | Num14B[shi2][row2]>>3;
- RD1[3]=Num14B[fen1][row1]>>2; // 分
- RD1[4]=Num14B[fen1][row1]<<6 | Num14B[fen1][row2]>>2 | Num14B[fen2][row1]>>5;
- RD1[5]=Num14B[fen2][row1]<<3 | Num14B[fen2][row2]>>5;
- RD1[6]=Num12[miao1][row3]>>2; //秒
- RD1[7]=Num12[miao2][row3]>>1 | Num12[miao1][row3]<<6;
- if(PM)
- RD1[0]|=Num12[15][row3];
-
- if(GPS_POW)
- {
- RD1[2]|=maohao[0][row3];
- RD1[6]|=maohao[1][row3];
- }
- }
- }
- void Mode1_SJ_R()
- {
- uchar row1,row2;
- row1=row+8; // 上1/2屏行掃描
- row2=row-8; // 下1/2屏行掃描
- if(row<8)
- {
- if(shi1==0) RD1[0]=0; else
- RD2[0]=Num14[shi1][row1]; //時
- RD2[1]=Num14[shi2][row1]>>2;
- RD2[2]=Num14[shi2][row1]<<6;
- RD2[3]=Num14[fen1][row1]>>2; // 分
- RD2[4]=Num14[fen2][row1]>>4 | Num14[fen1][row1]<<6;
- RD2[5]=Num14[fen2][row1]<<4 ;
- RD2[6]=Num12[miao1][row1]>>1; //秒
- RD2[7]=Num12[miao2][row1];
- if(row==3|row==4)
- {
- if(GPS_POW)
- {
- RD2[2]|=0x06;
- RD2[5]|=0x03;
- }
- // else
- // {
- // GD2[2]|=0x06;
- // GD2[5]|=0x03;
- // }
- }
- }
- else //時間上半部
- {
- if(shi1==0) RD1[0]=0; else
- RD1[0]=Num14[shi1][row2]; //時
- RD1[1]=Num14[shi2][row2]>>2;
- RD1[2]=Num14[shi2][row2]<<6;
- RD1[3]=Num14[fen1][row2]>>2; // 分
- RD1[4]=Num14[fen2][row2]>>4 | Num14[fen1][row2]<<6;
- RD1[5]=Num14[fen2][row2]<<4 ;
- RD1[6]=Num12[miao1][row2]>>1; //秒
- RD1[7]=Num12[miao2][row2];
- if(PM)
- RD1[0]|=Num12[15][row2];
-
- if(row==12|row==13)
- {
- if(GPS_POW)
- {
- RD1[2]|=0x06;
- RD1[5]|=0x03;
- }
- }
- }
- }
- void Mode1_SJ_G()
- {
- uchar row1,row2;
- row1=row+8; // 上1/2屏行掃描
- row2=row-8; // 下1/2屏行掃描
- if(row<8)
- {
- if(row==3|row==4)
- {
- if(GPS_POW)
- {
- ;
- }
- else
- {
- GD2[2]|=0x06;
- GD2[5]|=0x03;
- }
- }
- }
- else
- {
- if(row==12|row==13)
- {
- if(GPS_POW)
- {
- ;
- }
- else
- {
- GD1[2]|=0x06;
- GD1[5]|=0x03;
- }
- }
- }
- }
- void Mode2_SJ_R()
- {
- uchar row3,row4;
- if(row<8)
- {
- ////時間
- row3=(row+8)*2;
- row4=(row+8)*2+1;
- if(shi1==0) //
- RD2[0]=RD2[1]=0;
- else
- {
- RD2[0]=Num16B[shi1][row3]; //時
- RD2[1]=Num16B[shi1][row4];
- }
- RD2[2]=Num16B[shi2][row3]<<3 | Num16B[shi2][row4]>>5;
- RD2[3]=Num16B[shi2][row4]<<3; // 分
- RD2[4]=Num16B[fen1][row3]>>3;
- RD2[5]=Num16B[fen1][row4]>>3| Num16B[fen1][row3]<<5;
- RD2[6]=Num16B[fen2][row3]; //秒
- RD2[7]=Num16B[fen2][row4];
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- RD2[3]|=maohao[4][row+8];
- RD2[4]|=maohao[3][row+8];
- }
- }
- else
- {
- if(GPS_POW)
- {
- NOP4;
- NOP4;
- }
- } }
- else //時間上半部
- {
- // if(shi1==0) RD1[0]=0; else
- row3=(row-8)*2;
- row4=(row-8)*2+1;
- if(shi1==0)
- RD1[0]=RD1[1]=0;
- else
- {
- RD1[0]=Num16B[shi1][row3]; //時
- RD1[1]=Num16B[shi1][row4];
- }
- RD1[2]=Num16B[shi2][row3]<<3 | Num16B[shi2][row4]>>5;
- RD1[3]=Num16B[shi2][row4]<<3; // 分
- RD1[4]=Num16B[fen1][row3]>>3;
- RD1[5]=Num16B[fen1][row4]>>3| Num16B[fen1][row3]<<5;
- RD1[6]=Num16B[fen2][row3]; //秒
- RD1[7]=Num16B[fen2][row4];
- if(PM)
- RD1[0]|=Num12[15][row-8];
- if(SHAN)
- {
- if(GPS_POW)
- {
- RD1[3]|=maohao[4][row-8];
- RD1[4]|=maohao[3][row-8];
- }
- }
- else
- {
- if(GPS_POW)
- {
- NOP4;
- NOP4;
- }
- }
- }
- }
- void Mode2_SJ_G()
- {
- if(row<8)
- {
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD2[3]|=maohao[4][row+8];
- GD2[4]|=maohao[3][row+8];
- }
- }
- else
- Delayus(20);
- }
- else //時間上半部
- {
- if(SHAN)
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD1[3]|=maohao[4][row-8];
- GD1[4]|=maohao[3][row-8];
- }
- }
- else
- Delayus(20);
- }
- }
-
- void Mode3_SJ_R()
- {
- uchar row3,row4;
- if(row<8)
- {
- ////時間
- row3=(row+8)*2;
- row4=(row+8)*2+1;
- if(shi1==0) //
- RD2[0]=RD2[1]=0;
- else
- {
- RD2[0]=Num16[shi1][row3]; //時
- RD2[1]=Num16[shi1][row4];
- }
- RD2[2]=Num16[shi2][row3]<<3 | Num16[shi2][row4]>>5;
- RD2[3]=Num16[shi2][row4]<<3; // 分
- RD2[4]=Num16[fen1][row3]>>3;
- RD2[5]=Num16[fen1][row4]>>3| Num16[fen1][row3]<<5;
- RD2[6]=Num16[fen2][row3]; //秒
- RD2[7]=Num16[fen2][row4];
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- RD2[3]|=maohao[4][row+8];
- RD2[4]|=maohao[3][row+8];
- }
- }
- else
- {
- if(GPS_POW)
- {
- NOP4;
- NOP4;
- }
- }
- }
- else //時間上半部
- {
- // if(shi1==0) RD1[0]=0; else
- row3=(row-8)*2;
- row4=(row-8)*2+1;
- if(shi1==0)
- RD1[0]=RD1[1]=0;
- else
- {
- RD1[0]=Num16[shi1][row3]; //時
- RD1[1]=Num16[shi1][row4];
- }
- RD1[2]=Num16[shi2][row3]<<3 | Num16[shi2][row4]>>5;
- RD1[3]=Num16[shi2][row4]<<3; // 分
- RD1[4]=Num16[fen1][row3]>>3;
- RD1[5]=Num16[fen1][row4]>>3| Num16[fen1][row3]<<5;
- RD1[6]=Num16[fen2][row3]; //秒
- RD1[7]=Num16[fen2][row4];
- if(PM)
- RD1[0]|=Num12[15][row-8];
- if(SHAN)
- {
- if(GPS_POW)
- {
- RD1[3]|=maohao[4][row-8];
- RD1[4]|=maohao[3][row-8];
- }
- }
- else
- {
- if(GPS_POW)
- {
- NOP4;
- NOP4;
- }
- }
- }
- }
- void Mode3_SJ_G()
- {
- if(row<8)
- {
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD2[3]|=maohao[4][row+8];
- GD2[4]|=maohao[3][row+8];
- }
- }
- else
- Delayus(20);
- }
- else //時間上半部
- {
- if(SHAN)
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD1[3]|=maohao[4][row-8];
- GD1[4]|=maohao[3][row-8];
- }
- }
- else
- Delayus(20);
- }
- }
- void Mode4567_RQ_G()
- {
- uchar row1,row2;
- row1=row+8; // 上1/2屏行掃描
- row2=row-8; // 下1/2屏行掃描
- if(row<8) //上1/2屏
- {
- // GD1[0]=(Num5[2][row]<<3)|(Num5[0][row]>>3);
- // GD1[1]=(Num5[0][row]<<5)|(Num5[nian1][row]>>1);
- // GD1[2]=(Num5[nian1][row]<<7)|(Num5[nian2][row]<<1);
- // GD1[3]=Num5[yue1][row];
- // GD1[4]=Num5[yue2][row]<<2;
- // GD1[5]=Num5[ri1][row]<<1;
- // GD1[6]=Num5[ri2][row]<<3;
- GD1[7]=Num8[week][row];
- if(row==3) //日期點
- {
- GD1[3]|=0xC0;
- GD1[4]|=0x01;
- GD1[5]|=0x80;
- }
- }
- else //下1/2/屏
- {
- GD1[0]=Num8[y1][row2]; //農歷日期
- GD1[1]=Num8[y2][row2];
- GD1[2]=Num8[11][row2];
- GD1[3]=NL8 [r1][row2];
- GD1[4]=Num8[r2][row2]>>1;
- GD1[5]=Num8[r2][row2]<<7 | Num5[t1][row2-1]>>2; //溫度
- GD1[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;
- GD1[7]=Num5[17][row2];
- // GD1[0]=(Num5[Light_R/100][row2]<<3)|(Num5[Light_R%100/10][row2]>>3);
- // GD1[1]=(Num5[Light_R%100/10][row2]<<5)|(Num5[Light_R%10][row2]>>1);
- // GD1[2]=(Num5[Light_R%10][row2]<<7);
- // GD1[3]=Num5[XSMOD/10][row2];
- // GD1[4]=Num5[XSMOD%10][row2]<<2;
- // GD1[5]=Num5[ADC_T/100][row2];
- // GD1[6]=Num5[ADC_T%100/10][row2];
- // GD1[7]=Num5[ADC_T%10][row2];
- // GD1[5]=Num5[TH0/100][row2];
- // GD1[6]=Num5[TH0%100/10][row2];
- // GD1[7]=Num5[TH0%10][row2];
- }
- }
- void Mode4567_RQ_R() //模式4567日期 紅數據
- {
- uchar row1,row2;
- row1=row+8; // 上1/2屏行掃描
- row2=row-8; // 下1/2屏行掃描
- if(row<8)
- {
- RD1[0]=(Num5[2][row]<<3)|(Num5[0][row]>>3);
- RD1[1]=(Num5[0][row]<<5)|(Num5[nian1][row]>>1);
- RD1[2]=(Num5[nian1][row]<<7)|(Num5[nian2][row]<<1);
- RD1[3]=Num5[yue1][row];
- RD1[4]=Num5[yue2][row]<<2;
- RD1[5]=Num5[ri1][row]<<1;
- RD1[6]=Num5[ri2][row]<<3;
- RD1[7]=Num8[week][row];
- }
- else
- {
- RD1[5]=Num5[t1][row2-1]>>2; //溫度
- RD1[6]=Num5[t2][row2-1] | Num5[t1][row2-1]<<6;
- // RD1[7]=Num5[17][row2];
- }
- }
- void Mode4_SJ_G()
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD2[2]|=maohao[0][row];
- GD2[6]|=maohao[1][row];
- }
- }
- void Mode4_SJ_R()
- {
- uchar row1,row2;
- // shi1=shi2=0;
- row1=(row-1)*2; // 上1/2屏行掃描
- row2=(row-1)*2+1; // 下1/2屏行掃描
- if(row)
- {
- if(shi1==0)
- {
- RD2[0]=0;
- RD2[1]=Num14B[shi2][row1]>>3;
- }
- else
- {
- RD2[0]=Num14B[shi1][row1]; //時
- RD2[1]=Num14B[shi1][row2] | Num14B[shi2][row1]>>3;
- }
- RD2[2]=Num14B[shi2][row1]<<5 | Num14B[shi2][row2]>>3;
- RD2[3]=Num14B[fen1][row1]>>2; // 分
- RD2[4]=Num14B[fen1][row1]<<6 | Num14B[fen1][row2]>>2 | Num14B[fen2][row1]>>5;
- RD2[5]=Num14B[fen2][row1]<<3 | Num14B[fen2][row2]>>5;
- RD2[6]=Num12[miao1][row-1]>>2; //秒
- RD2[7]=Num12[miao2][row-1]>>1 | Num12[miao1][row-1]<<6;
- if(GPS_POW)
- {
- RD2[2]|=maohao[0][row];
- RD2[6]|=maohao[1][row];
- }
- }
- if(PM)
- RD2[0]|=Num12[15][row];
- }
- void Mode5_SJ_G()
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD2[2]|=maohao[2][row];
- GD2[5]|=maohao[0][row];
- }
- }
- void Mode5_SJ_R()
- {
- uchar row1;
- row1=row-1; // 上1/2屏行掃描
- // row2=row-8; // 下1/2屏行掃描
- if(row)
- {
- if(shi1==0) RD2[0]=0; else
- RD2[0]=Num14[shi1][row1]; //時
- RD2[1]=Num14[shi2][row1]>>2;
- RD2[2]=Num14[shi2][row1]<<6;
- RD2[3]=Num14[fen1][row1]>>2; // 分
- RD2[4]=Num14[fen2][row1]>>4 | Num14[fen1][row1]<<6;
- RD2[5]=Num14[fen2][row1]<<4 ;
- RD2[6]=Num12[miao1][row1]>>1; //秒
- RD2[7]=Num12[miao2][row1];
- if(GPS_POW)
- {
- RD2[2]|=maohao[2][row];
- RD2[5]|=maohao[0][row];
- }
- }
-
- if(PM)
- RD2[0]|=Num12[15][row];
- }
- void Mode6_SJ_G()
- {
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD2[3]|=maohao[4][row];
- GD2[4]|=maohao[3][row];
- }
- }
- else
- Delayus(30);
- }
- void Mode6_SJ_R()
- {
- uchar row3,row4;
- if(row)
- {
- ////時間
- row3=(row-1)*2;
- row4=(row-1)*2+1;
- if(shi1==0) //
- RD2[0]=RD2[1]=0;
- else
- {
- RD2[0]=Num16B[shi1][row3]; //時
- RD2[1]=Num16B[shi1][row4];
- }
- RD2[2]=Num16B[shi2][row3]<<3 | Num16B[shi2][row4]>>5;
- RD2[3]=Num16B[shi2][row4]<<3; // 分
- RD2[4]=Num16B[fen1][row3]>>3;
- RD2[5]=Num16B[fen1][row4]>>3| Num16B[fen1][row3]<<5;
- RD2[6]=Num16B[fen2][row3]; //秒
- RD2[7]=Num16B[fen2][row4];
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- RD2[3]|=maohao[4][row];
- RD2[4]|=maohao[3][row];
- }
- }
- else
- {
- if(GPS_POW)
- {
- NOP4;
- NOP4;
- }
- }
- }
- if(PM)
- RD2[0]|=Num12[15][row];
- }
- void Mode7_SJ_G()
- {
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD2[3]|=maohao[4][row];
- GD2[4]|=maohao[3][row];
- }
- }
- else
- Delayus(30);
- }
- void Mode7_SJ_R()
- {
- uchar row3,row4;
- if(row)
- {
- ////時間
- row3=(row-1)*2;
- row4=(row-1)*2+1;
- if(shi1==0) //
- RD2[0]=RD2[1]=0;
- else
- {
- RD2[0]=Num16[shi1][row3]; //時
- RD2[1]=Num16[shi1][row4];
- }
- RD2[2]=Num16[shi2][row3]<<3 | Num16[shi2][row4]>>5;
- RD2[3]=Num16[shi2][row4]<<3; // 分
- RD2[4]=Num16[fen1][row3]>>3;
- RD2[5]=Num16[fen1][row4]>>3| Num16[fen1][row3]<<5;
- RD2[6]=Num16[fen2][row3]; //秒
- RD2[7]=Num16[fen2][row4];
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- RD2[3]|=maohao[4][row];
- RD2[4]|=maohao[3][row];
- }
- }
- else
- {
- if(GPS_POW)
- {
- NOP4;
- NOP4;
- }
- }
- }
- if(PM)
- RD2[0]|=Num12[15][row];
- }
- void Mode8_SJ_G()
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD1[2]|=maohao[0][row];
- GD1[6]|=maohao[1][row];
- }
- }
- void Mode8_SJ_R()
- {
- uchar row1,row2;
- // shi1=shi2=0;
- row1=(row)*2; // 上1/2屏行掃描
- row2=(row)*2+1; // 下1/2屏行掃描
- if(shi1==0)
- {
- RD1[0]=0;
- RD1[1]=Num14B[shi2][row1]>>3;
- }
- else
- {
- RD1[0]=Num14B[shi1][row1]; //時
- RD1[1]=Num14B[shi1][row2] | Num14B[shi2][row1]>>3;
- }
- RD1[2]=Num14B[shi2][row1]<<5 | Num14B[shi2][row2]>>3;
- RD1[3]=Num14B[fen1][row1]>>2; // 分
- RD1[4]=Num14B[fen1][row1]<<6 | Num14B[fen1][row2]>>2 | Num14B[fen2][row1]>>5;
- RD1[5]=Num14B[fen2][row1]<<3 | Num14B[fen2][row2]>>5;
- RD1[6]=Num12[miao1][row-1]>>2; //秒
- RD1[7]=Num12[miao2][row-1]>>1 | Num12[miao1][row-1]<<6;
- if(GPS_POW)
- {
- RD1[2]|=maohao[0][row];
- RD1[6]|=maohao[1][row];
- }
- if(PM)
- RD1[0]|=Num12[15][row];
- }
- void Mode9_SJ_R() //細體時間 有秒
- {
- if(!shi1) RD1[0]=0; else
- RD1[0]=Num14[shi1][row]; //時
- RD1[1]=Num14[shi2][row]>>2;
- RD1[2]=Num14[shi2][row]<<6;
- RD1[3]=Num14[fen1][row]>>2; // 分
- RD1[4]=Num14[fen2][row]>>4 | Num14[fen1][row]<<6;
- RD1[5]=Num14[fen2][row]<<4 ;
- RD1[6]=Num12[miao1][row]>>1; //秒
- RD1[7]=Num12[miao2][row]>>1;
- // RD1[6]=Num12[z/100][row]>>1; //秒
- // RD1[7]=Num12[z%100/10][row]>>1;
- if(PM)
- RD1[0]|=Num12[15][row];
- if(GPS_POW)
- {
- RD1[2]|=maohao[2][row];
- RD1[5]|=maohao[0][row];
- }
-
- }
- void Mode9_SJ_G()
- {
- if(GPS_POW)
- NOP;
- else
- {
- GD1[2]|=maohao[2][row];
- GD1[5]|=maohao[0][row];
- }
- }
- void Mode10_SJ_G()
- {
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD1[3]|=maohao[4][row];
- GD1[4]|=maohao[3][row];
- }
- }
- else
- Delayus(30);
- }
- void Mode10_SJ_R()
- {
- uchar row3,row4;
- ////時間
- row3=row*2;
- row4=row*2+1;
- if(shi1==0) //
- RD1[0]=RD1[1]=0;
- else
- {
- RD1[0]=Num16B[shi1][row3]; //時
- RD1[1]=Num16B[shi1][row4];
- }
- RD1[2]=Num16B[shi2][row3]<<3 | Num16B[shi2][row4]>>5;
- RD1[3]=Num16B[shi2][row4]<<3; // 分
- RD1[4]=Num16B[fen1][row3]>>3;
- RD1[5]=Num16B[fen1][row4]>>3| Num16B[fen1][row3]<<5;
- RD1[6]=Num16B[fen2][row3]; //秒
- RD1[7]=Num16B[fen2][row4];
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- RD1[3]|=maohao[4][row];
- RD1[4]|=maohao[3][row];
- }
- }
- else
- {
- if(GPS_POW)
- {
- NOP4;
- NOP4;
- }
- }
- if(PM)
- RD1[0]|=Num12[15][row];
- }
- void Mode11_SJ_G()
- {
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- NOP;
- }
- else
- {
- GD1[3]|=maohao[4][row];
- GD1[4]|=maohao[3][row];
- }
- }
- else
- Delayus(30);
- }
- void Mode11_SJ_R()
- {
- uchar row3,row4;
- ////時間
- row3=row*2;
- row4=row*2+1;
- if(shi1==0) //
- RD1[0]=RD1[1]=0;
- else
- {
- RD1[0]=Num16[shi1][row3]; //時
- RD1[1]=Num16[shi1][row4];
- }
- RD1[2]=Num16[shi2][row3]<<3 | Num16[shi2][row4]>>5;
- RD1[3]=Num16[shi2][row4]<<3; // 分
- RD1[4]=Num16[fen1][row3]>>3;
- RD1[5]=Num16[fen1][row4]>>3| Num16[fen1][row3]<<5;
- RD1[6]=Num16[fen2][row3]; //秒
- RD1[7]=Num16[fen2][row4];
- //秒點
- if(SHAN)
- {
- if(GPS_POW)
- {
- RD1[3]|=maohao[4][row];
- RD1[4]|=maohao[3][row];
- }
- }
- else
- {
- if(GPS_POW)
- {
- NOP4;
- NOP4;
- }
- }
- if(PM)
- RD1[0]|=Num12[15][row];
- }
- void Mode8_RQ_G()
- {
- uchar row1=row*2;
- uchar row2=row*2+1;
- if(!yue1) GD1[0]=0; else
- GD2[0]=Num13[yue1][row]; //月十位
- GD2[1]=Num13[yue2][row]; //月各位
- GD2[2]=HZ[19][row1]; //漢字月
- GD2[3]=HZ[19][row2] ;
- GD2[4]=Num13[ri1][row]; //日十位
- GD2[5]=Num13[ri2][row]; //日個位
- GD2[6]=HZ[20][row1]; //漢字日
- GD2[7]=HZ[20][row2];
- }
- void Mode8_NL_G() //農歷顯示
- {
- uchar row1=row*2;
- uchar row2=row*2+1;
- GD2[0]=HZ[NL_yue][row1]; //月十位
- GD2[1]=HZ[NL_yue][row2];
- GD2[2]=HZ[14][row1]; //月
- GD2[3]=HZ[14][row2]; //日個位
- GD2[4]=NLday[r1][row1];
- GD2[5]=NLday[r1][row2]; //日十位
- GD2[6]=HZ[r2][row1];
- GD2[7]=HZ[r2][row2];
- }
- void Mode8_XQ_G()
- {
- uchar row1=row*2;
- uchar row2=row*2+1;
- GD2[0]=HZ[13][row1];
- GD2[1]=HZ[13][row2];
- GD2[2]=HZ[week][row1];
- GD2[3]=HZ[week][row2];
- GD2[4]=Num13[t1][row]>>5;
- GD2[5]=Num13[t1][row]<<3 | Num13[t2][row]>>6;
- GD2[6]=Num13[t2][row]<<2 ;
- GD2[7]=Num12[10][row];
- }
- void Mode8_XQ_R()
- {
- RD2[4]=Num13[t1][row]>>5;
- RD2[5]=Num13[t1][row]<<3 | Num13[t2][row]>>6;
- RD2[6]=Num13[t2][row]<<2 ;
- }
- void ModeSleep_R()
- {
- if(PM)
- RD1[1]|=Num12[15][row];
- if(shi1)
- RD1[2]=Num9[shi1][row];
- RD1[3]=Num9[shi2][row];
- if(SHAN)
- RD1[4]=Num9[10][row];
- RD1[5]=Num9[fen1][row];
- RD1[6]=Num9[fen2][row];
- RD2[3]=Num9[t1][row];
- RD2[4]=Num9[t2][row];
- RD2[5]=Num12[10][row]>>4;
- RD2[6]=Num12[10][row]<<4;
-
- }
- void UartInit(void) //9600bps@24.576MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位數據,可變波特率
- AUXR |= 0x04; //獨立波特率發(fā)生器時鐘為Fosc,即1T
- BRT = BRT_INT; //設定獨立波特率發(fā)生器重裝值
- AUXR |= 0x01; //串口1選擇獨立波特率發(fā)生器為波特率發(fā)生器
- AUXR |= 0x10; //啟動獨立波特率發(fā)生器
- }
- void LoadData_G()
- {
- switch (Set_S)
- {
- case 0:
- if (POW_OK)
- {
- switch (XSMOD)
- {
- case 0:
- Mode0123_RQ_G();
- Mode0_SJ_G();
- break;
- case 1:
- Mode0123_RQ_G();
- Mode1_SJ_G();
- break;
- case 2:
- Mode0123_RQ_G();
- Mode2_SJ_G();
- break;
- case 3:
- Mode0123_RQ_G();
- Mode3_SJ_G();
- break;
- case 4:
- Mode4567_RQ_G();
- Mode4_SJ_G();
- break;
- case 5:
- Mode4567_RQ_G();
- Mode5_SJ_G();
- break;
- case 6:
- Mode4567_RQ_G();
- Mode6_SJ_G();
- break;
- case 7:
- Mode4567_RQ_G();
- Mode7_SJ_G();
- break;
- case 8:
- Mode8_SJ_G();
- if (miao2<3)
- Mode8_RQ_G();
- else
- if (miao2<6)
- Mode8_NL_G();
- else
- Mode8_XQ_G();
- break;
- case 9:
- Mode9_SJ_G();
- if (miao2<3)
- Mode8_RQ_G();
- else
- if (miao2<6)
- Mode8_NL_G();
- else
- Mode8_XQ_G();
- break;
- case 10:
- Mode10_SJ_G();
- if (miao2<3)
- Mode8_RQ_G();
- else
- if (miao2<6)
- Mode8_NL_G();
- else
- Mode8_XQ_G();
- break;
- case 11:
- Mode11_SJ_G();
- if (miao2<3)
- Mode8_RQ_G();
- else
- if (miao2<6)
- Mode8_NL_G();
- else
- Mode8_XQ_G();
- break;
- }
- }
- else
- Delay(60);
- break;
- case 1: SetNian_G(); break;
- case 2: SetYue_G(); break;
- case 3: SetRi_G(); break;
- case 4: SetShi_G(); break;
- case 5: SetFen_G(); break;
- case 6: SetMiao_G(); break;
- case 7: SetLiangdu_G(); break;;
- case 8: SetMinLiangdu_G(); break;
- case 9: SetLiangduG_G(); break;
- case 10: NTCbuchang_G(); break;
- case 11: Yaokong_G(); break;
- case 12:
- case 13:
- case 14:
- case 15: Xuexi_G(); break;
- }
- }
- void LoadData_R()
- {
- switch (Set_S)
- {
- case 0:
- if (POW_OK)
- {
- switch (XSMOD)
- {
- case 0:
- Mode0123_RQ_R();
- Mode0_SJ_R();
- break;
- case 1:
- Mode0123_RQ_R();
- Mode1_SJ_R();
- break;
- case 2:
- Mode0123_RQ_R();
- Mode2_SJ_R();
- break;
- case 3:
- Mode0123_RQ_R();
- Mode3_SJ_R();
- break;
- case 4:
- Mode4567_RQ_R();
- Mode4_SJ_R();
- break;
- case 5:
- Mode4567_RQ_R();
- Mode5_SJ_R();
- break;
- case 6:
- Mode4567_RQ_R();
- Mode6_SJ_R();
- break;
- case 7:
- Mode4567_RQ_R();
- Mode7_SJ_R();
- break;
- case 8:
- Mode8_SJ_R();
- if (miao2>5)
- Mode8_XQ_R();
- break;
- case 9:
- Mode9_SJ_R();
- if (miao2>5)
- Mode8_XQ_R();
- break;
- case 10:
- Mode10_SJ_R();
- if (miao2>5)
- Mode8_XQ_R();
- break;
- case 11:
- Mode11_SJ_R();
- if (miao2>5)
- Mode8_XQ_R();
- break;
-
- }
- }
- else
- ModeSleep_R();
- break;
- case 1: SetNian_R(); break;
- case 2: SetYue_R(); break;
- case 3: SetRi_R(); break;
- case 4: SetShi_R(); break;
- case 5: SetFen_R(); break;
- case 6: SetMiao_R(); break;
- case 7: SetLiangdu_R(); break;
- case 8: SetMinLiangdu_R(); break;
- case 9: SetLiangduG_R(); break;
- case 10: NTCbuchang_R(); break;
- case 11: Yaokong_R(); break;
- case 12:
- case 13:
- case 14:
- case 15: Xuexi_R(); break;
- }
- }
- void SendData_G()
- {
- uchar i,j;
- for(i=0;i<8;i++) //掃描1行
- {
- #ifdef DATAHI
- R1=0;
- R2=0;
- for(j=0;j<8;j++) //發(fā)送1個數據
- {
-
- GD1[i]<<=1; //數據左移1
- G1=CY; //發(fā)送最高位,
- GD2[i]<<=1;
- G2=CY; //由于數據是低電平有效,所以進行取反
- CK=0; //時鐘下降
- NOP4;
- CK=1; //時鐘上升
- }
- #else
- R1=1;
- R2=1;
- for(j=0;j<8;j++)
- {
- GD1[i]<<=1; //數據左移1
- G1=!CY; //發(fā)送最高位,
- GD2[i]<<=1;
- G2=!CY; //由于數據是低電平有效,所以進行取反
- CK=0; //時鐘下降
- NOP4;
- CK=1; //時鐘上升
- }
- #endif
-
- }
- ABCD=row; //行選
- LS=0;
- NOP4;
- LS=1; //鎖存上升,顯示輸出
- EN_ON(); //顯示開
- TH0=Light_G;
- TL0=Light_L;
- TR0=1;
- }
- void SendData_R()
- {
- uchar i,j;
-
- for(i=0;i<8;i++) //掃描1行
- {
- #ifdef DATAHI
- G1=0;
- G2=0;
- for(j=0;j<8;j++) //發(fā)送1個數據
- {
-
- RD1[i]<<=1; //數據左移1
- R1=CY; //發(fā)送最高位,
- RD2[i]<<=1;
- R2=CY; //由于數據是低電平有效,所以進行取反
- CK=0; //時鐘下降
- NOP4;
- CK=1; //時鐘上升
- }
- #else
- G1=1;
- G2=1;
- for(j=0;j<8;j++)
- {
- RD1[i]<<=1; //數據左移1
- R1=!CY; //發(fā)送最高位,
- RD2[i]<<=1;
- R2=!CY; //由于數據是低電平有效,所以進行取反
- CK=0; //時鐘下降
- NOP4;
- CK=1; //時鐘上升
- }
- #endif
- }
- ABCD=row; //行選
- LS=0;
- NOP4;
- LS=1; //鎖存上升,顯示輸出
- EN_ON(); //顯示開
- // Delay(80);
- TH0=Light_R;
- TL0=Light_L;
- TR0=1;
- // EN_OFF(); //顯示關
- // Delay(1);
- }
- void Err3231()
- {
-
- for(row=0;row<16;row++)
- {
- RD1[0]=ZMlogo[10][row];
- RD1[1]=ZMlogo[2][row];
- RD1[2]=Num12[3][row];
- RD1[3]=Num12[2][row];
- RD1[4]=Num12[3][row];
- RD1[5]=Num12[1][row];
- // RD1[6]=Num12[1][row];
-
- RD2[0]=HZ[44][row*2];
- RD2[1]=HZ[44][row*2+1];
- RD2[2]=HZ[45][row*2];
- RD2[3]=HZ[45][row*2+1];
- RD2[4]=HZ[46][row*2];
- RD2[5]=HZ[46][row*2+1];
- RD2[6]=HZ[47][row*2];
- RD2[7]=HZ[47][row*2+1];
-
- SendData_G();
- SendData_R();
- }
-
- }
- void xianshi()
- {
- // uchar i,j;
- for(row=0;row<16;row++) //掃描16行
- {
- LoadData_G();
- SendData_G();
- LoadData_R();
- SendData_R();
- }
- }
- void TIM0() interrupt 1
- {
- // z++;
- EN_OFF();
- TR0=0;
- TL0=60;
- }
- void SetTime(uchar address, char min, char max)
- {
- char item;
-
- item=read_random(address);
- item=item/16*10+item%16;
- if (K_ADD)
- item++;
- else
- item--;
- if (item>max)
- item=min;
- if (item<min)
- item=max;
- ModifyTime(address,item/10*16+item%10);// 寫入DS3231
- GetAllTime();
- }
- void IR_ICON()
- {
- if(IR_date[6])
- {
- if(Set_S<12)
- {
- if(IR_date[0]==IR_Key[0])
- {
- if(IR_date[6]==IR_Key[1])
- {
- K_SET=1;
- IR_date[4]=0;
- }
- if(IR_date[6]==IR_Key[2])
- {
- K_ADD=1;
- IR_date[4]=3;
- }
- if(IR_date[6]==IR_Key[3])
- {
- K_DEC=1;
- IR_date[4]=3;
- }
- if(IR_date[6]==IR_Key[4])
- {
- K_ESC=1;
- IR_date[4]=0;
- }
- }
-
-
- // switch(IR_date[6])
- // {
- // case IR_Key[1]: K_SET=1; IR_date[4]=0; break;
- // case IR_Key[2]: K_ADD=1; IR_date[4]=3; break;
- // case IR_Key[3]: K_DEC=1; IR_date[4]=3; break;
- // case IR_Key[4]: K_ESC=1; IR_date[4]=0; break;
- //
- // default : break;
- // }
- }
- else
- {
- if(!xuexi_OK)
- {
- switch(Set_S)
- {
- case 12:
- IR_Key[0]=IR_date[0];
- IR_Key[1]=IR_date[6];
- // IR_date[4]=0;
- Write_EEP();
- xuexi_OK=1;
- break;
- case 13:
- IR_Key[2]=IR_date[6];
- // IR_date[4]=0;
- Write_EEP();
- xuexi_OK=1;
- break;
- case 14:
- IR_Key[3]=IR_date[6];
- // IR_date[4]=0;
- Write_EEP();
- xuexi_OK=1;
- break;
- case 15:
- IR_Key[4]=IR_date[6];
- // IR_date[4]=0;
- Write_EEP();
- xuexi_OK=1;
- break;
-
- default: break;
-
- }
- }
- }
- IR_date[6]=0;
- }
- }
- void KeyScan() //*按鍵掃描 */
- {
- static bit KeySet_S,KeyAdd_S,KeyDec_S,KeyEsc_S; //相應按鍵按下狀態(tài)指示
- static uint idata Keyout;
- if(KeySet)
- KeySet_S=1; //
- if(!KeySet&&KeySet_S)
- {
- xianshi();
- if(!KeySet)
- {
- K_SET=1;
- KeySet_S=0;
- Keyout=0;
- }
- }
-
- if(KeyAdd) //+按鍵,
- KeyAdd_S=1;
- if(!KeyAdd&&KeyAdd_S)
- {
- xianshi();
- if(!KeyAdd)
- {
- K_ADD=1; //加鍵按下后,+=1
- KeyAdd_S=0;
- Keyout=0;
- }
- }
-
- if(KeyEsc) //Esc按鍵,
- KeyEsc_S=1;
- if(!KeyEsc&&KeyEsc_S)
- {
- xianshi();
- if(!KeyEsc)
- {
- K_ESC=1; //加鍵按下后,+=1
- KeyEsc_S=0;
- Keyout=0;
- }
- }
-
- if(KeyDec)
- KeyDec_S=1; //-按鍵,
- if(!KeyDec&&KeyDec_S)
- {
- xianshi();
- if(!KeyDec)
- {
- K_DEC=1; //減鍵按下后,-鍵=1
- KeyDec_S=0;
- Keyout=0;
- }
- }
-
- IR_ICON();
-
- if(K_SET)
- {
- Set_S++; //S鍵按下后,
- if(Set_S>Set_Max)
- Set_S=0;
- K_SET=0;
- xuexi_OK=0;
- }
-
- if(Set_S)
- {
- Keyout++;
- if(Keyout>10000) //1分后退出調整狀態(tài)
- Keyout=0,Set_S=0;
- }
-
- if(K_ADD&&K_DEC)
- {
- NOP;
- }
- if(K_ADD | K_DEC)
- {
- switch(Set_S)
- {
- case 0:
- if(K_ADD)
- {
- XSMOD++;
- if(XSMOD>XSMOD_Max)
- XSMOD=0;
- EEprom_WritePara(0x0000,XSMOD); //顯示模式寫入EEROM的0x0000單元
- }
- else
- {
- Zhi_12=!Zhi_12;
- EEprom_WritePara(0x0001,Zhi_12);//上下午標志寫入EEROM 0x0001單元
- GetAllTime();
- }
- break;
- case 1: SetTime(DS3231_YEAR, 15, 79); break; //年
- case 2: SetTime(DS3231_MONTH, 1, 12); break; //月
- case 3: SetTime(DS3231_DAY, 1, 31); break; //日
- case 4: SetTime(DS3231_HOUR, 0, 23); break; //時
- case 5: SetTime(DS3231_MINUTE, 0, 59); break; //分
- case 6: SetTime(DS3231_SECOND, 0, 59); break; //秒
- case 7:
- if(K_ADD) Liangdu++; else Liangdu--;
- if(Liangdu>Liangdu_Max) Liangdu=0;
- if(Liangdu<0) Liangdu=Liangdu_Max;
- EEprom_WritePara(0x0002,Liangdu); //亮度寫入 EEROM的0x02
- break;
- case 8:
- if(K_ADD) Min_Liangdu++; else Min_Liangdu--;
- if(Min_Liangdu>Min_Liangdu_Max) Min_Liangdu=0;
- if(Min_Liangdu<0) Min_Liangdu=Min_Liangdu_Max;
- EEprom_WritePara(0x0003,Min_Liangdu); //最小亮度寫入0x03
- break;
- case 9:
- if(K_ADD) Liangdu_G++; else Liangdu_G--;
- if(Liangdu_G>Liangdu_G_Max) Liangdu_G=0;
- if(Liangdu_G<0) Liangdu_G=Liangdu_G_Max;
- EEprom_WritePara(0x0004,Liangdu_G); //綠補寫入0x04
- break;
- case 10:
- if(K_ADD) NTC_buchang++; else NTC_buchang--;
- if(NTC_buchang>19) NTC_buchang=19;
- if(NTC_buchang<1) NTC_buchang=1;
- EEprom_WritePara(0x0005,NTC_buchang); //NTC補償寫入0x05
- break;
- case 11:
- IR_POW=!IR_POW;
- EEprom_WritePara(0x0006,IR_POW); // 紅外開關寫入0x05
-
- default : break;
- }
- K_ADD=0;
- K_DEC=0;
- }
- if(K_ESC)
- {
- Set_S=0;
- K_ESC=0;
- }
-
- }
- void main()
- {
- uchar idata count;
- uchar idata a,b;
-
- P0M1=0x00; //以下為接LED點陣屏設為強推,適應有下拉或上拉電阻輸入的屏,改引腳連接要先設引腳輸出模式
- P0M0=0xff;
- P2M1=0x00;
- P2M0=0xe0;
-
- P3M0=0x10; //0001 0000 P34推挽做紅外接收電源
- P1M1=0x18; //P13,P14高阻模式 ,0001 1000
- P1ASF=0x18; //P13,P14做ADC輸入
- ADC_CONTR=0x80; //開啟ADC電源
- UartInit(); //串口初始化
- TMOD=0x11; //16bit
- AUXR |= 0x80; // T0/ 1T
- EA=1;
- ES=1; PS=1;
- ET0=1;
- EADC=1; //開啟ADC中斷
- IT1=1; //int1下降沿觸發(fā)
- EX1=1;
- ET1=1;
- TR1=1;
-
- if(DS18B20_TEST())
- {
- Delay(10);
- if(DS18B20_TEST())
- NTC=1;
- else
- NTC=0;
- }
- else
- NTC=0;
- ADCL=1;
- ADC_CONTR=0xcb; //進行亮度AD轉換
- if(NTC)
- {
- while(ADCL);
- ADCT=1;
- ADC_CONTR=0xcc; //進行溫度
- }
- else
- Read18B20();
- GPS_POW=0;
- WDT_CONTR=0x34; //啟動看門狗,16分頻,約1s多
- DS3231_Initial(); //根據DS3231狀態(tài)是否進行初始化
-
- ShowLogo();
- ADCL=1;
- ADC_CONTR=0xcb; //進行亮度AD轉換
- if(NTC)
- {
- while(ADCL);
- ADCT=1;
- ADC_CONTR=0xcc; //進行溫度
- }
- else
- Read18B20();
- while(read_random(DS3231_A2D) !=1) //如DS3231鬧鈴2的日期位標志不是原來的1,初始化。
- {
- Err3231();
- WDT_CONTR=0x34;
- }
- POW_OK=1;
- XSMOD=EEprom_ReadPara(0x0000);//從EEROM中讀顯示模式
- Zhi_12=EEprom_ReadPara(0x0001);//讀AM ,PM標志
- Liangdu=EEprom_ReadPara(0x0002);//讀亮度數據
- Min_Liangdu=EEprom_ReadPara(0x0003);//讀最低亮度數據
- Liangdu_G=EEprom_ReadPara(0x0004);//讀綠補數據
- NTC_buchang=EEprom_ReadPara(0x0005);//讀NTC溫度補償數據。
- IR_POW=EEprom_ReadPara(0x0006);//讀紅外開關數據
- if(XSMOD>XSMOD_Max) XSMOD=0;
-
- Read_EEP(); //從單片機EEROM中讀紅外鍵位數據
- GetAllTime(); //讀取全部時間,并進行農歷運算
-
- while(1)
- {
- count++;
- if(count>25) //這個常數值根據晶振頻率調整,使秒點閃1HZ
- {
- count=0;
- a++;
- ADCL=1;
- ADC_CONTR=0xcb; //進行亮度AD轉換
- WDT_CONTR|=0x10; //喂狗
- GetTime(); //讀取時間
- if(a>1)
- {
- a=0;
- b++;
- SHAN2=!SHAN2;
- if(b>1)
- {
- b=0;
- SHAN=!SHAN;
- if(NTC)
- {
- while(ADCL);
- ADCT=1;
- ADC_CONTR=0xcc; //進行溫度
- }
- else
- Read18B20();
- }
- }
- }
-
- // if(RX_over&&DW_OK) //接收完一幀數據并且收到定位成功信息后進行數據處理,定位后的時間肯定是準確的
- if(RX_over && (RQ[4]>0x30 & RQ[4]<0x39) ) //如果信號較差能收到時間卻沒有定位可以用這句降低處理條件
- GPSdata();
- // if(shi1==0&&shi2==1&&fen1==0&&fen2==0) //1點同步時間
- // {
- // ES_ON; //打開獨立波特率發(fā)生器 ]
- // GPS_POW=0; //打開GPS電源
- // }
- KeyScan();
- xianshi();
- }
- }
- void int1() interrupt 2 using 3
- {
- static uchar a,b;
- uchar temp;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
無標題.png (94.69 KB, 下載次數: 82)
下載附件
2019-5-6 04:31 上傳
所有資料51hei提供下載:
3264_DS3231_搖控_GPS時鐘-12-1.rar
(354.96 KB, 下載次數: 331)
2019-5-6 03:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|