帮忙看下我的DS1302程序哪里出问题了

2019-03-24 19:41发布

程序编译无错误无警告
问题是从不同寄存器读出来的数据显示出来貌似都是一样的,我不知道是哪个部分出问题了,是读还是写?
下面是程序
#include #include #include "Lcd.h" #define uchar unsigned char #define uint unsigned int sbit rst=P2^2; //复位线 sbit sclk=P2^0; //时钟线 sbit sda=P2^1; //数据线 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; uchar time_dat[7]={0x11,0x3,0x10,0x19,0x15,0x00,0x00}; //初始化 2011-10-19 15::00:00 uchar week[]={'M','o','n','T','u','e','W','e','d','T','h','r','F','r','i','S','a','t','S','u','n',}; //周一~日 void send_byte(uchar dt) //发送1字节 { uchar i; ACC=dt; //rst=0; //sclk=0; //rst=1; for(i=0;i<8;i++) { //if(dt&0x01) sda=1; //else sda=0; sda = ACC0; sclk=1; _nop_(); sclk=0; ACC=ACC>>1; } } uchar rec_byte(void) //读取1字节 { uchar i;//dt=0x00; for(i=0;i<8;i++) { sda=1; ACC = ACC >>1; /*相当于汇编中的 RRC */ ACC7 = sda; sclk=1; _nop_(); //F0=sda; //if(F0) dt=(dt|0x80)>>1; //else dt=dt>>1; sclk=0; } return ACC; } void send_1data(uchar dt,uchar address) // 指定寄存器写数据 { rst=0; sclk=0; rst=1; send_byte(address); send_byte(dt); sclk=1; rst=0; } uchar read_1data(uchar address) //指定寄存器读数据 { uchar dt; rst=0; sclk=0; rst=1; send_byte(address); dt=rec_byte(); sclk=1; rst=0; return dt; } // void d1302_init(void) //初始化,写入预订数据 { uchar p=0x80; uchar i; send_1data(0x00,0x8e); for(i=7;i>0;i--) { send_1data(time_dat[i-1],p); p=p+2; } send_1data(time_dat[6]&0x7f,0x80); send_1data(0x80,0x8e); } void Get_d1302(void) //读年月日星期时分秒数据 { uchar i; uchar p=0x81; for(i=7;i>0;i--) { time_dat[i-1]=read_1data(p); p=p+2; } } void time_display(void) //显示函数 { uchar i; uchar s[15]; Get_d1302(); s[0]='2'; s[1]='0'; s[4]='-'; s[7]='-'; s[2]=(time_dat[0]>>4)&0x0f; s[2]+=48; s[3]=time_dat[0]&0x0f ; s[3]+=48; s[5]=(time_dat[2]>>4)&0x0f ; s[5]+=48; s[6]=time_dat[2]&0x0f ; s[6]+=48; s[8]=(time_dat[3])>>4&0x0f; s[8]+=48; s[9]=time_dat[3]&0x0f; s[9]+=48; i=time_dat[1]-1; s[10]=' '; s[11]=week[i*3] ; s[12]=week[i*3+1] ; s[13]=week[i*3+2] ; s[14]=''; Lcdwrite_string(0,4,s); s[2]=s[5]=':'; s[8]=''; s[0]=(time_dat[4])>>4&0x0f; s[0]+=48; s[1]=(time_dat[4])&0x0f; s[1]+=48; s[3]=(time_dat[5])>>4&0x0f; s[3]+=48; s[4]=(time_dat[5])&0x0f ; s[4]+=48; s[6]=(time_dat[6])>>4&0x0f; s[6]+=48; s[7]=(time_dat[6])&0x0f; s[7]+=48; Lcdwrite_string(18,5,s); } 调了一天了出不来高手速度来围观啊。。。。
[ 本帖最后由 abo6016 于 2011-10-20 13:40 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
abo6016
2019-03-26 18:31
是STC89C52
有关系的,我后面也说了,在编译的时候,如果给I 赋0值,在汇编里是先CLR A,然后MOVE R7 A,但是因为之前把要发送的数据存储在ACC中,所以数据就丢失了,但是如果I是1开始的话,那么计数时是直接 MOVE R7 #1H,直接赋值的,所以才会出现这奇怪的现象,跟编译器有关,我用的是C51

一周热门 更多>