对DS12C887仿真的时候就只显示最近的时间,就是不走。
因为带字库的12864仿真不了,所以只仿真887。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdne=P3^5;
sbit lcdrs=P3^7;
sbit lcdrw=P3^6;
/*DS12C887时实时钟芯片使能位定义*/
sbit dscs=P1^7;
sbit dsas=P1^6;
sbit dsrw=P1^5;
sbit dsds=P1^4;
char e[]="星期";
char f[]="时";
char g[]="分";
char h[]="秒";
char s1[]="一";
char s2[]="二";
char s3[]="三";
char s4[]="四";
char s5[]="五";
char s6[]="六";
char s7[]="日";
void write_ds(uchar add,uchar date);
void write_com(uchar com);
void write_date(uchar date);
uchar miao,shi,fen,xq,ri,yue,nian;
//**屏蔽内容**屏蔽内容****/
void delay(uchar i)
{
for(;i>0;i--);
}
//*屏蔽内容**屏蔽内容***/
void delay1(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//*屏蔽内容*****887intel总线写时序***屏蔽内容***/
void write_ds(uchar add,uchar date)
{
dscs=0;
dsds=1;
dsrw=1;
dsas=1;
P0=add;
dsas=0;
dsrw=0;
P0=date;
dsrw=1;
dsas=1;
dscs=1;
}
/*void set_time()
{
write_ds(0x0A,0x20);
write_ds(0x0B,0x26);//第一次使用时钟时打开振荡器用的
write_ds(2,18);//初始化分钟
write_ds(4,19);//初始化小时
write_ds(9,9);//初始化年
write_ds(8,3);//初始化月
write_ds(7,30);//初始化日
write_ds(6,1);
} */
//*屏蔽内容******887intel总线读时序**屏蔽内容***/
uchar read_ds(uchar add)
{
uchar ds_date;
dscs=0;
dsrw=1;
dsds=1;
dsas=1;
P0=add;
dsas=0;
dsds=0;
P0=0xff;
ds_date=P0;
dsds=1;
dsas=1;
dscs=1;
return ds_date;
}
/*//DS12C887初始化函数
void ds_int()
{
dsas=0; dsds=0; dsrw=0;
write_ds(0x0a,0x20);//DS12CR887寄存器A功能设置,开启时钟振荡器
write_ds(0x0b,0x06);//寄存器B功能设置,不开启闹钟中断使能,数据模式为二进制,24小时模式。
//ds_write(4,0x8);ds_write(2,0x00);ds_write(0,0x00); //给DS12CR887的时分秒赋值,开机后显示8:00:00
}*/
//*屏蔽内容**12864忙检测***屏蔽内容*/
void buys()
{
P2=0xff;
lcdrs=0;
lcdrw=1;
lcdne=1;
if(P0^7==1)
delay1(2);
lcdne=0;
}
//*屏蔽内容***12864写命令***屏蔽内容*/
void write_com(uchar com)
{
buys();
lcdrw=0;
lcdrs=0;
lcdne=1;
delay1(2);
P2=com;
delay1(2);
lcdne=0;
P2=0xff;
}
//*屏蔽内容***12864写数据***屏蔽内容*/
void write_date(uchar date)
{
buys();
lcdrw=0;
lcdrs=1;
lcdne=1;
delay1(2);
P2=date;
delay1(2);
lcdne=0;
delay1(2);
P2=0xff;
}
//*屏蔽内容***12864初始化***屏蔽内容*/
void init()
{
delay(50);
write_com(0x30);
write_com(0x06);
write_com(0x0c);
write_com(0x00);
write_com(0x06);
}
void write_sfs(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x88+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
//*屏蔽内容***星期显示地址,数据***屏蔽内容**//
void write_sfq(uchar add,uchar date)
{
uchar i;
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x90+add);
if(ge==1)
{
for(i=0;i<2;i++)
write_date(s1[i]);
}
else if(ge==2)
{
for(i=0;i<2;i++)
write_date(s2[i]);
}
else if(ge==3)
{
for(i=0;i<2;i++)
write_date(s3[i]);
}
else if(ge==4)
{
for(i=0;i<2;i++)
write_date(s4[i]);
}
else if(ge==5)
{
for(i=0;i<2;i++)
write_date(s5[i]);
}
else if(ge==6)
{
for(i=0;i<2;i++)
write_date(s6[i]);
}
else if(ge==7)
{
for(i=0;i<2;i++)
write_date(s7[i]);
}
}
//*屏蔽内容****日显示地址,数据***屏蔽内容****
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
//*屏蔽内容**屏蔽内容**屏蔽内容**屏蔽内容**屏蔽内容**屏蔽内容**屏蔽内容**屏蔽内容**/
void main()
{
uchar i;
delay1(50);
init();
//ds_int();
//set_time();
write_com(0x90+0x03);
for(i=0;i<4;i++)
write_date(e[i]);
write_com(0x80+1);
write_date(2+48);
write_date(48);
write_com(0x88+0x02);
for(i=0;i<2;i++)
write_date(f[i]);
write_com(0x88+4);
for(i=0;i<2;i++)
write_date(g[i]);
write_com(0x88+6);
for(i=0;i<2;i++)
write_date(h[i]);
while(1)
{
miao=read_ds(0); //读秒
write_sfs(5,miao);
fen=read_ds(2); //读分
write_sfs(3,fen);
shi=read_ds(4); //读时
write_sfs(1,shi);
xq=read_ds(6); //读星期
write_sfq(5,xq);
ri=read_ds(7); //读日
write_sfm(6,ri);
yue=read_ds(8); //读月
write_sfm(4,yue);
nian=read_ds(9); //读年
write_sfm(2,nian);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>