功能:
通過8位數碼管實現實時時鐘,可以設置時間,切換顯示模式,顯示年月日,時分秒信息;可通過按鍵修改信息,增加、減少、確定、取消、上一個、下一個、切換模式、設置等功能。
時分秒
編輯
年月日:
編輯
部分程序:
#include
#include "MAX7221.h"
#include "DS1302.h"
void InitTimer0(void); //定時器T0初始化函數
void Disp(void); //時間顯示函數
void SSetTime(unsigned char n,unsigned char m,unsigned char *readvalue,unsigned char *Cflag); //用戶設置時間函數
void Delay(unsigned char time); //延時函數
void SDisp(unsigned char n); //設置時間,數碼管閃爍函數
sbit Next=P1^0; //“下一個”按鈕
sbit Pre=P1^1; //“上一個”按鈕
sbit ADD=P1^2; //“增加”按鈕
sbit SUB=P1^3; //“減少”按鈕
sbit SET=P1^4; //“確定”按鈕
sbit Cancel=P1^5; //“取消”按鈕
sbit LED=P2^6; //設置指示燈
SYSTEMTIME CurrentTime; //時間日期類型
signed char DispBuf[16]; //存放時間日期的個位與十位
unsigned char DISPCODE[]={0,1,2,3,4,5,6,7,8,9,0x0A,0x0F}; //數碼管顯示數組,0x0A數碼管顯示“-”,0x0F數碼管不顯示
unsigned int count=1200; //用于設定時間/日期在數碼管上的顯示時間
unsigned char DisFlag=0; //顯示標志,0位時間顯示,1位日期顯示
unsigned char SetFlag=0; //設置標志
void main(void)
{
InitTimer0(); //定時器初始化
Init_Max7221(0xFF,0x0A,0x07,0x01);//MAX7221初始化
Init_DS1302(); //DS1302初始化;注:1 Warning,由于在中斷0中也調用了SetTime()函數,所以有一個警告,可忽略警告;如果你將其注釋掉,會出現新的警告,因為你在DS1302中寫了Init_DS1302()函數,而你沒有調用;標準是一定要調用Init_DS1302()函數的
IT0=1; //設置中斷INT0
EX0=1;
IT1=1; //設置中斷INT1
EX1=1;
EA=1;
LED=0; //設置指示燈為滅的狀態
while(1)
{
Disp(); //顯示時間/日期
Delay(10);
}
return;
}
//時間/日期顯示函數
void Disp(void)
{
GetTime(&CurrentTime); //獲取時間/日期
if(DisFlag==0) //判斷是不是顯示時間
{
DispBuf[7]=(CurrentTime.Second)%10; //秒的個位
DispBuf[6]=(CurrentTime.Second)/10; //秒的十位
DispBuf[5]=10; //“-”
DispBuf[4]=(CurrentTime.Minute)%10; //分的個位
DispBuf[3]=(CurrentTime.Minute)/10; //分的十位
DispBuf[2]=10; //“-”
DispBuf[1]=(CurrentTime.Hour)%10; //時的個位
DispBuf[0]=(CurrentTime.Hour)/10; //時的十位
}
else if(DisFlag==1)
{
DispBuf[7]=(CurrentTime.Day)%10; //日的個位
DispBuf[6]=(CurrentTime.Day)/10; //日的十位
DispBuf[5]=10; //“-”
DispBuf[4]=(CurrentTime.Month)%10; //月的個位
DispBuf[3]=(CurrentTime.Month)/10; //月的十位
DispBuf[2]=10; //“-”
DispBuf[1]=(CurrentTime.Year)%10; //年的個位
DispBuf[0]=(CurrentTime.Year)/10; //年的十位
}
Wr_Max7221(0x08,DISPCODE[DispBuf[7]]); //顯示秒的個位或日的個位
Wr_Max7221(0x07,DISPCODE[DispBuf[6]]); //顯示秒的十位或日的十位
Wr_Max7221(0x06,DISPCODE[DispBuf[5]]); //顯示“-”
Wr_Max7221(0x05,DISPCODE[DispBuf[4]]); //顯示分的個位或月的個位
Wr_Max7221(0x04,DISPCODE[DispBuf[3]]); //顯示分的十位或月的十位
Wr_Max7221(0x03,DISPCODE[DispBuf[2]]); //顯示“-”
Wr_Max7221(0x02,DISPCODE[DispBuf[1]]); //顯示時的個位或年的個位
Wr_Max7221(0x01,DISPCODE[DispBuf[0]]); //顯示時的十位或年的十位
}
//T0定時器初始化子程序
void InitTimer0(void)
{
TMOD=0x01; //工作方式1
TH0=(65536-50000)/256; //定時時間為0.5ms
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //允許定時器T0中斷
TR0=1; //打開定時器T0
}
//T0定時器服務子程序
void Timer0(void) interrupt 1
{
TR0=0; //關定時器T0
TH0=(65536-50000)/256; //重載初值
TL0=(65536-50000)%256;
count--;
if(count==0) //count*0.5ms定時到
{
if(DisFlag==0) //如果上一個是顯示時間
{
DisFlag=1; //改為顯示日期
count=100; //顯示5s
}
else if(DisFlag==1)
{
count=1200; //顯示60s
DisFlag=0; //改為顯示時間
}
}
TR0=1; //打開定時器T0
}
SetFlag=0; //清除設置標志
break; //退出設置模式
}
if(Next==0) n=n-1; //“下一個”按鈕按下時,某數據設置位標志減1
if(n<=0) n=6; //若到達0時,回到6設置
if(Pre==0) n=n+1; //“上一個”按鈕按下時,某數據設置位標志加1
if(n>=7) n=1; //若到達0時,回到6設置
if(ADD==0) m=1; //“增加”按鈕按下時,設置增加標志
if(SUB==0) m=2; //“減少”按鈕按下時,設置減少標志
if((Next==0)||(ADD==0)||(SUB==0)) //判斷是否有“下一個”按鈕或“增加”按鈕或“減少”按鈕按下
{
Delay(50); //延時(給一定的釋放按鈕時間)
SSetTime(n,m,readvalue,&Cflag); //進入相關的設置
}
SDisp(n); //顯示
m=0; //清除“增加”或“減少”標志
}
LED=0; //設置完畢,關設置指示燈
count=1200; //設置完畢后,“時間”顯示的60s
DisFlag=0; //顯示“時間”
EA=1; //開總中斷
}
//時間日期變化子函數
void SSetTime(unsigned char n,unsigned char m,signed char readvalue,signed char Cflag)
{
if(m==1) //設置值增加
{
if(n==6) //年增加
{
*Cflag|=0x01; //年值變化標志
readvalue[5]=readvalue[5]+1; //年值加1
if(readvalue[5]>=100) readvalue[5]=00; //判斷是否大于99,若是,將其設置為0
DispBuf[0]=readvalue[5]/10; //保存年的十位
DispBuf[1]=readvalue[5]%10; //保存年的個位
}
else if(n==5) //月增加
{
評論
查看更多