帮忙看下我的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
1楼-- · 2019-03-25 19:55
原帖由 abo6016 于 2011-10-20 15:03 发表
终于弄出来了。。坑爹啊。。。帮我分析下原因
void send_byte(uchar dt) //发送1字节
{
uchar i;
ACC=dt;
//rst=0;
//sclk=0;
//rst=1;
for(i=0;i>1;
}这个函数中,for(i=0;i0;i--)他丫的就欢快的跑起来了啊 ...

终于找出原因了
刚看了下
ACC=dt;的汇编是mov a,r7;
然后如果i=0的话
汇编是 clr a; mov r7,a;
如果i=1的话
直接mov r7,1;

貌似我在自言自语;
恩,果然要学好汇编。
tt-2
2楼-- · 2019-03-26 00:51
也来学习一下,呵呵
辛昕
3楼-- · 2019-03-26 06:28
你确定一下人家串行位的发送顺序再说,......
David_Lee
4楼-- · 2019-03-26 09:43

原帖由 abo6016 于 2011-10-20 15:56 发表 终于找出原因了刚看了下 ACC=dt;的汇编是mov a,r7; 然后如果i=0的话汇编是 clr a; mov r7,a; 如果i=1的话直接mov r7,1; 貌似我在自言自语;恩,果然要学好汇编。

 

不要直接用内部寄存器ACC那些

很容易出事的

abo6016
5楼-- · 2019-03-26 10:54
 精彩回答 2  元偷偷看……
暖暖美少
6楼-- · 2019-03-26 15:11
借问下lz用的是什么处理器,我怎么也没看明白,2种写法都是控制循环8次,i 跟送去寄存器的值没有任何关系啊~~

一周热门 更多>