//DS1302读写程序
1302六位数字钟实验报告 六位数字钟电路原理
1302六位数字钟实验报告 六位数字钟电路原理
1302六位数字钟实验报告 六位数字钟电路原理
void w(uchar u) //写入1位字节
{uchar i;
ACC = u;
for(i=8; i>0; i--)
{IO = ACC0;
CLK = 1;
CLK = 0;
ACC = ACC >> 1;
}}
uchar r(void) //读出1位字节
{uchar i;
for(i=8; i>0; i--)
{ACC = ACC >>1;
ACC7 = IO;
CLK = 1;
CLK = 0;
}return(ACC);
}void W1302(uchar ucAddr, uchar ucDa)
{RST = 0;
CLK = 0;
RST = 1;
w(ucAddr); // 地址,命令
w(ucDa); //写1Byte数据
CLK = 1;
RST = 0;
}void wclock(uchar p) //写入时钟多字节数据
{uchar i;
// W1302(0x80,0x00); //停止时钟
W1302(0x8e,0x00); // 允许写
RST=0;
CLK=0;
RST=1;
w(0xbe); //写多字节命令
for(i=8;i>0;i--)
{w(p); //按数组指针逐个写入,写入数据在主函数调用时指向b数组
p++;
}W1302(0x00,0x50); //启动定时器
CLK=1;
RST=0;
}void rclock(uchar p) //读出时钟多字节数据
{uchar i;
RST=0;
CLK=0;
RST=1;
w(0xbf);
for(i=7;i>0;i--)
{p=r();
p++;
}CLK=1;
RST=0;
}DS1302读写程序,供参考 以下定义口
it CLK=P2^3;
it IO=P2^4;
it RST=P2^5;
it ACC7=ACC^7;
it ACC0=ACC^0;
时间不走,一般是1302接的晶振未起振。
如果程序没错的话,出现乱码一般是接触不良,可以拿起来紧一下再试试,用洞洞板做电路很容易出现这个问题。
这说明你的读取时序是错的,你调整下你的延时或者读取时序可以了。
我以前也做过,当时的问题是51复位电路没接好,所以每次都要上电后复位一次。
如果你不是的话,估计就是读值没读出来。或者你的代表时间标量没有设置成全局变量。
#include
#include
unsigned char data dis_digit;
unsigned char key_s, key_v;
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char hour,min,sec;
unsigned char sec100;
it K1 = P1^0;
it K2 = P1^1;
//it JJ=P2^0;
bit scan_key();
void proc_key();
void inc_sec();
void inc_min();
void inc_hour();
void display();
void delayms(unsigned char ms);
void main(void)
{P0 = 0xff;
P3 = 0xff;
TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
TH1 = 0xdc;
TL1 = 0;
TH0 = 0xFC;
TL0 = 0x17;
hour = 12;
min = 00;
sec = 00;
sec100 = 0;
dis_buf[0] = dis_code[hour / 10]; // 时十位
dis_buf[1] = dis_code[hour % 10]; // 时个位
dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒个位
dis_buf[2] = 0xbf; // 显示"-"
dis_buf[5] = 0xbf; // 显示"-"
dis_digit = 0xfe;
dis_index = 0;
TCON = 0x01;
IE = 0x8a; // 使能timer0,1 中断
TR0 = 1;
TR1 = 1;
key_v = 0x03;
while(1)
{if(scan_key())
{delayms(10);
if(scan_key())
{key_v = key_s;
proc_key();
}}
}}
bit scan_key()
{key_s = 0x00;
key_s |= K2;
key_s <<= 1;
key_s |= K1;
return(key_s ^ key_v);
}void proc_key()
{EA = 0;
if((key_v & 0x01) == 0) // K1
{inc_hour();
// JJ=1;
}else if((key_v & 0x02) == 0) // K2
{min++;
// JJ=0;
if(min > 59)
{min = 0;
}dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
}EA = 1;
}void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
// 选通P2.0口数码管
// dis_buf --- 显于缓冲区基地址
{TH0 = 0xFC;
TL0 = 0x17;
P3 = 0xff; // 先关闭所有数码管
P0 = dis_buf[dis_index]; // 显示代码传送到P0口
P3 = dis_digit; //
dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
dis_index++; //
dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到个开始下一次扫描
}void timer1() interrupt 3
{TH1 = 0xdc;
sec100++;
if(sec100 >= 100)
{sec100 = 0;
inc_sec();
}}
void inc_sec()
{sec++;
if(sec > 59)
{sec = 0;
inc_min();
}dis_buf[6] = dis_code[sec / 10]; // 秒十位
dis_buf[7] = dis_code[sec % 10]; // 秒个位
}void inc_min()
{min++;
if(min > 59)
{min = 0;
inc_hour();
}dis_buf[3] = dis_code[min / 10]; // 分十位
dis_buf[4] = dis_code[min % 10]; // 分个位
}void inc_hour()
{hour++;
if(hour > 23)
{hour = 0;
}if(hour > 9)
dis_buf[0] = dis_code[hour / 10]; // 时十位
else
dis_buf[0] = 0xff; // 当小时的十位为0时不显示
dis_buf[1] = dis_code[hour % 10]; // 时个位
}void delayms(unsigned char ms)
// 延时子程序
{unsigned char i;
while(ms--)
{for(i = 0; i < 120; i++);
}}
电子钟相关毕业设计
·数字电子钟的电路设计 (字数:9242,页数:22 )·数字电子钟的设计与制作 (字数:8017,页数:22 )·数字钟的设计 (字数:6208,页数:21 )·基于8051单片机的数字钟 (字数:21638,页数:50)·基于单片机的电子时钟控制系统 (字数:7935,页数:42 )·数字电路数字钟设计 (字数:4846,页数:21 )·电子闹钟设计 (字数:4094,页数:19 )·定时闹钟设计 (字数:5714,页数:24 )·智能定时闹钟设计 (字数:3826,页数:18 )·下棋定时钟设计 (字数:5290,页数:24 )·多功能数字钟设计与制作 (字数:13129,页数:34)·基于单片机的电子钟设计 (字数:7710,页数:24 )·基于单片机的数字电子钟设计 (字数:10301,页数:42)·基于Labview的虚拟数字钟设计 (字数:17457,页数:32)·电子日历钟 (字数:10677,页数:33)·数字钟的设计与制作 (字数:4922,页数:23 )·单片机数字钟设计 (字数:15355,页数:47)·基于单片机的数字钟设计 (字数:12541,页数:27)·单片机定时闹钟设计 (字数:8450,页数:24 )·万年历可编程电子钟控电铃 (字数:14371.页数:41)·数字定时闹钟设计 (字数:7770,页数:28 )·基于EDA技术的数字电子钟设计 (字数:12247,页数:32)·多功能时钟打点系统设计 (字数:8353,页数:31 )·智能音乐闹钟设计 (字数:10002,页数:37)·基于AT89S51单片机的数字电子钟设计 (字数:14560,页数:39)
这个肯定是你怎么想的,怎么写的就怎么来呗,这还要问人呀
我的是1602显示的,很容易改成数码管的,给你参考一下。
#include
#include
#define uchar unsigned char
#define uint unsigned int
it lcrs=P2^2;//数据/命令
it lcwr=P2^1;//读/写
it lcden=P2^0;//使能
it SCLK = P2^5;//DS1302时钟口P1.0
it IO = P2^4; //DS1302数据口P1.1
it RS = P2^3; //DS1302片选口P1.2
it key1=P4^4;
it key2=P4^5;
it key3=P4^1;
it key4=P4^6;
//秒 分 时 日 月 星期 年
uchar init[] = {0x45, 0x40, 0x20, 0x018, 0x04, 0x03, 0x12};
uchar now[7];
uchar code table[]={48,49,50,51,52,53,54,55,56,57};
uchar dis[16];
uchar H;//定义小时
uchar Mi;//定义分钟
uchar S;//定义秒
uchar Y;//定义年
uchar Mo;//定义月
uchar D;//定义日期
uchar W;//定义星期
uchar key=0;
uchar bcdto(uchar temp);
void delayms(uint ms);
void DS1302_Initial();
void DS1302_SetTime(uchar p);
void DS1302_GetTime(uchar p);
////////////////////// 延时子程序/////////////////////////////
void delayms(uint ms) //在11.0592M晶振下,单周期指令的ms级延时
{uint i;
while(ms--)
{for(i = 0; i < 850; i++);
}}
//////1062/////////
void ydelay(uchar x)
{uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}void write_com(uchar com)
{P0=com;
lcwr=0;
lcrs=0;
lcden=0;
ydelay(20);
lcden=1;
ydelay(20);
lcden=0;
lcwr=1;
}void write_date(uchar date)//写数据
{P0=date;
lcwr=0;
lcrs=1;
lcden=0;
ydelay(20);
lcden=1;
ydelay(20);
lcden=0;
lcwr=1;
}void init1602()//初始化
{write_com(0x38);//设置显示模式
ydelay(40);
write_com(0x0c);//开显示
ydelay(40);
write_com(0x06);//指针和光标自动加一
ydelay(40);
write_com(0x01);//清屏指令
ydelay(40);
}void display(uchar a)//显示
{uint i;
dis[0]='2';dis[1]='0';dis[2]=table[Y/10];dis[3]=table[Y%10];
dis[4]='.';dis[5]=table[Mo/10];dis[6]=table[Mo%10];
dis[7]='.';dis[8]=table[D/10];dis[9]=table[D%10];dis[10]=' ';
dis[11]='W';dis[12]='e';dis[13]='e';dis[14]=' ';
dis[15]=table[W%10];
if(a==3)
{dis[2]=' ';dis[3]=' ';}
else if(a==4)
{dis[5]=' ';dis[6]=' ';}
else if(a==5)
{dis[8]=' ';dis[9]=' ';}
else if(a==6)
{dis[15]=' ';}
write_com(0x0c);
write_com(0xc0);
for(i=0;i<16;i++)
write_date(dis[i]);
dis[0]=table[H/10];dis[1]=table[H%10];dis[2]=':';
dis[3]=table[Mi/10]; dis[4]=table[Mi%10];dis[5]=':';
dis[6]=table[S/10];dis[7]=table[S%10];dis[8]=' ';
if(a==1)
{dis[0]=' ';dis[1]=' ';
}else if(a==2)
{dis[3]=' ';dis[4]=' ';}
write_com(0x80+4);
for(i=0;i<9;i++)
write_date(dis[i]);
}uchar tobcd(uchar temp)//十进制转换成BCD码
{uchar a,b,c;
a=temp;
b=0;
if(a>=10)
{while(a>=10)
{a=a-10;
b=b+16;
c=a+b;
temp=c;
}}
return temp;
}uchar bcdto(uchar temp)//BCD码转换成十进制
{uchar a,b,c;
a=temp;
b=0;
if(a>=16)
{while(a>=16)
{a=a-16;
b=b+10;
c=a+b;
temp=c;
}}
return temp;
}void keyf(uchar num,uchar up,uchar du)
{uint z;
if(key2==0)
{delayms(10);
if(key2==0)
{if(num>=up)
{if((key==4)||(key==5)||(key==6))
num=1;
else
num=0;
}else
num=num+1;
for(z=0;z<50;z++)
{display(0);
if(key2!=0)
break;
}while(!key2)
{for(z=0;z<25;z++)
{display(0);}
if(num>=up)
{if((key==4)||(key==5)||(key==6))
num=1;
else
num=0;
}else
num=num+1;
}}
}if(key3==0)
{delayms(10);
if(key3==0)
{if(num==du)
{if(key==1)
num=23;
else if(key==2)
num=59;
else if(key==3)
num=99;
else if(key==4)
num=12;
else if(key==5)
num=31;
else if(key==6)
num=7;
}else
num=num-1;
for(z=0;z<50;z++)
{display(0);
if(key3!=0)
break;
}while(!key3)
{for(z=0;z<25;z++)
{display(0);}
if(num==du)
{if(key==1)
num=23;
else if(key==2)
num=59;
else if(key==3)
num=99;
else if(key==4)
num=12;
else if(key==5)
num=31;
else if(key==6)
num=7;
}else
num=num-1;
}}
}}
void keyjc()
{uint i,j;
if(key1==0)
delayms(10);
if(key1==0)
{key++;
if(key>=7)
{key=0;
display(0);
}while(!key1);
if(key==1)
{for(i=0;i<25;i++)
{for(j=0;j<25;j++)
display(1);
for(j=0;j<25;j++)
display(0);
if((key2==0)||(key3==0))
{delayms(10);
if((key2==0)||(key3==0))
{i=0;
keyf(&H,23,0);
}}
if(key1==0)
{delayms(10);
if(key1==0)
{key=2;
while(!key1);
break;
}}
}}
if(key==2)
{for(i=0;i<25;i++)
{for(j=0;j<25;j++)
display(2);
for(j=0;j<25;j++)
display(0);
if((key2==0)||(key3==0))
{delayms(10);
if((key2==0)||(key3==0))
{i=0;
keyf(&Mi,59,0);
}}
if(key1==0)
{delayms(10);
if(key1==0)
{key=3;
while(!key1);
break;
}}
}}
if(key==3)
{for(i=0;i<25;i++)
{for(j=0;j<25;j++)
display(3);
for(j=0;j<25;j++)
display(0);
if((key2==0)||(key3==0))
{delayms(10);
if((key2==0)||(key3==0))
{i=0;
keyf(&Y,99,0);
}}
if(key1==0)
{delayms(10);
if(key1==0)
{key=4;
while(!key1);
break;
}}
}}
if(key==4)
{for(i=0;i<25;i++)
{for(j=0;j<25;j++)
display(4);
for(j=0;j<25;j++)
display(0);
if((key2==0)||(key3==0))
{delayms(10);
if((key2==0)||(key3==0))
{i=0;
keyf(&Mo,12,1);
}}
if(key1==0)
{delayms(10);
if(key1==0)
{key=5;
while(!key1);
break;
}}
}}
if(key==5)
{for(i=0;i<25;i++)
{for(j=0;j<25;j++)
display(5);
for(j=0;j<25;j++)
display(0);
if((key2==0)||(key3==0))
{delayms(10);
if((key2==0)||(key3==0))
{i=0;
keyf(&D,31,1);
}}
if(key1==0)
{delayms(10);
if(key1==0)
{key=6;
while(!key1);
break;
}}
}}
if(key==6)
{for(i=0;i<25;i++)
{for(j=0;j<25;j++)
display(6);
for(j=0;j<25;j++)
display(0);
if((key2==0)||(key3==0))
{delayms(10);
if((key2==0)||(key3==0))
{i=0;
keyf(&W,7,1);
}}
if(key1==0)
{delayms(10);
if(key1==0)
{key=0;
while(!key1);
break;
}}
}}
init[0]=tobcd(S);
init[1]=tobcd(Mi);
init[2]=tobcd(H);
init[3]=tobcd(D);
init[4]=tobcd(Mo);
init[5]=tobcd(W);
init[6]=tobcd(Y);
DS1302_SetTime(init);
key=0;
}}
void main()
{init1602();
DS1302_Initial(); //初始化DS1302
P4SW=0x70;
while (1)
{delayms(10);
DS1302_GetTime(now);//读取当前时间
Y=bcdto(now[6]);
Mo=bcdto(now[4]);
D=bcdto(now[3]);
W=bcdto(now[5]);
if(W==7)
W=8;
H=bcdto(now[2]);
Mi=bcdto(now[1]);
S=bcdto(now[0]);
display(0);
keyjc();
}}
/
延时X微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
/
void Delay()
{_nop_();
_nop_();
}/
从DS1302读1字节数据
/
uchar DS1302_ReadByte()
{uchar i;
uchar dat = 0;
for (i=0; i<8; i++) //8位计数器
{SCLK = 0; //时钟线拉低
Delay(); //延时等待
dat >>= 1; //数据右移一位
if (IO) dat |= 0x80; //读取数据
SCLK = 1; //时钟线拉高
Delay(); //延时等待
}return dat;
}/
向DS1302写1字节数据
/
void DS1302_WriteByte(uchar dat)
{char i;
for (i=0; i<8; i++) //8位计数器
{SCLK = 0; //时钟线拉低
Delay(); //延时等待
dat >>= 1; //移出数据
IO = CY; //送出到端口
SCLK = 1; //时钟线拉高
Delay(); //延时等待
}}
/
读DS1302某地址的的数据
/
uchar DS1302_ReadData(uchar addr)
{uchar dat;
RS = 0;
Delay();
SCLK = 0;
Delay();
RS = 1;
Delay();
DS1302_WriteByte(addr); //写地址
dat = DS1302_ReadByte(); //读数据
SCLK = 1;
RS = 0;
return dat;
}/
往DS1302的某个地址写入数据
/
void DS1302_WriteData(uchar addr, uchar dat)
{RS = 0;
Delay();
SCLK = 0;
Delay();
RS = 1;
Delay();
DS1302_WriteByte(addr); //写地址
DS1302_WriteByte(dat); //写数据
SCLK = 1;
RS = 0;
}/
写入初始时间
/
void DS1302_SetTime(uchar p)
{uchar addr = 0x80;
uchar n = 7;
DS1302_WriteData(0x8e, 0x00); //允许写作
while (n--)
{DS1302_WriteData(addr, p++);
addr += 2;
}DS1302_WriteData(0x8e, 0x80); //写保护
}/
读取当前时间
/
void DS1302_GetTime(uchar p)
{uchar addr = 0x81;
uchar n = 7;
while (n--)
{p++ = DS1302_ReadData(addr);
addr += 2;
}}
/
初始化DS1302
/
void DS1302_Initial()
{RS = 0;
SCLK = 0;
DS1302_WriteData(0x8e, 0x00);
DS1302_WriteData(0x80, 0x00);
DS1302_WriteData(0x90, 0xaa);
DS1302_WriteData(0x8e, 0x80);
}
用Protues仿真的,看不清可以留个邮箱,我把整体发给你
#include
#define uchar unsigned char
#define uint unsigned int
it rs=P2^0; //数据、命令选择端
it lcden=P2^2; // 使能信号
it lcdew=P2^1; // 读写选择端
it s1=P1^5; //功能键设定
it s2=P1^6; // 增大键设定
it s3=P1^7; // 减小键设定
it beep=P3^3; // 蜂鸣器设定 /
it RST=P1^2; //ds1302 设定
it SCLK=P1^0;
it IO=P1^1;
it ACC0 = ACC^0;
it ACC7 = ACC^7;
uchar num[8],enter,shi,fen,miao,nian,yue,ri,week,shi1,fen1,flag1=0,flag2=0,flag3,cho,
time[]="20XX-XX-XX XXX ", //年月日字符数组
time1[]=" xx:xx:xx ", //时分秒字符数组
time3[]="@ NO 00:00:00"; //闹钟设定时显示的时间数组
void delay(uint z) //1ms延时函数
{uint x,y;
for(x=z;x>0;x--)
for(y=1;y>0;y--);
}void di() //蜂鸣设定函数
{beep=0;
delay(800);
beep=1;
}uchar read(uchar x) //读ds1302数据
{uchar i;
RST=0;
SCLK=0;
RST=1;
ACC=(x|0x01);
for(i=8;i>0;i--)
{IO=ACC0;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}for(i=8;i>0;i--)
{ACC=ACC>>1;
ACC7=IO;
SCLK=1;
SCLK=0;
}SCLK=1;
RST=0;
return ACC;
}void write (uchar addr,uchar dat) //向ds1302写数据
{uchar i;
RST=0;
SCLK=0;
RST=1;
ACC=addr;
for(i=8;i>0;i--)
{IO=ACC0;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}ACC=dat;
for(i=8;i>0;i--)
{IO=ACC0;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}SCLK=1;
RST=0;
}void getnum() //接收ds1302的数据
{uchar j;
for(j=0;j<7;j++)
{num[j]=read(0x80+0x02j);
}time[2]=((num[6]&0x70)>>4)+'0';//年
time[3]=(num[6]&0x0f)+'0'; nian=((num[6]&0x70)>>4)10+(num[6]&0x0f);
time[5]=((num[4]&0x70)>>4)+'0';//yue
time[6]=(num[4]&0x0f)+'0'; yue=((num[4]&0x70)>>4)10+(num[4]&0x0f);
time[8]=((num[3]&0x70)>>4)+'0';//ri
time[9]=(num[3]&0x0f)+'0'; ri=((num[3]&0x70)>>4)10+(num[3]&0x0f);
time[13]=(num[5]&0x0f)+'0';//week
week=(num[5]&0x0f);
switch(time[13]) //星期字符数组赋值
{case '1': time[12]='S'; time[13]='u'; time[14]='n';
break;
case '2': time[12]='M'; time[13]='o'; time[14]='n';
break;
case '3': time[12]='T'; time[13]='u'; time[14]='e';
break;
case '4': time[12]='W'; time[13]='e'; time[14]='d';
break;
case '5': time[12]='T'; time[13]='h'; time[14]='u';
break;
case '6': time[12]='F'; time[13]='r'; time[14]='i';
break;
case '7': time[12]='S'; time[13]='a'; time[14]='t';
break;
}time1[5]=((num[2]&0x70)>>4)+'0'; //shi
time1[6]=(num[2]&0x0f)+'0'; shi=((num[2]&0x70)>>4)10+(num[2]&0x0f);
time1[8]=((num[1]&0x70)>>4)+'0'; //fen
time1[9]=(num[1]&0x0f)+'0'; fen=((num[1]&0x70)>>4)10+(num[1]&0x0f);
time1[11]=((num[0]&0x70)>>4)+'0'; //miao
time1[12]=(num[0]&0x0f)+'0'; miao=((num[0]&0x70)>>4)10+(num[0]&0x0f);
}void write_com(uchar com) //写入lcd显示方式
{rs=0;
P0=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}void write_data(uchar date) //向lcd1602写入数据
{rs=1;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}void display() //显示数据
{uchar i;
write_com(0x0c); //显示方式设定为:无光标,且不闪烁
if(flag2==1)
time1[0]='@'; //闹钟图标设定
else
time1[0]=' ';
if(flag1==0) //flag为0时正常显示年、月、日、时、分、秒等
{write_com(0x80);
for(i=0;time[i]!='0';i++)
{write_data(time[i]);
}write_com(0xc0);
for(i=0;time1[i]!='0';i++)
{write_data(time1[i]);
}}
if(flag1==1) //flag为1时进入时间设定界面
{time3[8]=fen1/10+'0'; time3[9]=fen1%10+'0';
time3[5]=shi1/10+'0';time3[6]=shi1%10+'0';
if(cho==0)
{time3[2]='N';time3[3]='O';
}if(cho==1)
{time3[2]='O'; time3[3]='K';
}write_com(0xc0);
for(i=0;time3[i]!='0';i++)
{write_data(time3[i]);
}} }
void keyscan() // 扫描键盘
{getnum();
if(s1==0) //功能键被按下 write_com(0x0c);
{delay(10);
if(s1==0)
{enter++; //记录摁下次数
if(flag1==1&&enter==6)
enter=2;
if(flag1==0&&enter==9)
enter=0;
while(s1==0); di(); //按键放下时响一下
}}
switch(enter)
{case 0: write_com(0x0c); break;
case 1: write_com(0xcc); write_com(0x0e); delay(7); //按秒 时 有光标
break;
case 2: write_com(0xc9); write_com(0x0e); delay(7); //分
break;
case 3: write_com(0xc6); write_com(0x0e); delay(7); //时
break;
case 4: if(flag1==0)
{write_com(0x8e); write_com(0x0e); delay(7); //星期
}if(flag1==1)
{write_com(0xc3); write_com(0x0e); delay(7); //NO、OK选项闪烁
}break;
case 5: if(flag1==0)
{write_com(0x89); write_com(0x0e); delay(7); //日闪烁
}if(flag1==1)
{write_com(0xc0); write_com(0x0e); delay(7); //时钟标志闪烁
}break;
case 6: write_com(0x86); write_com(0x0e); delay(7); //月
break;
case 7: write_com(0x83); write_com(0x0e); delay(7); //年
break;
case 8: write_com(0x0c);write_com(0xc0); write_data('@');
if(flag1==0) write_com(0xc0);
else write_com(0xc9); write_com(0x0e); delay(7); //闹钟
break;
}if(enter!=0&&s2==0)
{delay(10);
if(enter!=0&&s2==0)
{switch(enter)
{case 1: miao++; if(miao==60) miao=0;
write(0x80,(miao/100x10+miao%10)); //秒
break;
case 2: if(flag1==0)
{fen++; if(fen==60) fen=0;
write(0x82,((fen/10)0x10+fen%10)); //分
}if(flag1==1)
{fen1++; if(fen1==60) fen1=0;
}break;
case 3: if(flag1==0)
{shi++; if(shi==24) shi=0;
write(0x84,(shi/100x10+shi%10)); //时
}if(flag1==1)
{shi1++; if(shi1==24) shi1=0;
}break;
case 4: if(flag1==0)
{week++; if(week==8) week=1;
write(0x8a,(week/100x10+week%10)); //星期
}if(flag1==1)
{cho++; if(cho==2) cho=0;
}break;
case 5: if(flag1==0)
{ri++; if(ri==32) ri=1;
write(0x86,(ri/100x10+ri%10)); //日
}if(flag1==1)
{if(cho==0) flag2=0;
if(cho==1) flag2=1;
enter=0; flag1=0;
}break;
case 6: yue++; if(yue==13) yue=1;
write(0x88,(yue/100x10+yue%10)); //月
break;
case 7: nian++; if(nian==99)nian=0;
write(0x8c,(nian/100x10+nian%10)); //年
break;
case 8: flag1=1; enter=2;display(); break; //进入闹钟设置界面
}while(s2==0); di(); //按键放下时响一下
}}
if(enter!=0&&s3==0)
{delay(10);
if(enter!=0&&s3==0)
{switch(enter)
{case 1: miao--; if(miao==-1) miao=59;
write(0x80,(miao/100x10+miao%10)); //秒
break;
case 2:if(flag1==0)
{fen--; if(fen==-1) fen=59;
write(0x82,((fen/10)0x10+fen%10)); //分
}if(flag1==1)
{fen1--; if(fen1==-1) fen1=59;
}break;
case 3: if(flag1==0)
{shi--; if(shi==-1) shi=23;
write(0x84,(shi/100x10+shi%10)); //时
}if(flag1==1)
{shi1--; if(shi1==-1) shi1=23;
}break;
case 4: if(flag1==0)
{week--; if(week==0) week=7;
write(0x8a,(week/100x10+week%10)); //星期
}if(flag1==1)
{cho--; if(cho==-1) cho=1;
}break;
case 5: if(flag1==0)
{ri--; if(ri==0) ri=31;
write(0x86,(ri/100x10+ri%10)); //日
}if(flag1==1)
{if(cho==0) flag2=0;
if(cho==1) flag2=1;
enter=0; flag1=0;
}break;
case 6: yue--; if(yue==0) yue=12;
write(0x88,(yue/100x10+yue%10)); //月
break;
case 7: nian--; if(nian==-1) nian=99;
write(0x8c,(nian/100x10+nian%10)); //年
break;
case 8: flag1=1; break; //进入闹钟设置界面
}while(s3==0); di(); //按键放下时响一下
}}
}void init() //初始化
{// beep=0;
lcden=0; // lcd信号使能端设定
lcdew=0; //lcd读写选择端设定
RST=0;
SCLK=1;
write_com(0x38);
write_com(0x0c);
write_com(0x06); // lcd初始化
write_com(0x01);
write_com(0x80); //显示“20”
write_data(time[0]); write_data(time[1]);
write_com(0x84); //显示“—”
write_data(time[4]);
write_com(0x87); //显示“—”
write_data(time[7]);
write_com(0xc7); //显示“:”
write_data(time1[7]);
write_com(0xca); //显示“:”
write_data(time1[10]);
}void main()
{init(); //初始化
while(1)
{if(fen1!=fen) flag3=0;
getnum();
while(flag2==1&&enter==0&&shi1==shi&&fen1==fen&&flag3==0)
{di();delay(200);di();delay(600);
getnum();display();
if(s1==0||s2==0||s3==0)
{delay(10);
flag3=1;
while(s1==0||s2==0||s3==0) ;
}enter=0;
}display();
keyscan();
}}
这个很简单,因为现在的DS1302可以向后计100年,所以,不用担心器件的计时问题,你要作的就是写程序将DS1302内部署的各个寄存器中(包括,年,月,日,时,分,秒,星期)的值读出来,并显示在数码管或显示屏上就可以了.
唉,又一个写的。。。
版权声明:本文内容由互联。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发 836084111@qq.com 邮箱删除。