求DS1302显示问题!进位显示问题
时间:10-02
整理:3721RD
点击:
我的ds1302能显示时间了,而且正常走时间就是在59秒进分的时候,秒位会变成“?”,然后过一会变回数字!同时我的年设置成了11年!11那个数字一直在数字和“?”之间变化!
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD1602_IO P0
sbit ce=P3^4;//是由T0非控制当为1的时候没被选中,当为0的时候选中。
sbit sclk=P3^3;
sbit dio=P3^2;
sbit E=P3^5;//1602的EA
sbit RS=P3^7;//1602
void delay_ms(uint a);//毫秒级别延时;
void wr_com(uchar dat);//1602写指令函数;
void wr_dat(uchar dat);//1602写数据函数;
void init_1602(void);//1602初始化函数;
//void init();//时钟初始化
//void _10zhuan16();//将10进制时间转化成16进制的8421BCD;
//void write_byte(uchar a);//DS1302写1个字节函数;
//uchar read_byte();//DS1302读一个字节函数;
//void write_date(uchar address,uchar date);//正对某个字节写;
//uchar read_date(uchar address);//针对某个字节读;
//void read_time();//连续读取时间
uchar init_time[6]={0};//初始化时间
uchar write_address[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写地址数组
uchar read_address[6]={0x8d,0x89,0x87,0x85,0x83,0x81};//读地址数组
void delay(uint z)
{
uint x,y;
for(y=z;y>0;y--)
for(x=110;x>0;x--);
}
void write(uchar add,uchar date)
{
uchar temp,t;
ce=1;
sclk=0;
ce=0;
temp=add;
for(t=0;t<8;t++)//地址控制
{
if((temp&0x01)==1)
{
dio=1;
}
else
dio=0;
sclk=1;
delay(1);
sclk=0;
temp=temp>>1;
}
temp=date;
for(t=8;t>0;t--) //写数据
{
if((temp&0x01)==1)
{
dio=1;
}
else
dio=0;
sclk=1;
delay(1);
sclk=0;
temp=temp>>1;
}
ce=1;
}
uchar read(uchar add)
{
uchar temp,t;
ce=1;
sclk=0;
ce=0;
temp=add;
for(t=0;t<8;t++)
{
if((temp&0x01)==1)
dio=1;
else
dio=0;
sclk=1;
sclk=0;
temp>>=1;
}
temp=0;
for(t=0;t<8;t++)
{
if(dio==1)
temp|=(0x01<<t);
sclk=1;
sclk=0;
}
ce=1;
return temp;
}
void read_time()//连续读出年周月日
{
uchar i;
for(i=0;i<6;i++)
{
init_time[i]=read(read_address[i]);
delay_ms(10);
}
}
void chu()
{
write(0x8e,0x00);//写保护
write(0x80,0x00); //写秒
write(0x82,0x43);//写分
write(0x84,0x15); //写时
write(0x86,0x17);
write(0x88,0x7);
write(0x8c,0x11);
write(0x8e,0x80);
}
void main()
{
init_1602();
chu();
//init();
while(1)
{
read_time();
wr_dat('2');
wr_dat('0');
wr_dat(init_time[0]/16+0x30);
wr_dat(init_time[0]%16+0x30);
wr_dat('y');
wr_dat(init_time[1]/16+0x30);
wr_dat(init_time[1]%16+0x30);
wr_dat('m');
wr_dat(init_time[2]/16+0x30);
wr_dat(init_time[2]%16+0x30);
wr_dat('d');
wr_dat(init_time[3]/16+0x30);
wr_dat(init_time[3]%16+0x30);
wr_dat('t');
wr_dat(init_time[4]/16+0x30);
wr_dat(init_time[4]%16+0x30);
wr_com(0x80+0x40);
wr_dat('m');
wr_dat(init_time[5]/16+0x30);
wr_dat(init_time[5]%16+0x30);
wr_dat('s');
wr_com(0x80);
}
}
void delay_ms(uint a)//毫秒级别延时;
{
uchar x,y;
for (a;a>0;a--)
for(x=0;x<114;x++)
for(y=0;y<1;y++);
}
void wr_com(uchar dat)//1602写指令函数;
{
E=0;
RS=0;;
LCD1602_IO=dat;
E=1; delay_ms(2);
E=0;delay_ms(2);
}
void wr_dat(uchar dat)//1602写数据函数;
{
E=0;
RS=1;
LCD1602_IO=dat;
E=1;delay_ms(2);
E=0;delay_ms(2);
}
void init_1602(void)//1602初始化函数;
{
delay_ms(20);
wr_com(0X38);
delay_ms(5);
wr_com(0X38);
delay_ms(5);
wr_com(0X01);
wr_com(0X06);
wr_com(0X0c);
wr_com(0X80);
}
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD1602_IO P0
sbit ce=P3^4;//是由T0非控制当为1的时候没被选中,当为0的时候选中。
sbit sclk=P3^3;
sbit dio=P3^2;
sbit E=P3^5;//1602的EA
sbit RS=P3^7;//1602
void delay_ms(uint a);//毫秒级别延时;
void wr_com(uchar dat);//1602写指令函数;
void wr_dat(uchar dat);//1602写数据函数;
void init_1602(void);//1602初始化函数;
//void init();//时钟初始化
//void _10zhuan16();//将10进制时间转化成16进制的8421BCD;
//void write_byte(uchar a);//DS1302写1个字节函数;
//uchar read_byte();//DS1302读一个字节函数;
//void write_date(uchar address,uchar date);//正对某个字节写;
//uchar read_date(uchar address);//针对某个字节读;
//void read_time();//连续读取时间
uchar init_time[6]={0};//初始化时间
uchar write_address[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//写地址数组
uchar read_address[6]={0x8d,0x89,0x87,0x85,0x83,0x81};//读地址数组
void delay(uint z)
{
uint x,y;
for(y=z;y>0;y--)
for(x=110;x>0;x--);
}
void write(uchar add,uchar date)
{
uchar temp,t;
ce=1;
sclk=0;
ce=0;
temp=add;
for(t=0;t<8;t++)//地址控制
{
if((temp&0x01)==1)
{
dio=1;
}
else
dio=0;
sclk=1;
delay(1);
sclk=0;
temp=temp>>1;
}
temp=date;
for(t=8;t>0;t--) //写数据
{
if((temp&0x01)==1)
{
dio=1;
}
else
dio=0;
sclk=1;
delay(1);
sclk=0;
temp=temp>>1;
}
ce=1;
}
uchar read(uchar add)
{
uchar temp,t;
ce=1;
sclk=0;
ce=0;
temp=add;
for(t=0;t<8;t++)
{
if((temp&0x01)==1)
dio=1;
else
dio=0;
sclk=1;
sclk=0;
temp>>=1;
}
temp=0;
for(t=0;t<8;t++)
{
if(dio==1)
temp|=(0x01<<t);
sclk=1;
sclk=0;
}
ce=1;
return temp;
}
void read_time()//连续读出年周月日
{
uchar i;
for(i=0;i<6;i++)
{
init_time[i]=read(read_address[i]);
delay_ms(10);
}
}
void chu()
{
write(0x8e,0x00);//写保护
write(0x80,0x00); //写秒
write(0x82,0x43);//写分
write(0x84,0x15); //写时
write(0x86,0x17);
write(0x88,0x7);
write(0x8c,0x11);
write(0x8e,0x80);
}
void main()
{
init_1602();
chu();
//init();
while(1)
{
read_time();
wr_dat('2');
wr_dat('0');
wr_dat(init_time[0]/16+0x30);
wr_dat(init_time[0]%16+0x30);
wr_dat('y');
wr_dat(init_time[1]/16+0x30);
wr_dat(init_time[1]%16+0x30);
wr_dat('m');
wr_dat(init_time[2]/16+0x30);
wr_dat(init_time[2]%16+0x30);
wr_dat('d');
wr_dat(init_time[3]/16+0x30);
wr_dat(init_time[3]%16+0x30);
wr_dat('t');
wr_dat(init_time[4]/16+0x30);
wr_dat(init_time[4]%16+0x30);
wr_com(0x80+0x40);
wr_dat('m');
wr_dat(init_time[5]/16+0x30);
wr_dat(init_time[5]%16+0x30);
wr_dat('s');
wr_com(0x80);
}
}
void delay_ms(uint a)//毫秒级别延时;
{
uchar x,y;
for (a;a>0;a--)
for(x=0;x<114;x++)
for(y=0;y<1;y++);
}
void wr_com(uchar dat)//1602写指令函数;
{
E=0;
RS=0;;
LCD1602_IO=dat;
E=1; delay_ms(2);
E=0;delay_ms(2);
}
void wr_dat(uchar dat)//1602写数据函数;
{
E=0;
RS=1;
LCD1602_IO=dat;
E=1;delay_ms(2);
E=0;delay_ms(2);
}
void init_1602(void)//1602初始化函数;
{
delay_ms(20);
wr_com(0X38);
delay_ms(5);
wr_com(0X38);
delay_ms(5);
wr_com(0X01);
wr_com(0X06);
wr_com(0X0c);
wr_com(0X80);
}
显示不稳定,在这个位置上市不是也写入其他数字了,或者说在数字改变的时候进行一次清空
貌似不是啊!很有规律在秒位正常的时候年位的数值总是在“11”和“?”之间变化,但是当秒进位成“?”时年位就正常了!然后再过整整一分钟,秒位变数字年位就变回数字与?之间变化,挺郁闷的!
帮帮忙吧!谢谢啦,谁能帮我解决下!奉上全部积分
是不是进制的问题