菜鸟求大神——关于ds1302中的诡异事情
写了个ds1302+lcd1602的程序来作电子时钟,可是程序写完了,检查科很久都发现问题,就是时钟不走动,昨天刚把ds1302中的for循环里的i改成8-0递减就正常了,求大神帮我看看是哪里出错了#include<reg52.h>
#define uchar unsignedchar
#define uint unsigned int
ucharsec1,sec2,min1,min2,hour1,hour2,mon1,mon2,day1,day2,year1,year2,week1;
//1602引脚定义
sbitrs=P2^4;
sbitrw=P2^5;
sbiten=P2^6;
//1302定义
sbitscl=P3^6;
sbitio=P3^4;
sbitrst=P3^5;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
ucharsecond,minute,hour,year,month,day,week;
ucharone[]="20";
uchartwo[]="0123456789";
/******************延时函数********************************
**********************************************************/
//毫秒延时函数
void delay_ms(uchar z)
{
uint x,y;
for(y = z;y>0;y--)
{
for(x = 110;x>0;x--);
}
}
/******************1602相关函数****************************
**********************************************************/
//1602写命令函数
voidcommand(uchar com)
{
rs = 0;
rw = 0;
en = 0;
P0 = com;
delay_ms(5);
en = 1;
delay_ms(5);
en = 0;
}
//1602 写数据函数
void write(uchar dat)
{
rs = 1;
rw = 0;
en = 0;
P0 = dat;
delay_ms(5);
en = 1;
delay_ms(5);
en = 0;
}
//1602初始化函数
void initialize()
{
en = 0;
command(0x38);
command(0x0c);
command(0x06);
command(0x01);
command(0x80);
}
/********************ds1302相关函数*****************
***************************************************/
//写地址函数
voidwrite_byte(uchar dat)
{
uchar j ;
ACC = dat;
for(j=8;j>0;j--) //错误出处,当i为0-8时液晶就不走了,显示为年月日 周为2000-00-00 0时间为00:00:00如果改成1-9就能正常了
{
scl=0;
io = ACC0;
scl = 1;
scl = 0;
ACC = ACC >> 1;
}
}
//读取地址函数
uchar read_byte()
{
uchar i;
for(i = 8;i > 0;i--)
{
ACC = ACC>>1;
ACC7 = io;
scl = 1;
scl = 0;
}
return(ACC);
}
//写入数据函数
void write_date(uchar addr,uchar date)
{
rst = 0;
scl = 0;
rst = 1;
write_byte(addr);
write_byte(date);
scl = 1;
rst = 0;
}
//读入数据函数
uchar read_date(uchar addr)
{
uchar uaddr;
rst = 0;
scl = 0;
rst = 1;
write_byte(addr);
uaddr=read_byte();
scl = 1;
rst = 0;
return(uaddr);
}
//写入时间
voidwrite_time()
{
write_date(0x8e,0x00); //WP=0 写操作
write_date(0x90,0x00); //关闭充电功能
write_date(0x80,0x12);// second
write_date(0x82,0x58);// minute
write_date(0x84,0x11);// hour
write_date(0x86,0x09);// day
write_date(0x88,0x09);// month
write_date(0x8c,0x12);// year
write_date(0x8a,0x07);// week
write_date(0x8e,0x80); //WP=1 写保护
}
void display()
{
second = read_date(0x81);
sec1 = second&0x0f;
sec2 = second>>4;
minute = read_date(0x83);
min1 = minute&0x0f;
min2 = (minute>>4);
hour = read_date(0x85);
hour1 = hour&0x0f;
hour2 = (hour>>4);
day = read_date(0x87);
day1 = day&0x0f;
day2 = (day>>4);
month = read_date(0x89);
mon1 = month&0x0f;
mon2 = (month>>4);
year=read_date(0x8d);
year1 = year&0x0f;
year2 = (year>>4);
week = read_date(0x8b);
week1 = week&0x0f;
command(0x80+0x47);
write(two);
command(0x80+0x46);
write(two);
command(0x80+0x45);
write(':');
command(0x80+0x44);
write(two);
command(0x80+0x43);
write(two);
command(0x80+0x42);
write(':');
command(0x80+0x41);
write(two);
command(0x80+0x40);
write(two);
command(0x80+0x0b);
write(two);
command(0x80+0x09);
write(two);
command(0x80+0x08);
write(two);
command(0x80+0x07);
write('-');
command(0x80+0x06);
write(two);
command(0x80+0x05);
write(two);
command(0x80+0x04);
write('-');
command(0x80+0x03);
write(two);
command(0x80+0x02);
write(two);
command(0x80+0x01);
write('0');
command(0x80+0x00);
write('2');
}
/****************主函数***********************
*********************************************/
void main()
{
initialize();
delay_ms(5);
write_time();
delay_ms(5);
while(1)
{
display();
}
}
楼主所说“for(j=8;j>0;j--) //错误出处,当i为0-8时”
是指的哪种情况?
for(j=0;j>8;j--) ?
for(j=0;j<8;j--) ?
for(j=0;j>8;j++) ?
for(j=0;j<8;j++) ? lcw_swust 发表于 2012-9-10 20:01 static/image/common/back.gif
楼主所说“for(j=8;j>0;j--) //错误出处,当i为0-8时”
是指的哪种情况?
for(j=0;j>8;j--) ?
是指for(i = 0;i<8;i++); 这种情况啊 zhenglingo 发表于 2012-9-10 21:09 static/image/common/back.gif
是指for(i = 0;i
这还真是诡异了
不知是不是编译器设置问题 我就查不出来是哪里出错了啊 很郁闷 对比两种写法编译出来的汇编语言看看,能不能找到差别 有点诡异!~ 也碰到过,一直没法解决
我的问题是不能设置年份为十位超过8的年,比如设置年份为87、97年则自定调成00年。很是苦闷
页:
[1]