点阵万年历(带时间、年月日星期调整及闹钟功能)C程序
/******************************************************/
/**********年调整界面显示子程序(包括下半屏)************/
/******************************************************/
void xiannian(uchar nia)//变量年
{
uchar movee;
char ii;
for(line=8;line<16;line++)//扫描8次,即完成一个字的移动,line等于8,表示在下半屏显示
{
if(flag1==0)//如果标志位为1,则执行显示部分
{
movee=line-8;
BUF[0]=table[16+movee];//显示数字2
BUF[1]=table[movee];//显示数字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--)//循环5次将数发往显示屏
song(~BUF[ii]);//送数
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--)//循环5次将数发往显示屏
song(~BUF[ii]);//送数
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--)//循环5次将数发往显示屏
song(~BUF[ii]);//送数
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--)//循环5次将数发往显示屏
song(~BUF[ii]);//送数
LINE=table2[line];//打开行线,即174HC154行线端
CLKR=1;//在74HC595处锁存起来
CLKR=0;
CLKR=1;
delaya(800);
}
}
/******************************************************/
/***************按键按下后处理子程序*******************/
/******************************************************/
void skey()
{
if(shr!=0)//如果标志位shr不为0,则执行以下内容------如果按下了加按键则程序复位
{
if(key1==0)
{
delay(10);
if(key1==0)//如果加按键按下了,则全部复位
{
yin=0;//将按键计数器清0
shr=0;//标志位清0
lk=0;//显示上半屏,此变量是全屏与半屏控制变量,当它为8时,就执行全屏,否则半屏
clockbiao=~clockbiao;
bbtsoud();//蜂鸣器响一声子程序
while(!key1);//按键释放
}
}
}
if(a!=0)//如果标志位不为0,则执行以下内容-------闪烁进入调整模式
xianshan();//闪烁
if(b!=0)//如果标志位不为0,则执行以下内容,进行主时间小时调整
{
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));//时数据写入
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));//时数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x85);
shi=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
while(!key2);
}
}
}
if(c!=0)//如果标志位不为0,则执行以下内容------以下是处理主时间分钟调整部分
{
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));//分数据写入
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));//分数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x83);
fen=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);
while(!key2);
}
}
}
if(d!=0)//如果标志位不为0,则执行以下内容-----调整年
{
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));//年数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x8d);
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//年数据转换
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));//年数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x8d);
nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//年数据转换
while(!key2);
}
}
}
if(e!=0)//如果标志位不为0,则执行以下内容-----处理月
{
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));//月数据写入
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));//月数据写入
write1302(0x8e,0x80);//打开保护
readvalue=read1302(0x89);
yue=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//月转换
while(!key2);
}
}
}
评论