|
写了个ds1302+lcd1602的程序来作电子时钟,可是程序写完了,检查科很久都发现问题,就是时钟不走动,昨天刚把ds1302中的for循环里的i改成8-0递减就正常了,求大神帮我看看是哪里出错了
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar sec1,sec2,min1,min2,hour1,hour2,mon1,mon2,day1,day2,year1,year2,week1;
//1602引脚定义
sbit rs=P2^4;
sbit rw=P2^5;
sbit en=P2^6;
//1302定义
sbit scl=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
uchar second,minute,hour,year,month,day,week;
uchar one[]="20";
uchar two[]="0123456789";
/******************延时函数********************************
**********************************************************/
//毫秒延时函数
void delay_ms(uchar z)
{
uint x,y;
for(y = z;y>0;y--)
{
for(x = 110;x>0;x--);
}
}
/******************1602相关函数****************************
**********************************************************/
//1602写命令函数
void command(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相关函数*****************
***************************************************/
//写地址函数
void write_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);
}
//写入时间
void write_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[sec1]);
command(0x80+0x46);
write(two[sec2]);
command(0x80+0x45);
write(':');
command(0x80+0x44);
write(two[min1]);
command(0x80+0x43);
write(two[min2]);
command(0x80+0x42);
write(':');
command(0x80+0x41);
write(two[hour1]);
command(0x80+0x40);
write(two[hour2]);
command(0x80+0x0b);
write(two[week1]);
command(0x80+0x09);
write(two[day1]);
command(0x80+0x08);
write(two[day2]);
command(0x80+0x07);
write('-');
command(0x80+0x06);
write(two[mon1]);
command(0x80+0x05);
write(two[mon2]);
command(0x80+0x04);
write('-');
command(0x80+0x03);
write(two[year1]);
command(0x80+0x02);
write(two[year2]);
command(0x80+0x01);
write('0');
command(0x80+0x00);
write('2');
}
/****************主函数***********************
*********************************************/
void main()
{
initialize();
delay_ms(5);
write_time();
delay_ms(5);
while(1)
{
display();
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|