放假下雨,無事做了一個時鐘。洞洞焊接,很是費力喲。四位帶雙點0.56數(shù)碼管,廢微波爐上拆下來的,PCF8563,舊電表的拆下來的。加了一個STC15W104、TM1637及三個按鍵.做出來的時鐘小巧穩(wěn)定,功能也還可以。上圖:
單片機源程序如下:
- #include <STC15.h>
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- #include "TM1637.h"
- #include "PCF8563.H"
- uchar keyvalue,xs=0,LD=5,SetFlag=0,re_disp=0;
- uchar keydate; //讀鍵盤參數(shù)
- bit Flash; //閃爍標志位
- bit ReadTimeFlag;//定義讀時間標志
- void Init_Timer0(void);//定時器初始化
- void Displsy_Time();
- void Scan_Key();
- void Set(uchar sel,uchar selby);
- /*------------------------------------------------
- 主函數(shù)
- ------------------------------------------------*/
- void main()
- {
- P3M0=0X00;
- P3M1=0X00;
- Init_Timer0();
- while(1)
- {
- Scan_Key();
- }
- }
- /*------------------------------------------------
- 顯示界面設置
- ------------------------------------------------*/
- void Displsy_Time()
- {
- if(ReadTimeFlag==1) //讀取時間
- {
- ReadTimeFlag=0;
- Read8563();
- keydate=ScanKey();
- }
- if(SetFlag==0&&xs==0) TM1637_display((time_buf1[4]/10),(time_buf1[4]%10),(time_buf1[5]/10),(time_buf1[5]%10),Flash,(LD)); //非設置狀態(tài),正常顯示 時:分
- if(SetFlag==0&&xs==1) TM1637_display((2),(0),(time_buf1[1]/10),(time_buf1[1]%10),0,(LD)); //20xx年
- if(SetFlag==0&&xs==2) TM1637_display((time_buf1[2]/10),(time_buf1[2]%10),(time_buf1[3]/10),(time_buf1[3]%10),1,(LD)); //月:日
- if(SetFlag==0&&xs==3) TM1637_display((time_buf1[7]),(21),(time_buf1[6]/10),(time_buf1[6]%10),1,(LD)); //周空秒
-
- switch(SetFlag) //以下是設置狀態(tài)
- {
- case 1:
- {
- if(Flash) TM1637_display((2),(0),(time_buf1[1]/10),(time_buf1[1]%10),0,(LD));
- else TM1637_display((2),(0),(21),(21),0,(LD));
-
- if(keyvalue==2&&SetFlag==1) //年+
- {
- Set(1,0);
- keyvalue=0;
- }
- if(keyvalue==3&&SetFlag==1) //年-
- {
- Set(1,1);
- keyvalue=0;
- }
- }
- break;
- case 2:
- {
- if(Flash) TM1637_display((11),(21),(time_buf1[2]/10),(time_buf1[2]%10),1,(LD));
- else TM1637_display((11),(21),(21),(21),1,(LD));
-
- if(keyvalue==2&&SetFlag==2) //月+
- {
- Set(2,0);
- keyvalue=0;
- }
- if(keyvalue==3&&SetFlag==2) //月-
- {
- Set(2,1);
- keyvalue=0;
- }
- }
- break;
-
- case 3:
- {
- if(Flash) TM1637_display((13),(21),(time_buf1[3]/10),(time_buf1[3]%10),1,(LD));
- else TM1637_display((13),(21),(21),(21),1,(LD));
-
- if(keyvalue==2&&SetFlag==3) //日+
- {
- Set(3,0);
- keyvalue=0;
- }
- if(keyvalue==3&&SetFlag==3) //日-
- {
- Set(3,1);
- keyvalue=0;
- }
- }
- break;
-
- case 4:
- {
- if(Flash) TM1637_display((16),(21),(time_buf1[4]/10),(time_buf1[4]%10),1,(LD));
- else TM1637_display((16),(21),(21),(21),1,(LD));
-
- if(keyvalue==2&&SetFlag==4) //時+
- {
- Set(4,0);
- keyvalue=0;
- }
- if(keyvalue==3&&SetFlag==4) //時-
- {
- Set(4,1);
- keyvalue=0;
- }
- }
- break;
-
- case 5:
- {
- if(Flash) TM1637_display((15),(21),(time_buf1[5]/10),(time_buf1[5]%10),1,(LD));
- else TM1637_display((15),(21),(21),(21),1,(LD));
-
- if(keyvalue==2&&SetFlag==5) //分+
- {
- Set(5,0);
- keyvalue=0;
- }
- if(keyvalue==3&&SetFlag==5) //分-
- {
- Set(5,1);
- keyvalue=0;
- }
- }
- break;
-
- case 6:
- {
- if(Flash) TM1637_display((5),(21),(time_buf1[6]/10),(time_buf1[6]%10),1,(LD));
- else TM1637_display((5),(21),(21),(21),1,(LD));
-
- if(keyvalue==2&&SetFlag==6) //秒+
- {
- Set(6,0);
- keyvalue=0;
- }
- if(keyvalue==3&&SetFlag==6) //秒-
- {
- Set(6,1);
- keyvalue=0;
- }
- }
- break;
- }
-
- }
- /*------------------------------------------------
- 定時器初始化子程序
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- EA=1; //總中斷打開
- ET0=1; //定時器中斷打開
- TR0=1; //定時器開關打開
- }
- /*------------------------------------------------
- 定時器中斷子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- static unsigned int num,a;
- TH0=(65536-50000)/256; //重新賦值 50ms
- TL0=(65536-50000)%256;
- num++;
- re_disp++;
- if(num==2) //大致100ms
- {
- num=0;
- ReadTimeFlag=1; //讀標志位置1
- a++;
- }
-
- if(a==5)
- {
- a=0;
- Flash=~Flash;
- }
- if(re_disp==200)
- {
- re_disp=0;
- SetFlag=0;
- }
- }
- /*------------------------------------------------
- 鍵盤檢測函數(shù)
- ------------------------------------------------*/
- void Scan_Key(void) //鍵盤檢測函數(shù)
- {
- keydate=0xff;
- Displsy_Time(); //程序開頭調用顯示函數(shù)
-
- if(keydate==0xef)
- {
- re_disp=0; //清除記數(shù),重新開始10s定時
- SetFlag++;
- if(SetFlag>6)SetFlag=0;
- }
- if(keydate==0xed)
- {
- re_disp=0; //清除記數(shù),重新開始10s定時
- keyvalue=2; //跳到加減判斷函數(shù),下同
-
- if(SetFlag==0)
- {
- xs++;
- if(xs>3)xs=0;
- }
- }
-
- if(keydate==0xee)
- {
- re_disp=0;
- keyvalue=3;
-
- if(SetFlag==0)
- {
- LD++;
- if(LD>7)LD=0;
- }
- }
- }
- /*-------------------------------------------------------
- //根據(jù)選擇調整相應項目并寫入DS3231
- --------------------------------------------------------*/
- void Set(unsigned char sel,unsigned char selby) //執(zhí)行調整項目的函數(shù)
- {
- uchar max,mini;
- if(sel==6) {max=59;mini=0;} //秒
- if(sel==5) {max=59;mini=0;} //分鐘
- if(sel==4) {max=23;mini=0;} //小時
- if(time_buf1[2]==2) //日
- {
- if(runnian())
- {
- if(sel==3) {max=29;mini=1;}
- }
- else
- {
- if(sel==3) {max=28;mini=1;}
- }
- }
- if(time_buf1[2]==1|time_buf1[2]==3|time_buf1[2]==5|time_buf1[2]==7|time_buf1[2]==8|time_buf1[2]==10|time_buf1[2]==12)
- {
- if(sel==3) {max=31;mini=1;}
- }
- if(time_buf1[2]==4|time_buf1[2]==6|time_buf1[2]==9|time_buf1[2]==11)
- {
- if(sel==3) {max=30;mini=1;}
- }
-
- if(sel==2) {max=12;mini=1;} //月
- if(sel==1) {max=25;mini=15;} //年
- if (selby==0) time_buf1[sel]++; else time_buf1[sel]--;
- if(time_buf1[sel]>max) time_buf1[sel]=mini;
- if(time_buf1[sel]<mini) time_buf1[sel]=max;
- Write8563();
- autoweek();
- }
復制代碼
所有資料51hei提供下載:
TM1637PCF8563四數(shù)碼管時鐘.rar
(55.25 KB, 下載次數(shù): 198)
2019-10-8 08:34 上傳
點擊文件名下載附件
|