单片机/MCU论坛
直播中

EM_马铃薯

7年用户 31经验值
私信 关注

求助各位大神,为什么我的DS12C887写不进数据啊

除了分秒年份,小时月份周都只能写入134其他的写不进去,下面是源码,跪求大家帮忙
#include
#define u16 unsigned int
#define u8 unsigned char

//(共用P0作为DB)
//DS12C887
***it ds=P2^4;
***it rw=P2^5;
***it as=P2^6;
***it cs=P2^7;

//12864
***it RS=P2^3;
***it WOR=P2^2;
***it E=P2^1;
***it 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

回帖(3)

大海

2017-2-3 12:16:57

最佳答案

本帖最后由 ysh711 于 2017-2-3 13:24 编辑

可以考虑一下电路的连接是否正常,包括电压是否纯净等,这个需要细心核对。记得几年前做过887数码管时钟也出现过类似故障,反复查找也无果,因为是自己用洞洞板做的,最后重新换板子重新布局就OK了,至今原因也没明白,估计是干扰啥的。
举报

EM_马铃薯

2017-2-3 15:13:18
电压是USB电脑供电算纯净吗?
DS12C887DB0-7和51是拖焊的,12864飞线貌似都没这个问题啊,我程序有错吗?
举报

EM_马铃薯

2017-2-3 19:29:14
弄好了,可能是12864对DS12C887有干扰,写入的数据有问题
举报

更多回帖

发帖
×
20
完善资料,
赚取积分