程序编译无错误无警告
问题是从不同寄存器读出来的数据显示出来貌似都是一样的,我不知道是哪个部分出问题了,是读还是写?
下面是程序
#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 编辑 ]
此帖出自小平头技术问答
终于找出原因了
刚看了下
ACC=dt;的汇编是mov a,r7;
然后如果i=0的话
汇编是 clr a; mov r7,a;
如果i=1的话
直接mov r7,1;
貌似我在自言自语;
恩,果然要学好汇编。
不要直接用内部寄存器ACC那些
很容易出事的
一周热门 更多>