求助各位大神,为什么我的DS12C887写不进数据啊
时间:10-02
整理:3721RD
点击:
除了分秒年份,小时月份周都只能写入134其他的写不进去,下面是源码,跪求大家帮忙
#include <REG52.H>
#define u16 unsigned int
#define u8 unsigned char
//(共用P0作为DB)
//DS12C887
sbit ds=P2^4;
sbit rw=P2^5;
sbit as=P2^6;
sbit cs=P2^7;
//12864
sbit RS=P2^3;
sbit WOR=P2^2;
sbit E=P2^1;
sbit PSB=P2^0;
u8 code tablenum[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};//0123456789abcdef
u8 ds_dat;
u8 read_DS12C887(u8 add);//读数据
void write_DS12C887(u8 add,u8 dat);//写命令
void display_s();//显示时间
void set_time();//设置时间
//12864
void init_12864();//初始化
void command(u8 x);//写命令
void dat(u8 y);//写数据
void location(u8 x,u8 y);//位置x<=8,y<=4
void delay(u16 x);
void main()
{
init_12864();
write_DS12C887(0x0a,0x20);
write_DS12C887(0x0b,0x26);
set_time();
while(1)
{
location(1,1);
read_DS12C887(0x09);//年显示17
display_s();
read_DS12C887(0x08);//月显示31
display_s();
read_DS12C887(0x07);//日显示03
display_s();
read_DS12C887(0x06);//星期显示04
display_s();
read_DS12C887(0x04);//小时显示12
display_s();
read_DS12C887(0x02);//分钟显示35
display_s();
read_DS12C887(0x00);//秒
display_s();
}
}
void write_DS12C887(u8 add,u8 dat)//DS12写数据
{
ds=1;
rw=1;
as=1;
cs=0;
P0=add;
as=0;
rw=0;
P0=dat;
rw=1;
cs=1;
as=1;
}
u8 read_DS12C887(u8 add)//DS12读数据
{
ds=1;
rw=1;
as=1;
cs=0;
P0=add;
as=0;
ds=0;
P0=0xff;
ds_dat=P0;
cs=1;
ds=1;
as=1;
return ds_dat;
}
void display_s()
{
u8 ge,shi;
ge=shi=0;
shi=ds_dat/10;
ge=ds_dat%10;
dat(tablenum[shi]);
dat(tablenum[ge]);
dat(' ');
}
void set_time()
{
write_DS12C887(0x00,0x00); //秒
write_DS12C887(0x02,0x17); //分
write_DS12C887(0x04,0x0c); //小时
write_DS12C887(0x06,0x05); //星期
write_DS12C887(0x07,0x03); //日
write_DS12C887(0x08,0x02); //月
write_DS12C887(0x09,0x11); //年
}
void delay(u16 x)//延时
{
u16 a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
//12864
void location(u8 x,u8 y)//定位
{
u8 a;
switch(y)
{
case(1): a=0x80+(x-1);break;
case(2): a=0x90+(x-1);break;
case(3): a=0x88+(x-1);break;
case(4): a=0x98+(x-1);break;
}
command(a);
}
void init_12864()//初始化
{
delay(40);
PSB=1;
delay(1);
WOR=0;
RS=0;
E=0;
delay(5);
command(0x30);//功能设定
delay(100);
command(0x30);//功能设定
delay(60);
command(0x01);//清屏
delay(160);
command(0x06);//游标右移
delay(100);
command(0x0c);//显示开关
delay(100);
}
void command(u8 x)//写命令
{
WOR=0;
RS=0;
delay(2);
P0=x;
E=1;
delay(2);
E=0;
}
void dat(u8 x)//写数据
{
WOR=0;
RS=1;
delay(2);
P0=x;
E=1;
delay(2);
E=0;
}
不知道问什么有时候写的进有时候写不进,而且秒有时候到60有时候要跳到90才能进1
#include <REG52.H>
#define u16 unsigned int
#define u8 unsigned char
//(共用P0作为DB)
//DS12C887
sbit ds=P2^4;
sbit rw=P2^5;
sbit as=P2^6;
sbit cs=P2^7;
//12864
sbit RS=P2^3;
sbit WOR=P2^2;
sbit E=P2^1;
sbit PSB=P2^0;
u8 code tablenum[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};//0123456789abcdef
u8 ds_dat;
u8 read_DS12C887(u8 add);//读数据
void write_DS12C887(u8 add,u8 dat);//写命令
void display_s();//显示时间
void set_time();//设置时间
//12864
void init_12864();//初始化
void command(u8 x);//写命令
void dat(u8 y);//写数据
void location(u8 x,u8 y);//位置x<=8,y<=4
void delay(u16 x);
void main()
{
init_12864();
write_DS12C887(0x0a,0x20);
write_DS12C887(0x0b,0x26);
set_time();
while(1)
{
location(1,1);
read_DS12C887(0x09);//年显示17
display_s();
read_DS12C887(0x08);//月显示31
display_s();
read_DS12C887(0x07);//日显示03
display_s();
read_DS12C887(0x06);//星期显示04
display_s();
read_DS12C887(0x04);//小时显示12
display_s();
read_DS12C887(0x02);//分钟显示35
display_s();
read_DS12C887(0x00);//秒
display_s();
}
}
void write_DS12C887(u8 add,u8 dat)//DS12写数据
{
ds=1;
rw=1;
as=1;
cs=0;
P0=add;
as=0;
rw=0;
P0=dat;
rw=1;
cs=1;
as=1;
}
u8 read_DS12C887(u8 add)//DS12读数据
{
ds=1;
rw=1;
as=1;
cs=0;
P0=add;
as=0;
ds=0;
P0=0xff;
ds_dat=P0;
cs=1;
ds=1;
as=1;
return ds_dat;
}
void display_s()
{
u8 ge,shi;
ge=shi=0;
shi=ds_dat/10;
ge=ds_dat%10;
dat(tablenum[shi]);
dat(tablenum[ge]);
dat(' ');
}
void set_time()
{
write_DS12C887(0x00,0x00); //秒
write_DS12C887(0x02,0x17); //分
write_DS12C887(0x04,0x0c); //小时
write_DS12C887(0x06,0x05); //星期
write_DS12C887(0x07,0x03); //日
write_DS12C887(0x08,0x02); //月
write_DS12C887(0x09,0x11); //年
}
void delay(u16 x)//延时
{
u16 a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
//12864
void location(u8 x,u8 y)//定位
{
u8 a;
switch(y)
{
case(1): a=0x80+(x-1);break;
case(2): a=0x90+(x-1);break;
case(3): a=0x88+(x-1);break;
case(4): a=0x98+(x-1);break;
}
command(a);
}
void init_12864()//初始化
{
delay(40);
PSB=1;
delay(1);
WOR=0;
RS=0;
E=0;
delay(5);
command(0x30);//功能设定
delay(100);
command(0x30);//功能设定
delay(60);
command(0x01);//清屏
delay(160);
command(0x06);//游标右移
delay(100);
command(0x0c);//显示开关
delay(100);
}
void command(u8 x)//写命令
{
WOR=0;
RS=0;
delay(2);
P0=x;
E=1;
delay(2);
E=0;
}
void dat(u8 x)//写数据
{
WOR=0;
RS=1;
delay(2);
P0=x;
E=1;
delay(2);
E=0;
}
不知道问什么有时候写的进有时候写不进,而且秒有时候到60有时候要跳到90才能进1
可以考虑一下电路的连接是否正常,包括电压是否纯净等,这个需要细心核对。记得几年前做过887数码管时钟也出现过类似故障,反复查找也无果,因为是自己用洞洞板做的,最后重新换板子重新布局就OK了,至今原因也没明白,估计是干扰啥的。
电压是USB电脑供电算纯净吗?
DS12C887DB0-7和51是拖焊的,12864飞线貌似都没这个问题啊,我程序有错吗?
弄好了,可能是12864对DS12C887有干扰,写入的数据有问题