本帖最后由 chweji123 于 2014-11-15 19:20 編輯
我有一個ds1302+4位數碼管時鐘帶,年月,日周,時間,有一部分是抄襲的,有一部分只能學著開始修改程序沒想到這玩意真難搞,搞幾天頭都高大了,嗨老天不負有心人終于有點點收獲,只是不足之處就是要按鍵來切換,我想讓它自動切換來顯示,年月,日周,時間,不知道這個程序怎么寫,望老師指點,在此謝了。
#include <at89x52.h>
#include <DS1302.h>
#define uchar unsigned char
/********************************************************/
unsigned char code shumg[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0xff};
/********************************************************/
sbit led=P1^7; //冒號閃爍
sbit buzz=P3^6; //報時IO輸出
uchar a;
char miao_num; //冒號標志
char didi_dd; //鬧鈴標志
/********************************************************/
unsigned char Time[]={0,0,0,0};//用來儲存,時間
unsigned char Dime[]={0,0,0,0};//用來儲存,年月
unsigned char Bime[]={0,0,0,0};//用來儲存,日期
unsigned char flag;
/********************************************************/
SYSTEMTIME time1;
/********************************************************/
void keyscan(); //按鍵掃描函數
void bao_shi(); //報時聲明
void mao_hao(); //冒號聲明
void nao_ling(); //鬧鈴聲明
/********************************************************/
void delay(unsigned char i) //延時子程序
{
unsigned char j;
while((i--)!=0)
{
for(j=123;j>0;j--);
}
}
/********************************************************/
void t0_init() //定時50ms一個中斷
{
TMOD=0x11; //總中斷初始化
TH0=(65536-50000)/256; //定時50ms一個中斷
TL0=(65536-50000)%256; //定時50ms一個中斷
TH1=(65536-50000)/256; //定時50ms一個中斷
TL1=(65536-50000)%256; //定時50ms一個中斷
EA=1; //開啟總中斷
ET0=1;
ET1=1;
TR0=1; //開啟定時器0
TR1=0; //關閉定時器1
}
/********************************************************/
unsigned char button_time(n,x,y) //時鐘調整子程序
unsigned char n,x,y;
{
if(P1_5==0) //加
{
delay(50);
if(P1_5==0)
{
n++;
if(n==x)
n=0;
while(P1_5==0);
}
}
/********************************************************/
if(P1_6==0) //減
{
delay(50);
if(P1_6==0)
{
if(n==0)
n=y;
else
n--;
while(P1_6==0);
}
}
return n; //函數返回
}
/********************************************************/
void display(shi10,shi1,fen10,fen1)//顯示子程序
{
P2=0xf7;
a=shumg[shi10]; //顯示時的十位
if(a==0xc0) //如a是零讓其它的數碼管顯示
{
P0=0xff; //消隱
P2=0xff; //消隱
}
P0=a; //如a是1讓它顯示
delay(1); //延時
P0=0xff;
P2=0xfb;
P0=shumg[shi1]; //顯示時的個位
delay(1); //延時
P2=0xff; //消隱
P0=0xff; //消隱
P2=0xfd;
P0=shumg[fen10]; //顯示分的十位
delay(1); //延時
P2=0xff; //消隱
P0=0xff; //消隱
P2=0xfe;
P0=shumg[fen1]; //顯示分的個位
delay(1); //延時
P2=0xff; //消隱
P0=0xff; //消隱
}
/********************************************************/
void main() //主函數
{
Initial_DS1302(); //初始化DS1302這個時鐘芯片,
t0_init(); //中斷初始化
while(1) //大循環
{
mao_hao(); //冒號初始
nao_ling(); //鬧鈴初始
bao_shi(); //報時初始
keyscan();
DS1302_GetTime(&time1); //讀取時間參數
Bime[3]=(time1.Week)%10; //把時的個位數據存入Bime[3]
Bime[2]=(time1.Week)/10; //把時的個位數據存入Bime[2]
Bime[1]=(time1.Day)%10; //把時的個位數據存入Bime[1]
Bime[0]=(time1.Day)/10; //把時的個位數據存入Bime[0]
Dime[3]=(time1.Month)%10; //把時的個位數據存入Dime[3]
Dime[2]=(time1.Month)/10; //把時的個位數據存入Dime[2]
Dime[1]=(time1.Year)%10; //把時的個位數據存入Dime[1]
Dime[0]=(time1.Year)/10; //把時的個位數據存入Dime[0]
Time[3]=(time1.Minute)%10; //把分的個位數據存入Time[3]
Time[2]=(time1.Minute)/10; //把分的十位數據存入Time[2]
Time[1]=(time1.Hour)%10; //把時的個位數據存入Time[1]
Time[0]=(time1.Hour)/10; //把時的十位數據存入Time[0]
}
}
/********************************************************/
void keyscan() //按鍵掃描函數
{
if(P1_3==0) //切換
{
delay(100);
if(P1_3==0)
{
TR0=0; //有按鍵按下關閉定時器0
miao_num=0; //冒號常亮
flag++;
if(flag>2) //翻頁年月日周按兩次后啟動定時器
{
flag=0;
TR0=1; //啟動定時器0
}
}
while(P1_3==0);
}
/********************************************************/
if(P1_4==0) //設置
{
delay(100);
if(P1_4==0)
{
TR0=0; //有按鍵按下關閉定時器0
miao_num=0; //冒號常亮
flag++;
if(flag>2) //按兩次后啟動定時器
{
TR0=1; //啟動定時器0
}
if(flag>4) //按四次后關閉定時器
{
TR0=0; //關閉定時器0
miao_num=0; //冒號常亮
}
if(flag>8) //顯示多少位和翻頁按八次啟動定時器
{
flag=0;
TR0=1; //啟動定時器0
}
}
while(P1_4==0);
}
switch(flag)
{
/********************************************************/
case 0:display(Time[0],Time[1],Time[2],Time[3]); //調用子函數display,把存入數組time的數據給顯示出來
break;
case 1:display(Dime[0],Dime[1],Dime[2],Dime[3]); //調用子函數display,把存入數組Dime的數據給顯示出來
break;
case 2:display(Bime[0],Bime[1],Bime[2],Bime[3]); //調用子函數display,把存入數組Bime的數據給顯示出來
break;
/*******************************************************/
case 3:time1.Hour=button_time(time1.Hour,24,23); //調整時
DS1302_SetTime(0x84,time1.Hour);
display(Time[0],Time[1],10,10);
break;
case 4:time1.Minute=button_time(time1.Minute,60,59); //調整分
DS1302_SetTime(0x82,time1.Minute);
display(10,10,Time[2],Time[3]);
break;
/*******************************************************/
case 5:time1.Year=button_time(time1.Year,100,99); //調整年
DS1302_SetTime(0x8c,time1.Year);
display(Dime[0],Dime[1],10,10);
break;
case 6:time1.Month=button_time(time1.Month,13,12); //調整月
DS1302_SetTime(0x88,time1.Month);
display(10,10,Dime[2],Dime[3]);
break;
/********************************************************/
case 7:time1.Day=button_time(time1.Day,32,31); //調整日
DS1302_SetTime(0x86,time1.Day);
display(Bime[0],Bime[1],10,10);
break;
case 8:time1.Week=button_time(time1.Week,8,7); //調整周
DS1302_SetTime(0x8a,time1.Week);
display(10,10,Bime[2],Bime[3]);
break;
}
}
|