电子万年历,屏蔽掉1302时钟函数12864就可以显示初始时间,温度显示正常,但是加入1302读时间函数之后12864直接没显示了...怎么回事,求大神解决!谢谢...
#include <reg52.h>
#include <intrins.h>
#include "DS1302.h"
#include "DS18b20.h"
#include "Delay.h"
#include "Display.h"
#define uchar unsigned char
#define uint unsigned int
uchar code codetable[]="0123456789";
uchar code weektable[]="一二三四五六日";
uchar str1[16]="2014/01/12 27℃";
uchar str2[16]="00:30:10 星期五";
uchar str3[16]="四月初五 闹钟开";
uchar str4[16]="下 午 00点03分";
struct
time time;
uchar temp;
bit ReadRTC_Flag;//定义读DS1302标志
void main(){
time.year=11;
time.month=5;
time.week=6;
time.day=14;
time.hour=10;
time.minute=59;
time.second=45;
set_rtc();
delay_50ms(4);
lcd12864initinal();
lcd12864display(str1,1);
delay_50ms(40);
while(1){
read_rtc();//问题所在,屏蔽掉显示正常,函数应该是正常,网上找的程序也有同样问题
delay_50ms(1);
str1[2]=codetable[time.year/10];
str1[3]=codetable[time.year%10];
str1[5]=codetable[time.month/10];
str1[6]=codetable[time.month%10];
str1[8]=codetable[time.day/10];
str1[9]=codetable[time.day%10];
str2[0]=codetable[time.hour/10];
str2[1]=codetable[time.hour%10];
str2[3]=codetable[time.minute/10];
str2[4]=codetable[time.minute%10];
str2[6]=codetable[time.second/10];
str2[7]=codetable[time.second%10];
str2[14]=weektable[(time.week-1)*2-1];
str2[15]=weektable[(time.week-1)*2];
str4[8]=codetable[time.hour/10];
str4[9]=codetable[time.hour%10];
str4[12]=codetable[time.minute/10];
str4[13]=codetable[time.minute%10];
temp=readtemperature();
str1[12]=codetable[temp/10];
str1[13]=codetable[temp%10];
lcd12864display(str1,1);
lcd12864display(str2,2);
lcd12864display(str3,3);
lcd12864display(str4,4);}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include <reg52.h>
#include "DS1302.h"
#include <intrins.h>
#include <Delay.h>
sbit sck=P3^6;
sbit io=P3^4;
sbit ce=P3^5;
uchar time_data[7]={10,6,4,17,11,58,30};
code uchar write_add[7]={0x8c, 0x8a,0x88, 0x86,
0x84, 0x82,0x80};//年周月日时分秒
code uchar read_add[7]={0x8d, 0x8b,0x89, 0x87,
0x85, 0x83,0x81};//年周月日时分秒
/*按位写一字节8位*/
void write_ds1302_byte(uchar dat){
uchar i;
for(i=0;i<8;i++){
sck=0;
_nop_();
io=dat&0x01;
dat>>=1;
sck=1;
}
}
/*写某个数据dat到某个地址add*/
void write_ds1302(uchar add,uchar dat){
ce=0;
_nop_();
sck=0;
_nop_();
ce=1;
write_ds1302_byte(add);
write_ds1302_byte(dat);
_nop_();
ce=0;
_nop_();
io=1;
sck=1;
}
/*读取某一个地址(年/周/月/日/时/分/秒)的数据*/
/*uchar read_ds1302(uchar add){
uchar i,value=0;
ce=0;
_nop_();_nop_();
sck=0;
_nop_();_nop_();
ce=1;
_nop_();_nop_();
write_ds1302_byte(add);
_nop_();
for(i=0;i<8;i++){
if(io);
value=value|=0x80;
sck=0;
value>>=1; //右移一位
_nop_();
_nop_();
_nop_();
sck=1;
}
ce=0;
_nop_();_nop_();
ce=0;
sck=0;
_nop_();_nop_();
_nop_();_nop_();
sck=1;
_nop_();_nop_();
io=0;
_nop_();_nop_();
io=1;
_nop_();_nop_();
return value;
}*/
uchar read_ds1302(uchar addr)
{
uchar i,value;
ce=0;
_nop_(); _nop_();
sck=0;
_nop_(); _nop_();
ce=1;
_nop_(); _nop_();
write_ds1302_byte(addr);
for(i=0;i<8;i++)
{
value=value>>1;
_nop_();
sck=0;
if(io)
value=value|0x80;
_nop_();
sck=1;
}
ce=0;
_nop_(); _nop_();
sck=0;
_nop_(); _nop_();
sck=1;
io=1;
return value;
}
/*初始化时间为2014年周1一月一日12点00分*/
void set_rtc(void){
uchar i,j;
/*for(i=0;i<7;i++){
j=time
/10;
time=time%10;
time=time+j*16;
}//10进制转为16进制*/
j=time.year/10;
time_data[0]=time.year%10;
time_data[0]=time_data[0]+j*16;
j=time.week/10;
time_data[1]=time.week%10;
time_data[1]=time_data[1]+j*16;
j=time.month/10;
time_data[2]=time.month%10;
time_data[2]=time_data[2]+j*16;
j=time.day/10;
time_data[3]=time.day%10;
time_data[3]=time_data[3]+j*16;
j=time.hour/10;
time_data[4]=time.hour%10;
time_data[4]=time_data[4]+j*16;
j=time.minute/10;
time_data[5]=time.minute%10;
time_data[5]=time_data[5]+j*16;
j=time.second/10;
time_data[6]=time.second%10;
time_data[6]=time_data[6]+j*16;
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++){
write_ds1302(write_add,time_data);
}
write_ds1302(0x8e,0x80);//加写保护*/
}
/*读时间数据到数组disp[]存放,为完成BCD码转换*/
void read_rtc(void){
uchar i,j=0;
//write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++){
time_data=read_ds1302(read_add);
}//读出 年周月日时分秒
// write_ds1302(0x8e,0x00);//加写保护
time.year=time_data[0]%16+(time_data[0]/16)*10;
time.week=time_data[1]%16;
time.month=time_data[2]%16+(time_data[2]/16)*10;
time.day=time_data[3]%16+(time_data[3]/16)*10;
time.hour=time_data[4]%16+(time_data[4]/16)*10;
time.minute=time_data[5]%16+(time_data[5]/16)*10;
time.second=time_data[6]%16+(time_data[6]/16)*10;
}
- for(i=0;i<7;i++){
- time_data=read_ds1302(read_add);
-
- }//读出 年周月日时分秒
复制代码这段代码错误,改为
- for(i=0;i<7;i++){
- time_datap[i]=read_ds1302(read_add);
-
- }//读出 年周月日时分秒
复制代码数组书写不对。
评分
查看全部评分
12864 18b20 红外 wt588d.zip 下载积分: 积分 -1 分
39.04 KB, 下载次数: 10, 下载积分: 积分 -1 分
12864+18b20+红外+wt588d
1522495332说得没错,地址也是数组应该写出read_add.我也疏忽大意了。
一周热门 更多>