點陣萬年歷(帶時間、年月日星期調(diào)整及鬧鐘功能)C程序
if(f!=0)//如果標(biāo)志位不為0,則執(zhí)行以下內(nèi)容-------調(diào)整日
{
xianriyue(yue,ri);
if(key1==0)//加日部分
{
delay(10);
if(key1==0)
{
xianriyue(yue,ri);
ri++;
if(ri==32)
ri=1;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x86,((ri/10)<<4)|(ri%10));//日數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護(hù)
readvalue=read1302(0x87);
ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
while(!key1);
}
}
if(key2==0)//減日部分
{
delay(10);
if(key2==0)
{
xianriyue(yue,ri);
ri--;
if(ri==(1-1))
ri=31;
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x86,((ri/10)<<4)|(ri%10));//日數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護(hù)
readvalue=read1302(0x87);
ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
while(!key2);
}
}
}
if(g!=0)//如果標(biāo)志位不為0,則執(zhí)行以下內(nèi)容-----星期調(diào)整部分
{
xi(xin);
if(key1==0)//星期加部分
{
delay(10);
if(key1==0)
{
xi(xin);
xin++;//將星期+1
if(xin==8)//如果星期到了8就清它清1
xin=1;//清1
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x8a,((xin/10)<<4)|(xin%10));//顯示星期天
write1302(0x8e,0x80);//打開保護(hù)
readvalue=read1302(0x8b);//讀星期
xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//將星期值還原
while(!key1);
}
}
if(key2==0)//星期減部分
{
delay(10);
if(key2==0)
{
xi(xin);
xin--;//減1
if(xin==(1-1))//如果到了(1-1)就給它7,因為星期只1---7
xin=7;//將它給7
write1302(0x8e,0x00);//去掉保護(hù)
write1302(0x8a,((xin/10)<<4)|(xin%10));//顯示星期天
write1302(0x8e,0x80);//打開保護(hù)
readvalue=read1302(0x8b);
xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//讀星期值
while(!key2);
}
}
}
if(h!=0)////如果標(biāo)志位不為0,則執(zhí)行以下內(nèi)容------------以下是鬧鐘小時調(diào)整部分
{
xianniao(shin,fenn,2);//調(diào)整鬧鐘小時與分鐘顯示子程序
if(key1==0)//鬧鐘小時加處理
{
delay(10);
if(key1==0)
{
xianniao(shin,fenn,2);
shin++;//將星期+1
if(shin==24)//如果星期到了8就清它清1
shin=0;//清1
while(!key1);
}
}
if(key2==0)//鬧鐘小時減處理
{
delay(10);
if(key2==0)
{
xianniao(shin,fenn,2);
shin--;
if(shin==(0-1))
shin=23;
while(!key2);
}
}
}
if(i!=0)//如果標(biāo)志位不為0,則執(zhí)行以下內(nèi)容----------鬧鐘分鐘調(diào)整
{
xianniao(shin,fenn,2);
if(key1==0)//鬧鐘分鐘加處理
{
delay(10);
if(key1==0)
{
xianniao(shin,fenn,2);
fenn++;//將星期+1
if(fenn==60)//如果星期到了8就清它清1
fenn=0;//清1
while(!key1);
}
}
if(key2==0)//鬧鐘分鐘減處理
{
delay(10);
if(key2==0)
{
xianniao(shin,fenn,2);
fenn--;
if(fenn==(0-1))
fenn=59;
while(!key2);
}
}
}
}
/******************************************************/
/*******************響鬧子程序*************************/
/******************************************************/
void xiangniao()
{
bit clock;//定義一個標(biāo)志位
if(clockbiao==0)//鬧鐘總標(biāo)志為0時才可以執(zhí)行鬧鐘處理程序
{
if(clock==0)//如果標(biāo)志位為0,就執(zhí)行下面內(nèi)容
{
if(shin==shi)//主時間小時與鬧鐘小時相等嗎?
{
if(fenn==fen)//主時間分鐘與鬧鐘分鐘相等嗎?
bbtsoud();//相等了就執(zhí)行鬧鐘響一聲子程序,即小時與分鐘都相等了就執(zhí)行鬧鈴
}
}
if(fenn!=fen)//如果分鐘不等
clock=0;//將標(biāo)志位清0,以便下次再響鈴
if(key1==0)//判斷加"+"按鍵有沒有被按下,如果按下了,就讓鬧鈴?fù)V鬼?br />{
delay(10);
if(key1==0)
{
clock=1;//將標(biāo)志位清0,讓鬧鐘在響鈴時立馬停下來
while(!key1);
}
}
}
if(key2==0)//如果減按鍵按下了,則則關(guān)閉鬧鈴全部功能
{
delay(10);
if(key2==0)//如果加按鍵按下了,則全部復(fù)位
{
clockbiao=~clockbiao;
bbtsoud();//蜂鳴器響一聲子程序
while(!key2);//按鍵釋放
}
}
}本文引用地址:http://www.ex-cimer.com/article/201611/323389.htm
/******************************************************/
/******************************************************/
/**********主程序(包括主顯示/鬧鐘/按鍵處理)************/
/******************************************************/
/******************************************************/
void main()
{
init1302();
TMOD=0X11;//寄存器工作方式
EA=1;//開總中斷
TR0=1;//開定時器
ET0=1;//開定時器中斷
TH0=(65536-20000)/256;//賦值給高位
TL0=(65536-20000)%256;//賦值給低位
TR1=1;//開定時器
ET1=1;//開定時器中斷
TH1=(65536-50000)/256;//賦值給高位
TL1=(65536-50000)%256;//賦值給低位
while(1)
{
if(flag==0)//如果標(biāo)志位為0,就讓它執(zhí)行主程序,不讓它讀按鍵處理部分,省資源
{
value();//調(diào)用DS1302時間轉(zhuǎn)換子程序
xianzhu(nian,yue,ri,xin);//調(diào)用主顯示
xiangniao();//調(diào)用響鬧子程序
}
skey();//調(diào)用按鍵處理子程序
}
}
/******************************************************/
/*******************定時中斷0子程序********************/
/******************************************************/
void zhong() interrupt 3
{
uchar ding;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ding++;
if(ding>=10)//模擬普通鬧鐘小數(shù)閃爍處理部分
{
ding=0;
dian=~dian;//0.5秒閃一次,它不參與具體計時,具體計時只是DS1302內(nèi)部
}
}
/******************************************************/
/*******************定時中斷1子程序********************/
/******************************************************/
void zhong1() interrupt 1//T1中斷服務(wù)程序
{
uchar ding1,ding2;
TH0=(65536-10000)/256;//賦值給高位
TL0=(65536-10000)%256;//賦值給低位
ding1++;
ding2++;
if(ding2>=50)//進(jìn)入調(diào)整模式時閃爍標(biāo)志位處理
{
ding2=0;
flag1=~flag1;
}
switch(yin)//以下是主功能按鍵處理子程序
{
case 0:if(ding1>=250)//長按功能按鍵進(jìn)入調(diào)整模式,否則怕誤按-------------進(jìn)入查看年月日功能
{
ding1=0;//將定時器清0
if(key==0)
{
delay(100);
if(key==0)
{
yin++;//將標(biāo)志位加1
lk=8;//些句是調(diào)用"年月日星期"顯示的關(guān)鍵一步,即打開下屏顯示
shr=1;//將標(biāo)志位置1
bbtsoud();//蜂鳴器響一聲
while(!key);//按鍵釋放
}
}
}
break;
case 1:if(key==0)//-----------------------------進(jìn)入調(diào)整模式閃爍功能
{
delay(100);
if(key==0)
{
yin++;//以便進(jìn)入一個功能
a=1;//標(biāo)志位置1,以便進(jìn)入按鍵功能
shr=0;//將上次標(biāo)志位清0,以免與現(xiàn)在的鍵值產(chǎn)生沖突
lk=0;//將下半屏清掉
flag=1;//將主程序中的標(biāo)志位置1
bbtsoud();//蜂鳴器響一聲
TR1=0;//將定時器關(guān)掉
dian=0;//將主時間中的兩位小數(shù)點標(biāo)志位打開
write1302(0x8e,0x00);//去掉DS1302保護(hù)
write1302(0x80,0x80);//當(dāng)它等于0X80時,讓DS1302時間停下來,以便調(diào)整
write1302(0x8e,0x80);//讓DS1302保護(hù)
while(!key);
}
}
break;
case 2: if(key==0)//-----------------------------進(jìn)入主時間小時調(diào)整功能
{
delay(100);
if(key==0)
{
yin++;//以下便進(jìn)行下一功能
b=1;//標(biāo)志位置1
a=0;
bbtsoud();
while(!key);
}
}
break;
case 3: if(key==0)//---------------------------進(jìn)入主時間分鐘時調(diào)整功能
{
delay(100);
if(key==0)
{
yin++;
b=0;
c=1;
bbtsoud();
while(!key);
}
}
break;
case 4: if(key==0)//---------------------------------進(jìn)入日期年調(diào)整功能
{
delay(100);
if(key==0)
{
yin++;
c=0;
d=1;
bbtsoud();
while(!key);
}
}
break;
case 5:if(key==0)//-----------------------------------進(jìn)入日期月調(diào)整功能
{
delay(100);
if(key==0)
{
yin++;
d=0;
e=1;
bbtsoud();
while(!key);
}
}
break;
case 6: if(key==0)//-----------------------------------進(jìn)入日期日調(diào)整功能
{
delay(100);
if(key==0)
{
yin++;
e=0;
f=1;
bbtsoud();
while(!key);
}
}
break;
case 7:if(key==0)//---------------------------------進(jìn)入日期星期調(diào)整功能
{
delay(100);
if(key==0)
{
yin++;
f=0;
g=1;
bbtsoud();
while(!key);
}
}
break;
case 8: if(key==0)//------------------------------進(jìn)入鬧鐘小時調(diào)整功能
{
delay(100);
if(key==0)
{
yin++;
g=0;
h=1;
bbtsoud();
while(!key);
}
}
break;
case 9:if(key==0)//------------------------------進(jìn)入鬧鐘分鐘調(diào)整功能
{
delay(100);
if(key==0)
{
yin++;
h=0;
i=1;
bbtsoud();
while(!key);
}
}
break;
case 10:if(key==0)//----------------------將系統(tǒng)全部復(fù)位,即回到主程序
{
delay(100);
if(key==0)
{
yin=0;//總計數(shù)器復(fù)位為0
i=0;//上次功能標(biāo)志位清0
flag=0;//主程序標(biāo)志位清0
TR1=1;//打開定時器
write1302(0x8e,0x00);//去掉DS1302保護(hù)
write1302(0x80,0x00);//當(dāng)它等于0X00時,讓時間就開始走 即0X00就讓時間開始走,0X80讓時停
write1302(0x8e,0x80);//讓時間停下來
bbtsoud();
while(!key);
}
}
break;
}
}
評論