點陣萬年歷(帶時間、年月日星期調整及鬧鐘功能)C程序
/******************************************************/
/**********年調整界面顯示子程序(包括下半屏)************/
/******************************************************/
void xiannian(uchar nia)//變量年
{
uchar movee;
char ii;
for(line=8;line<16;line++)//掃描8次,即完成一個字的移動,line等于8,表示在下半屏顯示
{
if(flag1==0)//如果標志位為1,則執(zhí)行顯示部分
{
movee=line-8;
BUF[0]=table[16+movee];//顯示數(shù)字2
BUF[1]=table[movee];//顯示數(shù)字0
BUF[2]=table[(8*(nia/10))+movee];//顯示年十位
BUF[3]=table[(8*(nia%10))+movee];
BUF[4]=table1[16+movee];//顯示橫線
}
if(flag1==1)
yixianhei();//否則顯示黑屏
for(ii=4;ii>=0;ii--)//循環(huán)5次將數(shù)發(fā)往顯示屏
song(~BUF[ii]);//送數(shù)
LINE=table2[line];//打開行線,即174HC154行線端
CLKR=1;//在74HC595處鎖存起來
CLKR=0;
CLKR=1;
delaya(800);
}
}
/******************************************************/
/*********月/日調整界面顯示子程序(包括下半屏)********/
/******************************************************/
void xianriyue(uchar ye,uchar rii)//月與日變量
{
uchar movee;
char ii;
for(line=8;line<16;line++)//掃描8次,即完成一個字的移動,line等于8,表示在下半屏顯示
{
if(flag1==0)//同上如果為0就顯示,為1就黑屏,形成閃爍
{
movee=line-8;
BUF[0]=table[(8*(ye/10))+movee];//顯示月十位
BUF[1]=table[(8*(ye%10))+movee];//月個位
BUF[2]=table1[16+movee];//顯示橫線
BUF[3]=table[(8*(rii/10))+movee];//顯示日十位
BUF[4]=table[(8*(rii%10))+movee];//顯示橫線
}
if(flag1==1)//為1就黑屏顯示
yixianhei();
for(ii=4;ii>=0;ii--)//循環(huán)5次將數(shù)發(fā)往顯示屏
song(~BUF[ii]);//送數(shù)
LINE=table2[line];//打開行線,即174HC154行線端
CLKR=1;//在74HC595處鎖存起來
CLKR=0;
CLKR=1;
delaya(800);
}
}
/******************************************************/
/*********星期調整界面顯示子程序(包括下半屏)********/
/******************************************************/
void xi(uchar xi)
{
uchar movee;
char ii;
for(line=8;line<16;line++)//掃描8次,即完成一個字的移動,line等于8,表示在下半屏顯示
{
if(flag1==0)//0.5秒顯示
{
movee=line-8;
BUF[0]=table1[16+movee];//顯示橫線"-"
BUF[1]=table1[16+movee];//顯示橫線"-"
BUF[2]=table[(8*(xi%10))+movee];//顯示出星期個位
BUF[3]=table1[16+movee];//顯示橫線"-"
BUF[4]=table1[16+movee];//顯示橫線"-"
}
if(flag1==1)
yixianhei();
for(ii=4;ii>=0;ii--)//循環(huán)5次將數(shù)發(fā)往顯示屏
song(~BUF[ii]);//送數(shù)
LINE=table2[line];//打開行線,即174HC154行線端
CLKR=1;//在74HC595處鎖存起來
CLKR=0;
CLKR=1;
delaya(800);
}
}
/******************************************************/
/***************鬧鐘時間調整顯示子程序*****************/
/******************************************************/
void xianniao(uchar shi,uchar ge,uchar z)
{
char ii;
for(line=0;line<8;line++)//掃描8次,即完成一個字的移動
{
if(flag1==0)//同樣0.5秒顯示時間
{
BUF[0]=table[(8*(shi/10))+line];//顯示小時十位
BUF[1]=table[(8*(shi%10))+line];
BUF[2]=table1[z*8+line];//顯示橫線
BUF[3]=table[(8*(ge/10))+line];//顯示分鐘十位
BUF[4]=table[(8*(ge%10))+line];
}
if(flag1==1)//同樣0.5秒顯示黑屏
yixianhei();
for(ii=4;ii>=0;ii--)//循環(huán)5次將數(shù)發(fā)往顯示屏
song(~BUF[ii]);//送數(shù)
LINE=table2[line];//打開行線,即174HC154行線端
CLKR=1;//在74HC595處鎖存起來
CLKR=0;
CLKR=1;
delaya(800);
}
}
/******************************************************/
/***************按鍵按下后處理子程序*******************/
/******************************************************/
void skey()
{
if(shr!=0)//如果標志位shr不為0,則執(zhí)行以下內容------如果按下了加按鍵則程序復位
{
if(key1==0)
{
delay(10);
if(key1==0)//如果加按鍵按下了,則全部復位
{
yin=0;//將按鍵計數(shù)器清0
shr=0;//標志位清0
lk=0;//顯示上半屏,此變量是全屏與半屏控制變量,當它為8時,就執(zhí)行全屏,否則半屏
clockbiao=~clockbiao;
bbtsoud();//蜂鳴器響一聲子程序
while(!key1);//按鍵釋放
}
}
}
if(a!=0)//如果標志位不為0,則執(zhí)行以下內容-------閃爍進入調整模式
xianshan();//閃爍
if(b!=0)//如果標志位不為0,則執(zhí)行以下內容,進行主時間小時調整
{
xianshan();//調用主時間顯示子程序
if(key1==0)
{
delay(10);
if(key1==0)
{
xianshan();
shi++;
if(shi==24)//小時等于24?
shi=0;//清0
write1302(0x8e,0x00);//去掉保護
write1302(0x84,((shi/10)<<4)|(shi%10));//時數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護
readvalue=read1302(0x85);
shi=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//將小時轉換出來
while(!key1);
}
}
if(key2==0)//以下是處理主時間小時減部分
{
delay(10);
if(key2==0)
{
shi--;
if(shi==(0-1))
shi=23;
write1302(0x8e,0x00);//去掉保護
write1302(0x84,((shi/10)<<4)|(shi%10));//時數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護
readvalue=read1302(0x85);
shi=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
while(!key2);
}
}
}
if(c!=0)//如果標志位不為0,則執(zhí)行以下內容------以下是處理主時間分鐘調整部分
{
xianshan();
if(key1==0)//加分鐘部分
{
delay(10);
if(key1==0)
{
xianshan();//調用主時間顯示子程序
fen++;
if(fen==60)
fen=00;
write1302(0x8e,0x00);//去掉保護
write1302(0x82,((fen/10)<<4)|(fen%10));//分數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護
readvalue=read1302(0x83);
fen=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//將它轉換出來
while(!key1);
}
}
if(key2==0)//減分鐘部分
{
delay(10);
if(key2==0)
{
xianshan();
fen--;
if(fen==(0-1))
fen=59;
write1302(0x8e,0x00);//去掉保護
write1302(0x82,((fen/10)<<4)|(fen%10));//分數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護
readvalue=read1302(0x83);
fen=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
while(!key2);
}
}
}
if(d!=0)//如果標志位不為0,則執(zhí)行以下內容-----調整年
{
xiannian(nian);//調用年顯示子程序
if(key1==0)//年時間加部分處理
{
delay(10);
if(key1==0)
{
xiannian(nian);
nian++;
if(nian==99)//年到了99嗎?
nian=0;
write1302(0x8e,0x00);//去掉保護
write1302(0x8c,((nian/10)<<4)|(nian%10));//年數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護
readvalue=read1302(0x8d);
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//年數(shù)據(jù)轉換
while(!key1);
}
}
if(key2==0)//年時間減部分處理
{
delay(10);
if(key2==0)
{
xiannian(nian);
nian--;
if(nian==(0-1))
nian=99;
write1302(0x8e,0x00);//去掉保護
write1302(0x8c,((nian/10)<<4)|(nian%10));//年數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護
readvalue=read1302(0x8d);
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//年數(shù)據(jù)轉換
while(!key2);
}
}
}
if(e!=0)//如果標志位不為0,則執(zhí)行以下內容-----處理月
{
xianriyue(yue,ri);
if(key1==0)//月加部分處理
{
delay(10);
if(key1==0)
{
xianriyue(yue,ri);
yue++;
if(yue==13)
yue=1;
write1302(0x8e,0x00);//去掉保護
write1302(0x88,((yue/10)<<4)|(yue%10));//月數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護
readvalue=read1302(0x89);
yue=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
while(!key1);
}
}
if(key2==0)//月減部分處理
{
delay(10);
if(key2==0)
{
xianriyue(yue,ri);
yue--;
if(yue==(1-1))
yue=12;
write1302(0x8e,0x00);//去掉保護
write1302(0x88,((yue/10)<<4)|(yue%10));//月數(shù)據(jù)寫入
write1302(0x8e,0x80);//打開保護
readvalue=read1302(0x89);
yue=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//月轉換
while(!key2);
}
}
}
評論