16x64点阵+ds1302实时时钟.docx
- 文档编号:11614624
- 上传时间:2023-03-28
- 格式:DOCX
- 页数:25
- 大小:19.69KB
16x64点阵+ds1302实时时钟.docx
《16x64点阵+ds1302实时时钟.docx》由会员分享,可在线阅读,更多相关《16x64点阵+ds1302实时时钟.docx(25页珍藏版)》请在冰豆网上搜索。
16x64点阵+ds1302实时时钟
/**************************头文件***********************************************/
#include"STC12C5A60S2.h"
#include"macroandconst.h"
#include
/***************************接口定义**************************************/
sbitR=P2^2;//定义数据输入端口P2^0
sbitCLK=P2^0;//时钟信号
sbitSTB=P2^1;//595锁存信号
sbitkeymenue=P1^0;
sbitkeyup=P1^1;
sbitkeydown=P1^2;
sbitkeyswitch=P1^3;
sbitkeyok=P1^4;
/***************************调用外部变量与函数声明**************************************/
externucharcodetable[];
externucharcodetable1[];
externucharset;//按键选择标志位;
externcharkey_flag;//按键加减标志位;
externucharmenue;//菜单选择标志位;
externucharok;//确认标志位;
externcharmiao,fen,shi,ri,yue,zhou,nian;/*时间日期数值标志位;*/
externucharl_tmpDate[];//秒分时日月周年08-05-1512:
00:
00
externucharl_tmpdisplay[];
externvoidWrite_Ds1302(unsignedcharaddress,unsignedchardat);
externvoidRead_RTC(void);
intnum;
voidDelay10ms()//@11.0592MHz
{
unsignedchari,j;
i=108;
j=145;
do
{
while(--j);
}while(--i);
}
/*********************************按键扫描*******************************************/
voidkey()
{
/*判断选择按键是否按下;如果按下了当松开的时候让背光打开;set++;*/
if(keyswitch==0)
{
Delay10ms();
if(keyswitch==0)
{
Delay10ms();
while(keyswitch==0);
set++;
if(set>8){set=0;menue=0;}
}
}
/*up和down按键的检测;加减标志位*/
if(keyup==0)
{Delay10ms();
if(keyup==0)
{
Delay10ms();
while(keyup==0);
key_flag++;
}
}
if(keydown==0)
{Delay10ms();
if(keydown==0)
{
Delay10ms();
while(keydown==0);
key_flag--;
}
}
if(keymenue==0)
{
Delay10ms();
if(keymenue==0)//菜单选择标志位;
{
Delay10ms();
while(keymenue==0);
menue++;
if(menue>3)menue=0;
}
}
if(keyok==0)
{
Delay10ms();
if(keyok==0)//确认标志位;
{Delay10ms();
while(keyok==0);
ok++;
if(ok>1)
{
ok=0;
menue=0;
set=0;
}
}
}
}
/*************************595写数据部分***************************************/
voidWriteByte(uchardat)
{
uchari;
for(i=0;i<8;i++)//循环8次,把编码传给锁存器
{
dat=dat>>1;//右移一位,取出该字节的最低位
R=CY;//将该字节的最低位传给R
CLK=0;//上升沿将数据移入595
CLK=1;
}
}
voidwritebyteshuzi(ucharn)
{
WriteByte(~table[num+n*16]);
}
voidwritebytehanzi(ucharn)
{
WriteByte(~table1[2*num+n*32]);
WriteByte(~table1[2*num+n*32+1]);
}
/**************************调时部分****************************************/
voidset_date_time()
{
if(set==2)
{
menue=0;
miao=l_tmpdisplay[10]*10+l_tmpdisplay[11];
miao=miao+key_flag;
if((key_flag<0)&(miao==0))miao=59;
if(miao>59)miao=0;
miao=miao%10+(miao/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x80,miao);
Write_Ds1302(0x8E,0x80);
}
if(set==3)
{
menue=0;
fen=l_tmpdisplay[8]*10+l_tmpdisplay[9];
fen=fen+key_flag;
if(fen>59)
{
fen=0;
}
if((key_flag<0)&&(fen<0))
{
fen=59;
}
fen=fen%10+(fen/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x82,fen);
Write_Ds1302(0x8E,0x80);
}
if(set==4)
{menue=0;
shi=l_tmpdisplay[6]*10+l_tmpdisplay[7];
shi=shi+key_flag;
if(shi>23)shi=0;
if((key_flag<0)&&(shi<0))shi=23;
shi=shi%10+(shi/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x84,shi);
Write_Ds1302(0x8E,0x80);
}
if(set==5)
{
menue=1;
ri=l_tmpdisplay[4]*10+l_tmpdisplay[5];
ri=ri+key_flag;
if(ri>31)ri=1;
if((key_flag<0)&&(ri<1))ri=31;
ri=ri%10+(ri/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x86,ri);
Write_Ds1302(0x8E,0x80);
zhou=l_tmpdisplay[12];
zhou=zhou+key_flag;
if(zhou>7)zhou=1;
if((key_flag<0)&&(zhou<1))zhou=7;
zhou=zhou%10+(zhou/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x8A,zhou);
Write_Ds1302(0x8E,0x80);
}
if(set==6)
{
menue=1;
yue=l_tmpdisplay[2]*10+l_tmpdisplay[3];
yue=yue+key_flag;
if(yue>12)yue=1;
if((key_flag<0)&&(yue<1))yue=12;
yue=yue%10+(yue/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x88,yue);
Write_Ds1302(0x8E,0x80);
}
if(set==7)
{
{
menue=1;
nian=l_tmpdisplay[0]*10+l_tmpdisplay[1]+key_flag;;
if(nian>79)nian=0;
if((key_flag<0)&&(nian<0))nian=79;
nian=nian%10+(nian/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x8C,nian);
Write_Ds1302(0x8E,0x80);
}
}
if(set==8)
{
menue=2;
zhou=l_tmpdisplay[12];
zhou=zhou+key_flag;
if(zhou>7)zhou=1;
if((key_flag<0)&&(zhou<1))zhou=7;
zhou=zhou%10+(zhou/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x8A,zhou);
Write_Ds1302(0x8E,0x80);
}
key_flag=0;
}
/********************日期、时间、星期数据的转化******************************/
voiddata_change()
{
l_tmpdisplay[0]=l_tmpDate[6]/16;
l_tmpdisplay[1]=l_tmpDate[6]%16;//年;
l_tmpdisplay[2]=l_tmpDate[4]/16;
l_tmpdisplay[3]=l_tmpDate[4]%16;//月;
l_tmpdisplay[4]=l_tmpDate[3]/16;
l_tmpdisplay[5]=l_tmpDate[3]%16;//日;
l_tmpdisplay[6]=l_tmpDate[2]/16;
l_tmpdisplay[7]=l_tmpDate[2]%16;//小时;
l_tmpdisplay[8]=l_tmpDate[1]/16;
l_tmpdisplay[9]=l_tmpDate[1]%16;//分钟;
l_tmpdisplay[10]=l_tmpDate[0]/16;
l_tmpdisplay[11]=l_tmpDate[0]%16;//秒钟;
l_tmpdisplay[12]=l_tmpDate[5]%16;//显示当前星期;
}
/*********************************星期显示处理**********************************************/
voidweek()
{
if(l_tmpdisplay[12]==1)
{
writebyteshuzi(13);
writebytehanzi(7);
writebytehanzi(8);
writebytehanzi(0);
writebyteshuzi(13);
}
if(l_tmpdisplay[12]==2)
{
writebyteshuzi(13);
writebytehanzi(7);
writebytehanzi(8);
writebytehanzi
(1);
writebyteshuzi(13);
}
if(l_tmpdisplay[12]==3)
{
writebyteshuzi(13);
writebytehanzi(7);
writebytehanzi(8);
writebytehanzi
(2);
writebyteshuzi(13);
}
if(l_tmpdisplay[12]==4)
{
writebyteshuzi(13);
writebytehanzi(7);
writebytehanzi(8);
writebytehanzi(3);
writebyteshuzi(13);
}
if(l_tmpdisplay[12]==5)
{
writebyteshuzi(13);
writebytehanzi(7);
writebytehanzi(8);
writebytehanzi(4);
writebyteshuzi(13);
}
if(l_tmpdisplay[12]==6)
{
writebyteshuzi(13);
writebytehanzi(7);
writebytehanzi(8);
writebytehanzi(5);
writebyteshuzi(13);
}
if(l_tmpdisplay[12]==7)
{
writebyteshuzi(13);
writebytehanzi(7);
writebytehanzi(8);
writebytehanzi(6);
writebyteshuzi(13);
}
}
voidshijian()
{
writebyteshuzi(l_tmpdisplay[6]);//时;
writebyteshuzi(l_tmpdisplay[7]);
writebyteshuzi(11);
writebyteshuzi(l_tmpdisplay[8]);
writebyteshuzi(l_tmpdisplay[9]);//分;
writebyteshuzi(11);
writebyteshuzi(l_tmpdisplay[10]);
writebyteshuzi(l_tmpdisplay[11]);//秒;
}
voidriqi()
{
writebyteshuzi(l_tmpdisplay[0]);
writebyteshuzi(l_tmpdisplay[1]);//年;
writebyteshuzi(10);
writebyteshuzi(l_tmpdisplay[2]);
writebyteshuzi(l_tmpdisplay[3]);//月;
writebyteshuzi(10);
writebyteshuzi(l_tmpdisplay[4]);
writebyteshuzi(l_tmpdisplay[5]);//日;
}
/********************************主函数*********************************************/
voidmain()
{
//Set_RTC();
menue=0;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x90,0x80);
Write_Ds1302(0x8E,0x80);
while
(1)
{
key();
for(num=0;num<16;num++)
{
Read_RTC();//读取时钟
data_change();//时钟数据处理
set_date_time();
if(menue==0)
{
if(set==2)//调整标志位;
{
writebyteshuzi(l_tmpdisplay[6]);//时;
writebyteshuzi(l_tmpdisplay[7]);
writebyteshuzi(11);
writebyteshuzi(l_tmpdisplay[8]);
writebyteshuzi(l_tmpdisplay[9]);//分;
writebyteshuzi(11);
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[10]*16]));
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[11]*16]));
}
elseif(set==3)
{
writebyteshuzi(l_tmpdisplay[6]);//时;
writebyteshuzi(l_tmpdisplay[7]);
writebyteshuzi(11);
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[8]*16]));
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[9]*16]));
writebyteshuzi(11);
writebyteshuzi(l_tmpdisplay[10]);
writebyteshuzi(l_tmpdisplay[11]);//秒;
}
elseif(set==4)
{
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[6]*16]));
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[7]*16]));
writebyteshuzi(11);
writebyteshuzi(l_tmpdisplay[8]);
writebyteshuzi(l_tmpdisplay[9]);//分;
writebyteshuzi(11);
writebyteshuzi(l_tmpdisplay[10]);
writebyteshuzi(l_tmpdisplay[11]);//秒;
}
elseshijian();
}
elseif(menue==1)
{
if(set==5)//日期调整标志位;
{
writebyteshuzi(l_tmpdisplay[0]);//年;
writebyteshuzi(l_tmpdisplay[1]);
writebyteshuzi(10);
writebyteshuzi(l_tmpdisplay[2]);
writebyteshuzi(l_tmpdisplay[3]);//月;
writebyteshuzi(10);
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[4]*16]));
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[5]*16]));//日;
}
elseif(set==6)
{
writebyteshuzi(l_tmpdisplay[0]);//年;
writebyteshuzi(l_tmpdisplay[1]);
writebyteshuzi(10);
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[2]*16]));
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[3]*16]));//月;
writebyteshuzi(10);
writebyteshuzi(l_tmpdisplay[4]);
writebyteshuzi(l_tmpdisplay[5]);//日;
}
elseif(set==7)
{
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[0]*16]));
WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[1]*16]));//年;
writebyteshuzi(10);
writebyteshuzi(l_tmpdisplay[2]);
writebyteshuzi(l_tmpdisplay[3]);//月;
writebyteshuzi(10);
writebyteshuzi(l_tmpdisplay[4]);
writebyteshuzi(l_tmpdisplay[5]);//日;
}
elseriqi();
}
elseif(menue==2)
{
week();
}
elsemenue=0;
if((set<2)&&(menue==0))
{
if((l_tmpdisplay[10]*10+l_tmpdisplay[11]>11)&&(l_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 16 x64 点阵 ds1302 实时 时钟