|
16*64LED點(diǎn)陣翻頁(yè)時(shí)鐘制作資料分享給大家,移動(dòng)顯示+翻頁(yè)顯示,帶農(nóng)歷、溫度,附件里有完整的源文件+仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源碼:
- /***********************************************************
- 名稱: 16*64點(diǎn)陣
- MCU: STC89C52
- 晶振: 22.1184M
- 時(shí)間:
- 外部器件: 16*64點(diǎn)陣,ds1302
- 接線: 見(jiàn)DS1302.h,DS18B20.h和本主文件
-
- ***********************************************************/
- #include <REGX52.H>
- #include "DS1302.h"
- #include "DS18B20.h"
- #include "nongli.h"
- #include "zimo.h"
- #define H_PORT P0 //ABCD P1
- sbit RData = P2^0; //RData=P2^0,GData=P2^1
- sbit GData = P2^1;
- sbit L_CLK = P2^2;
- sbit L_STB = P2^3;
- sbit R_OE = P2^4; //R EN=P2^4,G EN=P2^5
- sbit G_OE = P2^5;
- //sbit Data=P2^1; //RData=P2^0,GData=P2^1
- //sbit OE=P2^6; //R EN=P2^5,G EN=P2^6
-
- sbit key_add=P3^1;
- sbit key_dec=P3^2;
- sbit key_adj=P3^0;
- sbit key_esc=P3^3;
- /*
- //自己的家里的接線
- sbit H_CLK = P2^5;
- sbit H_D = P2^4;
- sbit L_CLK = P2^0; **
- sbit L_D = P2^2; **
- sbit L_STB = P2^1; **
- sbit L_OE = P2^6; **
- sbit key_add= P3^7;
- sbit key_dec= P3^5;
- sbit key_adj= P3^6;
- sbit key_esc= P3^4; */
- #define FESTIVAL_MAX 9 //定義農(nóng)歷節(jié)日數(shù)
- #define KEY_VAL 5 //定義按鍵手感
- /*#define DISP_EN()
- {
- R_OE=1 //4094高電平輸出使能
- G_OE=1
- }
- #define DISP_DIS()
- {
- R_OE=0;
- G_OE=0;
- } */
- SYSTEMTIME CurrentTime;
- unsigned char status=0; //按鍵狀態(tài)
- unsigned char disp_mode=0; //顯示狀態(tài)
- unsigned char offset=0; //移動(dòng)顯示用的變量
- unsigned char disrow=0; //當(dāng)前掃描行
- unsigned char k=0; //往buff中填的字
- unsigned int t_counter=0,stop_counter=0,stop_time=0;
- unsigned char f1=18,f2=18,f3=18,f4=18,f5=18,f6=18; //18就不會(huì)出現(xiàn)剛開(kāi)始全部翻頁(yè)的情況了.
- bit switch_flag=0,stop_bit=0;
- bit one_sec_flag=0,half_sec_flag;
- bit nongli_flag=0,nongli_change_flag=0,festival_flag=0;
- unsigned char T_int,T_dec; //計(jì)算溫度用
- unsigned char temp_time[6]; //翻頁(yè)鐘用到
- unsigned char festival_num; //節(jié)日計(jì)數(shù)
- bit add_flag=0;
- bit dec_flag=0;
- bit adj_flag=0;
- bit esc_flag=0;
- unsigned char ka=0,kb=0,kc=0,kd=0; //按鍵用
- unsigned char alarm_hour,alarm_min;
- bit alarm_enable=0,alarm_flag=0;
- unsigned char code mode[4]={0,1,7,8}; //幾種顯示模式的排列,依次為
- //0:流動(dòng)顯示年月日+固定一段時(shí)間翻頁(yè)鐘
- //1:翻頁(yè)鐘
- //7:全部流動(dòng)顯示
- //8:溫度
- unsigned char date[53]=
- {
- 10,10,10,10,10,10,10,10, //開(kāi)頭8個(gè)空格
- 2,0, //21世紀(jì)
- 0,9, //年數(shù)據(jù) No.10,11
- 49,50, //“年”
- 0,1, //月數(shù)據(jù) No.14,15
- 51,52, //“月”
- 0,1, //日數(shù)據(jù) No.18,19
- 53,54, //“日”
-
- 10, //空格
-
- 55,56,57,58, //“星期”
- 25,26, //星期幾 No.27,28
-
- 10, //空格
-
- 0,0, //小時(shí)數(shù)據(jù) No.30,31
- 11, // : No.32
- 0,0, //分鐘數(shù)據(jù) No.33,34
- 11, // : No.35
- 0,0, //秒數(shù)據(jù) No.36,37
-
- 10, //空格
-
- 10,10,12,10,13,14, //溫度 No.39,40,42
-
- 10,10,10,10,10,10,10,10, //MAX No.52
- };
- unsigned char code moon_date[48]=
- {
- 10,10,10,10,10,10,10,10, //開(kāi)頭8個(gè)空格
- 10,10, //No.8,9
- 10,10, //No.10,11
- 49,50, //“年”
- 10,10, //No.14,15
- 10,10, //No.16,17
- 51,52, //“月”
- 10,10, //No.20,21
- 10,10, //No.22,23
- 10,10,10,10,10,10,10,10, //開(kāi)頭8個(gè)空格
- 10,10,10,10,10,10,10,10, //開(kāi)頭8個(gè)空格
- 10,10,10,10,10,10,10,10, //開(kāi)頭8個(gè)空格
- };
- unsigned char code init_date[]=
- {
- 10,10,10,10,10,10,10,10, //開(kāi)頭8個(gè)空格
- 2,0, //21世紀(jì)
- 0,9, //年數(shù)據(jù) No.10,11
- 49,50, //“年”
- 0,1, //月數(shù)據(jù) No.14,15
- 51,52, //“月”
- 0,1, //日數(shù)據(jù) No.18,19
- 53,54, //“日”
-
- 10, //空格
-
- 55,56,57,58, //“星期”
- 25,26, //星期幾 No.27,28
-
- 10, //空格
-
- 0,0, //小時(shí)數(shù)據(jù) No.30,31
- 11, // : No.32
- 0,0, //分鐘數(shù)據(jù) No.33,34
- 11, // : No.35
- 0,0, //秒數(shù)據(jù) No.36,37
-
- 10, //空格
-
- 10,10,12,10,13,14, //溫度 No.39,40,42
-
- 10,10,10,10,10,10,10,10, //MAX No.52
- };
- unsigned char code week_data[]={00,25,27,29,31,33,35,53}; //一二三四五六日
- unsigned char code moon_data1[]={45,43,47,29}; //初十廿三
- unsigned char code festival_table[][2]=
- {
- {1,1}, //0 春節(jié)
- {1,15}, //1 元宵
- {44,44}, //2 清明 陽(yáng)歷的難以確定
- {5,5}, //3 端午
- {7,15}, //4 中元
- {8,15}, //5 中秋
- {9,9}, //6 重陽(yáng)
- {11,7}, //7 冬至
- {12,30}, //8 除夕
- };
- unsigned char code qingming_table[6]=
- {
- 0x77, //2000~2007
- 0x33, //2008~2015
- 0x33, //2016~2023
- 0x33, //2024~2031
- 0x33, //2032~2039
- 0x33, //2040~2047
- };
- /*-----------線性排布,不需查表---------
- unsigned char code festival_data[]=
- {
- }
- -------------------------------------*/
- void delay_nms(unsigned int count);
- void set_row(unsigned char row);
- void sendRbyte(unsigned char wdata);
- void sendR2byte(unsigned char wdata,unsigned char n);
- void Timer_init(void);
- void time_to_buff(void);
- void time_to_buff_all(void);
- void update_buff(void);
- void key_scan(void);
- void display(unsigned char mode);
- void get_temp(void);
- void shutter_clock(void);
- void festival_check(void);
- void alarm_check(void);
- void alarm(void);
- void main(void)
- {
- Initial_DS1302();
- time_to_buff_all();
-
- Timer_init();
-
- while(1)
- {
- update_buff();
-
- for(disrow=0;disrow<16;disrow++) //disrow,當(dāng)前掃描的行
- {
- L_STB=0;
- set_row(disrow); //行595的輸出.依次點(diǎn)亮1~16行.
- display(disp_mode);
- L_STB=0;
- L_STB=1;
- R_OE=0; //列595輸出
- G_OE=0;
- delay_nms(1); //此處延時(shí),請(qǐng)根據(jù)點(diǎn)陣閃爍狀況加以調(diào)整,仿真時(shí)候無(wú)法仿真閃爍.這里延時(shí)可以調(diào)流動(dòng)速度
- R_OE=1;
- G_OE=1;
- /************************************************* 原始代碼********************************************************/
- /* display(disp_mode);
- DISP_DIS();
- set_row(disrow); //行4094的輸出.依次點(diǎn)亮1~16行.
- L_STB=1;
- DISP_EN();
- delay_nms(1); //此處延時(shí),請(qǐng)根據(jù)點(diǎn)陣閃爍狀況加以調(diào)整,仿真時(shí)候無(wú)法仿真閃爍.
- /***************************************************** 原始代碼**************************************************/
- }
- if(stop_counter>stop_time)
- {
- disp_mode=0;
- offset++;
- stop_counter=0;
- stop_bit=0;
- }
- if(stop_bit==0) offset++;
- if(disp_mode==1)
- {
- if(f1<200) f1++;
- if(f2<200) f2++;
- if(f3<200) f3++;
- if(f4<200) f4++;
- if(f5<200) f5++;
- if(f6<200) f6++;
- }
- if(nongli_flag==0) key_scan(); //顯示農(nóng)歷時(shí)調(diào)整會(huì)出現(xiàn)錯(cuò)誤,圖省力屏蔽了
- }
- }
- void Timer_init(void) //12.5ms中斷一次
- {
- EA=0;
- ET0=1; //開(kāi)定時(shí)器中斷
- TMOD=0x01; //定時(shí)器0模式1
- TH0=(65536-50000)/256; //22.1184M晶振用這個(gè)
- TL0=(65536-50000)%256;
- //TH0=(65536-46080)/256;
- //TL0=(65536-46080)%256;
- TR0=1; //開(kāi)定時(shí)器運(yùn)行
- EA=1;
- }
- void T0_ISP(void) interrupt 1 using 3 //定時(shí)器中斷
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- //TH0=(65536-46080)/256; //22.1184M晶振用這個(gè)
- //TL0=(65536-46080)%256;
- t_counter++;
- if(t_counter==20) half_sec_flag=1;
- if(t_counter==40) {t_counter=0;one_sec_flag=1;}
- if(stop_bit==1) stop_counter++;
-
- if(ka!=0)
- {
- ka--;
- if(ka==0 && key_add==0) add_flag=1;
- }
- else if(key_add==0)ka=KEY_VAL;
-
- if(kb!=0)
- {
- kb--;
- if(kb==0 && key_dec==0) dec_flag=1;
- }
- else if(key_dec==0)kb=KEY_VAL;
-
- if(kc!=0)
- {
- kc--;
- if(kc==0 && key_adj==0) adj_flag=1;
- }
- else if(key_adj==0)kc=KEY_VAL;
-
- if(kd!=0)
- {
- kd--;
- if(kd==0 && key_esc==0) esc_flag=1;
- }
- else if(key_esc==0)kd=KEY_VAL;
- }
- void update_buff(void)
- {
- unsigned char i;
- if(nongli_change_flag==1)
- {
- if(nongli_flag==1)
- {
- for(i=0;i<46;i++)
- date[i]=moon_date[i];
-
- DS1302_GetTime_ALL(&CurrentTime);
- nongliCONV();
-
- date[8]= (CurrentTime.Year+100-84)%10*2+59; //從"甲"開(kāi)始
- date[9]= (CurrentTime.Year+100-84)%10*2+60;
- date[10]=(CurrentTime.Year+100-84)%12*2+79; //從"子"開(kāi)始
- date[11]=(CurrentTime.Year+100-84)%12*2+80;
-
- if(CurrentTime.Month<11) //不顯示為“零一月”
- {
- if(CurrentTime.Month==1)
- {
- date[14]=108; //"正"
- date[15]=109;
- }
- else if(CurrentTime.Month==10)
- {
- date[14]=43; //"十"
- date[15]=44;
- }
- else
- {
- date[14]=CurrentTime.Month%10*2+23; //月個(gè)位
- date[15]=CurrentTime.Month%10*2+24; //
- }
- date[16]=51;
- date[17]=52; //"月"
-
- switch(CurrentTime.Day)
- {
- case 10:
- date[18]=45; //"初"
- date[19]=46;
- date[20]=43; //"十"
- date[21]=44;
- break;
-
- case 20:
- date[18]=27; //"二"
- date[19]=28;
- date[20]=43; //"十"
- date[21]=44;
- break;
-
- case 30:
- date[18]=29; //"三"
- date[19]=30;
- date[20]=43; //"十"
- date[21]=44;
- break;
-
- default:
- date[18]=moon_data1[CurrentTime.Day/10]; //日十位
- date[19]=moon_data1[CurrentTime.Day/10]+1; //
- date[20]=CurrentTime.Day%10*2+23; //日個(gè)位
- date[21]=CurrentTime.Day%10*2+24; //
- break;
- }
- date[22]=10;
- date[23]=10;
- }
- else
- {
- date[14]=43; //"十"
- date[15]=44; //
- date[16]=CurrentTime.Month%10*2+23; //月個(gè)位
- date[17]=CurrentTime.Month%10*2+24; //
- switch(CurrentTime.Day)
- {
- case 10:
- date[20]=45; //"初"
- date[21]=46;
- date[22]=43; //"十"
- date[23]=44;
- break;
-
- case 20:
- date[20]=27; //"二"
- date[21]=28;
- date[22]=43; //"十"
- date[23]=44;
- break;
-
- case 30:
- date[20]=29; //"三"
- date[21]=30;
- date[22]=43; //"十"
- date[23]=44;
- break;
-
- default:
- date[20]=moon_data1[CurrentTime.Day/10]; //日十位
- date[21]=moon_data1[CurrentTime.Day/10]+1; //
- date[22]=CurrentTime.Day%10*2+23; //日個(gè)位
- date[23]=CurrentTime.Day%10*2+24; //
- break;
- }
- }
- if(festival_flag==1)
- {
- for(i=0;i<4;i++)
- {
- date[26+i]=110+4*festival_num+i;
- }
- }
- nongli_change_flag=0;
- }
- else
- {
- for(i=0;i<48;i++)
- date[i]=init_date[i];
-
- time_to_buff_all();
- nongli_change_flag=0;
- }
- }
-
- if(half_sec_flag==1&&nongli_flag==0) //0.5S
- {
- half_sec_flag=0;
- // date[32]=10; //秒點(diǎn) 閃爍
- // date[35]=10; //秒點(diǎn) 閃爍
- time_to_buff();
- switch(status)
- {
- case 0:
- break;
- case 1:
- date[10]=103,date[11]=103;
- break;
- case 2:
- date[14]=103,date[15]=103;
- break;
- case 3:
- date[18]=103,date[19]=103;
- break;
- case 4:
- date[27]=103,date[28]=103;
- break;
- case 5:
- date[30]=103,date[31]=103;
- break;
- case 6:
- date[33]=103,date[34]=103;
- break;
- case 7:
- date[36]=103,date[37]=103;
- break;
- default:
- break;
- }
- }
- if(one_sec_flag==1&&nongli_flag==0) //1.0S
- {
- one_sec_flag=0;
-
- if((disp_mode==8||k==0)&&nongli_flag==0) get_temp();
- if(alarm_flag==1) alarm();
- date[32]=11;
- date[35]=11;
- if(status!=0) time_to_buff_all();
- else time_to_buff();
- }
- }
- void get_temp(void) //讀取溫度
- {
- ReadTemperature();
- date[39]=T_int/10;
- date[40]=T_int%10;
- date[42]=T_dec;
- }
- void festival_check(void) //判斷是否節(jié)日
- {
- unsigned char i;
-
- if(qingming_table[CurrentTime.Year>>3]&(0x80>>(CurrentTime.Year%8))) //查清明節(jié)的表
- i=1;
- else i=0;
-
- if( (CurrentTime.Month==4) &&(CurrentTime.Day==(0x04+i)) )
- {
- festival_flag=1;
- festival_num=2;
- }
- else
- {
- nongliCONV();
- for(i=0;i<FESTIVAL_MAX;i++)
- {
- if((CurrentTime.Month==festival_table[i][0])&&(CurrentTime.Day==festival_table[i][1]))
- {
- festival_flag=1;
- festival_num=i;
- break;
- }
- else festival_flag=0;
- }
- }
- }
- void alarm_check(void) //判斷是否鬧鈴
- {
- if(alarm_enable==1)
- {
- if(CurrentTime.Hour==alarm_hour&&CurrentTime.Minute==alarm_min)
- alarm_flag=1;
- }
- }
- void alarm(void) //響鬧鈴
- {
-
- }
- void display(unsigned char mode) //送顯示數(shù)據(jù)
- {
- unsigned char i;
- switch(mode)
- {
- case 0: //流動(dòng)暫停顯示
- if(switch_flag==1) {k=0;switch_flag=0;}
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[k+i]][disrow]);
- sendR2byte(a[date[k+8]][disrow],offset);
- if(offset==8)
- {
- offset=0;k++;
- if(k==30&&nongli_flag==0) {stop_bit=1,stop_time=900,disp_mode=1;}//到了時(shí)間的時(shí)候停一下。
- if(k==39&&nongli_flag==0) {stop_bit=1,stop_time=40;} //溫度也停一下下。
- if(k>44&&nongli_flag==0)
- {
- k=0;
- nongli_flag=~nongli_flag;
- nongli_change_flag=1;
- }
- if(k>24&&festival_flag==0&&nongli_flag==1)
- {
- k=0;
- nongli_flag=~nongli_flag;
- nongli_change_flag=1;
- }
- else if(k>30&&festival_flag==1&&nongli_flag==1)
- {
- k=0;
- nongli_flag=~nongli_flag;
- nongli_change_flag=1;
- }
- }
- break;
-
- case 7: //全部流動(dòng)顯示
- if(switch_flag==1) {k=0;switch_flag=0;}
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[k+i]][disrow]);
- sendR2byte(a[date[k+8]][disrow],offset);
- if(offset==8)
- {
- offset=0;k++;
- if(nongli_flag==0&&k>44)
- {
- k=0;
- nongli_flag=~nongli_flag;
- nongli_change_flag=1;
- }
- if(k>24&&festival_flag==0&&nongli_flag==1)
- {
- k=0;
- nongli_flag=~nongli_flag;
- nongli_change_flag=1;
- }
- else if(k>30&&festival_flag==1&&nongli_flag==1)
- {
- k=0;
- nongli_flag=~nongli_flag;
- nongli_change_flag=1;
- }
- }
- break;
-
- case 8: //固定顯示溫度
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[39+i]][disrow]);
- break;
-
- case 1: //翻頁(yè)鐘顯示
- shutter_clock();
- break;
-
- case 2: //顯示時(shí)間
- if(switch_flag==1) {/*k=23;*/switch_flag=0;}
- if(k<30)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[k+i]][disrow]);
- sendR2byte(a[date[k+8]][disrow],offset);
- if(offset==8)
- {
- offset=0;k++;
- }
- }
- if(k==30)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[30+i]][disrow]);
- }
- break;
-
- case 3: //顯示年
- if(switch_flag==1) {k=0;switch_flag=0;}
- if(k<10)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[k+i]][disrow]);
- sendR2byte(a[date[k+8]][disrow],offset);
- if(offset==8)
- {
- offset=0;k++;
- }
- }
- if(k==10)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[10+i]][disrow]);
- }
- break;
-
- case 4: //顯示月
- if(switch_flag==1) {k=10;switch_flag=0;}
- if(k<14)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[k+i]][disrow]);
- sendR2byte(a[date[k+8]][disrow],offset);
- if(offset==8)
- {
- offset=0;k++;
- }
- }
- if(k==14)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[14+i]][disrow]);
- }
- break;
-
- case 5: //顯示日
- if(switch_flag==1) {k=14;switch_flag=0;}
- if(k<18)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[k+i]][disrow]);
- sendR2byte(a[date[k+8]][disrow],offset);
- if(offset==8)
- {
- offset=0;k++;
- }
- }
- if(k==18)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[18+i]][disrow]);
- }
- break;
- case 6: //顯示星期
- if(switch_flag==1) {k=18;switch_flag=0;}
- if(k<23)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[k+i]][disrow]);
- sendR2byte(a[date[k+8]][disrow],offset);
- if(offset==8)
- {
- offset=0;k++;
- }
- }
- if(k==23)
- {
- for(i=0;i<8;i++) //送往8個(gè)4094的數(shù)據(jù).
- sendRbyte(a[date[23+i]][disrow]);
- }
- break;
- default:
- break;
- }
- }
- void shutter_clock(void) //翻頁(yè)鐘
- {
- if(date[30]!=temp_time[0]) f1=0; //時(shí)十位
- if(f1<17)
- {
- if(date[30]==0) sendRbyte(a[15][disrow+f1]);
- else sendRbyte(a[date[30]-1][disrow+f1]);
- }
- else sendRbyte(a[date[30]][disrow]);
-
- if(date[31]!=temp_time[1]) f2=0; //時(shí)個(gè)位
- if(f2<17)
- {
- if(date[31]==0) sendRbyte(a[17][disrow+f2]);
- else sendRbyte(a[date[31]-1][disrow+f2]);
- }
- else sendRbyte(a[date[31]][disrow]);
-
- sendRbyte(a[date[32]][disrow]); //冒號(hào)
-
- if(date[33]!=temp_time[2]) f3=0; //分十位
- if(f3<17)
- {
- if(date[33]==0) sendRbyte(a[19][disrow+f3]);
- else sendRbyte(a[date[33]-1][disrow+f3]);
- }
- else sendRbyte(a[date[33]][disrow]);
-
- if(date[34]!=temp_time[3]) f4=0; //分個(gè)位
- if(f4<17)
- {
- if(date[34]==0) sendRbyte(a[21][disrow+f4]);
- else sendRbyte(a[date[34]-1][disrow+f4]);
- }
- else sendRbyte(a[date[34]][disrow]);
-
- sendRbyte(a[date[35]][disrow]); //冒號(hào)
-
- if(date[36]!=temp_time[4]) f5=0; //秒十位
- if(f5<17)
- {
- if(date[36]==0) sendRbyte(a[19][disrow+f5]);
- else sendRbyte(a[date[36]-1][disrow+f5]);
- }
- else sendRbyte(a[date[36]][disrow]);
-
- if(date[37]!=temp_time[5]) f6=0; //秒個(gè)位
- if(f6<17)
- {
- if(date[37]==0) sendRbyte(a[21][disrow+f6]);
- else sendRbyte(a[date[37]-1][disrow+f6]);
- }
- else sendRbyte(a[date[37]][disrow]);
- }
- void delay_nms(unsigned int count) //軟件延時(shí)
- {
- unsigned int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<240;j++); //120 改成45看看
- }
- void set_row(unsigned char row) //選定顯示行
- {
- H_PORT=(row&0x0f);
- }
- void sendRbyte(unsigned char wdata) //模擬spi的方式往列4094傳送字模數(shù)據(jù)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- L_CLK=0; //時(shí)鐘拉低
- RData=~wdata&0x80;
- // GData=~wdata&0x80;
- L_CLK=1; //時(shí)鐘拉高,產(chǎn)生上升沿
- wdata <<= 1; //左移一位
- }
- }
- void sendR2byte(unsigned char wdata,unsigned char n) //模擬spi的方式往列4094傳送字模數(shù)據(jù)
- {
- unsigned char i;
- for(i=0;i<n;i++)
- {
- L_CLK=0; //時(shí)鐘拉低
- RData=~wdata&0x80;
- // GData=~wdata&0x80;
- L_CLK=1; //時(shí)鐘拉高,產(chǎn)生上升沿
- wdata <<= 1; //左移一位
- }
- }
- void time_to_buff(void) //讀取時(shí)間
- {
- DS1302_GetTime(&CurrentTime);
-
- if(CurrentTime.Second<1) alarm_check();
-
- temp_time[0]=date[30];
- temp_time[1]=date[31];
- temp_time[2]=date[33];
- temp_time[3]=date[34];
- temp_time[4]=date[36];
- temp_time[5]=date[37];
-
- date[30]=CurrentTime.Hour/10; //小時(shí)
- date[31]=CurrentTime.Hour%10; //小時(shí)
- date[33]=CurrentTime.Minute/10; //分鐘
- date[34]=CurrentTime.Minute%10; //分鐘
- date[36]=CurrentTime.Second/10; //秒
- date[37]=CurrentTime.Second%10; //秒
-
- if(date[30]==0&date[31]==0&date[33]==0&date[34]==0&date[36]==0&date[37]==0)
- {
- date[10]=CurrentTime.Year/10; //年
- date[11]=CurrentTime.Year%10; //年
- date[14]=CurrentTime.Month/10; //月
- date[15]=CurrentTime.Month%10; //月
- date[18]=CurrentTime.Day/10; //日
- date[19]=CurrentTime.Day%10; //日
-
- date[27]=week_data[CurrentTime.Week];
- date[28]=week_data[CurrentTime.Week]+1;
-
- festival_check();
- }
- }
- void time_to_buff_all(void) //讀取全部時(shí)間
- {
- DS1302_GetTime_ALL(&CurrentTime);
-
- if(CurrentTime.Second<1) alarm_check();
-
- temp_time[0]=date[30];
- temp_time[1]=date[31];
- temp_time[2]=date[33];
- temp_time[3]=date[34];
- temp_time[4]=date[36];
- temp_time[5]=date[37];
-
- date[30]=CurrentTime.Hour/10; //小時(shí)
- date[31]=CurrentTime.Hour%10; //小時(shí)
- date[33]=CurrentTime.Minute/10; //分鐘
- date[34]=CurrentTime.Minute%10; //分鐘
- date[36]=CurrentTime.Second/10; //秒
- date[37]=CurrentTime.Second%10; //秒
-
- date[10]=CurrentTime.Year/10; //年
- date[11]=CurrentTime.Year%10; //年
- date[14]=CurrentTime.Month/10; //月
- date[15]=CurrentTime.Month%10; //月
- date[18]=CurrentTime.Day/10; //日
- date[19]=CurrentTime.Day%10; //日
- date[27]=week_data[CurrentTime.Week]; //星期
- date[28]=week_data[CurrentTime.Week]+1;//星期
-
- festival_check();
- }
- void key_scan(void) //掃描按鍵
- {
- static unsigned char mode_counter=0;
- if(adj_flag==1)
- {
- adj_flag=0;
- //disp_status=NORMAL;
- //status_change_flag=1;
- stop_bit=0;
- offset=0;
- switch_flag=1;
- status++;
- if(status>7) status=1;
- time_to_buff_all();
- }
- if(esc_flag==1)
- {
- esc_flag=0;
- //disp_status=NORMAL;
- //status_change_flag=1;
- stop_bit=0;
- disp_mode=0; //退出時(shí)方式為流動(dòng)顯示
- k=0;
- offset=0;
- status=0;
- time_to_buff_all();
- }
-
- switch(status)
- {
- case 0: //顯示模式調(diào)整
- if(add_flag==1)
- {
- add_flag=0;
- stop_bit=0;
- offset=0;
- switch_flag=1;
- mode_counter++;
- if(mode_counter>3) mode_counter=0;
- disp_mode=mode[mode_counter];
- }
- if(dec_flag==1)
- {
- dec_flag=0;
- offset=0;
- stop_bit=0;
- switch_flag=1;
- if(mode_counter==0) mode_counter=3;
- else mode_counter--;
- disp_mode=mode[mode_counter];
- }
- break;
-
- case 1: //年調(diào)整
- disp_mode=3;
- if(add_flag==1)
- {
- add_flag=0;
- CurrentTime.Year++;
- if(CurrentTime.Year>99) CurrentTime.Year=0;
- DS1302_SetTime(DS1302_YEAR,(CurrentTime.Year));
- }
- if(dec_flag==1)
- {
- dec_flag=0;
- if(CurrentTime.Year>0) CurrentTime.Year--;
- if(CurrentTime.Year==0) CurrentTime.Year=99;
- DS1302_SetTime(DS1302_YEAR,(CurrentTime.Year));
- }
- break;
- case 2: //月調(diào)整
- disp_mode=4;
- if(add_flag==1)
- {
- add_flag=0;
- CurrentTime.Month++;
- if(CurrentTime.Month>12) CurrentTime.Month=1;
- DS1302_SetTime(DS1302_MONTH,(CurrentTime.Month));
- }
- if(dec_flag==1)
- {
- dec_flag=0;
- if(CurrentTime.Month>0) CurrentTime.Month--;
- if(CurrentTime.Month==0) CurrentTime.Month=12;
- DS1302_SetTime(DS1302_MONTH,(CurrentTime.Month));
- }
- break;
- case 3: //日調(diào)整
- disp_mode=5;
- if(add_flag==1)
- {
- add_flag=0;
- CurrentTime.Day++;
- if(CurrentTime.Day>31) CurrentTime.Day=1;
- DS1302_SetTime(DS1302_DAY,(CurrentTime.Day));
- }
- if(dec_flag==1)
- {
- dec_flag=0;
- if(CurrentTime.Day>0) CurrentTime.Day--;
- if(CurrentTime.Day==0) CurrentTime.Day=31;
- DS1302_SetTime(DS1302_DAY,(CurrentTime.Day));
- }
- break;
- case 4: //星期調(diào)整
- disp_mode=6;
- if(add_flag==1)
- {
- add_flag=0;
- CurrentTime.Week++;
- if(CurrentTime.Week>7) CurrentTime.Week=1;
- DS1302_SetTime(DS1302_WEEK,(CurrentTime.Week));
- }
- if(dec_flag==1)
- {
- dec_flag=0;
- if(CurrentTime.Week>1) CurrentTime.Week--;
- if(CurrentTime.Week==1) CurrentTime.Week=7;
- DS1302_SetTime(DS1302_WEEK,(CurrentTime.Week));
- }
- break;
- case 5: //小時(shí)調(diào)整
- disp_mode=2;
- if(add_flag==1)
- {
- add_flag=0;
- CurrentTime.Hour++;
- if(CurrentTime.Hour>23) CurrentTime.Hour=0;
- DS1302_SetTime(DS1302_HOUR,(CurrentTime.Hour));
- }
- if(dec_flag==1)
- {
- dec_flag=0;
- if(CurrentTime.Hour>0) CurrentTime.Hour--;
- if(CurrentTime.Hour==0) CurrentTime.Hour=23;
- DS1302_SetTime(DS1302_HOUR,(CurrentTime.Hour));
- }
- break;
- case 6: //分鐘調(diào)整
- disp_mode=2;
- if(add_flag==1)
- {
- add_flag=0;
- CurrentTime.Minute++;
- if(CurrentTime.Minute>59) CurrentTime.Minute=0;
- DS1302_SetTime(DS1302_MINUTE,(CurrentTime.Minute));
- }
- if(dec_flag==1)
- {
- dec_flag=0;
- if(CurrentTime.Minute>0) CurrentTime.Minute--;
- if(CurrentTime.Minute==0) CurrentTime.Minute=59;
- DS1302_SetTime(DS1302_MINUTE,(CurrentTime.Minute));
- }
- break;
- case 7: //秒調(diào)整
- disp_mode=2;
- if(add_flag==1)
- {
- add_flag=0;
- CurrentTime.Second++;
- if(CurrentTime.Second>59) CurrentTime.Second=0;
- DS1302_SetTime(DS1302_SECOND,(CurrentTime.Second));
- }
- if(dec_flag==1)
- {
- dec_flag=0;
- if(CurrentTime.Second>0) CurrentTime.Second--;
- if(CurrentTime.Second==0) CurrentTime.Second=59;
- DS1302_SetTime(DS1302_SECOND,(CurrentTime.Second));
- }
- break;
- default:
- break;
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
51電子鐘_V2.41(適用于138_595四字屏).rar
(240.64 KB, 下載次數(shù): 477)
2018-4-19 13:13 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|