死都做不出来的万年历

2019-07-15 20:07发布

郁闷了,做了一个月连和万年历都做不出来!好烦躁。现在把程序烧进自己制作的板子的单片机里,LCD显示时间部分有问号出现,我用的是DS1302的时钟芯片。要死了,不知道该怎么调试啊~~现在就是不能确定是程序问题还是板子问题。各位大神知道该怎么调试吗?附上时钟芯片的部分程序,各位看下有不有错~~求助。
sbit bit7=ACC^7;
sbit bit0=ACC^0;
sbit rst=P1^5;
sbit sclk=P1^6;
//sbit rst=P1^6;
//sbit sclk=P1^5;
sbit IO=P1^7;
void input(uchar);
uchar output(void);
void wr1302(uchar, uchar);
uchar re1302(uchar);
void set1302(uchar *p);
void get1302(uchar curtime[]);
uchar time[7];
void input(uchar date)
{
uchar i;
rst=1;
ACC=date;
for(i=8;i>0;i--)
{
IO=bit0;
sclk=0;
sclk=1;
ACC=ACC>>=1;
}
}
uchar output(void)
{
uchar i;
rst=1;
for(i=8;i>0;i--)
{
ACC=ACC>>=1;
IO=1;
sclk=1;
sclk=0;
bit7=IO;
}
return(ACC);
}
void wr1302(uchar add, uchar date)
{
rst=0;
sclk=0;
rst=1;
input(add);
input(date);
sclk=1;
rst=0;
}
uchar re1302(uchar add)
{
uchar date;
rst=0;
sclk=0;
rst=1;
input(add);
date=output();
sclk=1;
rst=0;
return(date);
}
void set1302(uchar *p)
{
uchar i;
uchar add=0x80;
wr1302(0x8e,0x00);
for(i=7;i>0;i--)
{
wr1302(add,*p);
p++;
add+=2;
}
wr1302(0x8e,0x00);
}
void get1302(uchar curtime[])
{
uchar i;
uchar add=0x81;
for(i=0;i<7;i++)
{
curtime[i]=re1302(add);
add+=2;
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
依然落叶飘零
2019-07-16 01:12
作为一个见习大神,本人确定帮你调试一下。一下给出几点建议:
第一:既然用C语言写程序了,就不要用到ACC,程序运行的时候经常用到ACC,因此你运行的时候很容易出错。
第二:IC通信的时候电平时序有一定的要求。写驱动的时候要严格遵守。
第三:写程序的时候注意一下格式。很多大神看到你的代码这样别人都不愿意看,更别说帮你解决问题了。
以下附改过的程序,亲测可用,运行正常:
  1. sbit rst=P3^5;
  2. sbit sclk=P3^6;
  3. sbit IO=P3^4;

  4. void input(uchar);
  5. uchar output(void);
  6. void wr1302(uchar, uchar);
  7. uchar re1302(uchar);
  8. void set1302(uchar *p);
  9. void get1302(uchar curtime[]);

  10. void input(uchar date)
  11. {
  12.         uchar i;
  13.         for(i=0;i<8;i++)
  14.         {
  15.                 sclk=0;
  16.                 IO = date&0x01;     //每次传输低字节
  17.              date >>= 1;                  //右移一位
  18.                 sclk=1;
  19.         }
  20. }

  21. uchar output(void)
  22. {
  23.         uchar i,result;
  24.         for(i=0;i<8;i++)
  25.         {

  26.                 if(IO)
  27.                 {
  28.                          result|=0x80;                        //每次传输低字节
  29.                 }
  30.                 sclk=0;
  31.                 result >>= 1;                        //右移一位
  32.                 _nop_();
  33.             _nop_();
  34.             _nop_();
  35.                 sclk=1;
  36.         }
  37.         return(result);
  38. }
  39. void wr1302(uchar add, uchar date)
  40. {
  41.         rst=0;
  42.         _nop_();
  43.         sclk=0;
  44.         _nop_();
  45.         rst=1;
  46.         _nop_();
  47.         input(add);
  48.         input(date);
  49.         rst=0;
  50. }
  51. uchar re1302(uchar add)
  52. {
  53.         uchar date;
  54.         rst=0;
  55.         _nop_();
  56.         sclk=0;
  57.         _nop_();
  58.         rst=1;
  59.         _nop_();
  60.         input(add);
  61.         date=output();
  62.         return(date);
  63. }
  64. void set1302(uchar *p)
  65. {
  66.         uchar i;
  67.         uchar add=0x80;
  68.         wr1302(0x8e,0x00);
  69.         for(i=7;i>0;i--)
  70.         {
  71.                 wr1302(add,*p);
  72.                 p++;
  73.                 add+=2;
  74.         }
  75.         wr1302(0x8e,0x00);
  76. }

  77. void get1302(uchar curtime[])
  78. {
  79.         uchar i;
  80.         uchar add=0x81;
  81.         for(i=0;i<7;i++)
  82.         {
  83.                 curtime[i]=re1302(add);
  84.                 add+=2;
  85.         }
  86. }
复制代码

一周热门 更多>