DS1302+12864 液晶屏无显示,按下复位键,显示一下又变白屏,显示的值也不对,12864显示部分没有问题。
sbit SCLK=P3^6; //时钟
sbit SDA=P3^4; //数据
sbit RST=P3^5; //DS1302复位
uchar SEC,MIN,HOUR,WEEK,DAY,MONTH,YEAR;
void DS1302_WriteByte(uchar temp)
{
uchar i;
RST=0;
SCLK=0;
nop;
RST=1;
for(i=8;i>0;i--) //开始传输8个字节数据
{
SCLK=0;//初始时钟线置0
SDA=(bit)(temp&(0x01));//低位在前
SCLK=1;//时钟线拉高,制造上升沿,SDA 的数据被传输
temp>>=1; //数据右移一位,准备传输下一位数据
}}
void DS1302_Write(uchar address,uchar dat)
{
RST=0; //初始CE 线置为0
SCLK=0;//初始时钟线置为0
RST=1; //初始CE 置为1,传输开始
DS1302_WriteByte(address);//传输命令字,要写入的时间/日历地址
DS1302_WriteByte(dat); //写入要修改的时间/日期
SCLK=1; //时钟线拉高
RST=0; //读取结束,CE 置为0,结束数据的传输
}
uchar DS1302_ReadByte()
{
uchar i,temp=0;
RST=0;
nop;
RST=1;
for(i=8;i>0;i--)
{
temp>>=1;
SCLK=1;
nop;
if(SDA==1) temp|=0x80; //如果读出的数据是1,将1取出写在最高位
SCLK=0;
}
return temp;
}
uchar DS1302_Read(uchar address)
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
DS1302_WriteByte(address);
temp=DS1302_ReadByte();
SCLK=1;
RST=0;
return (temp);
}
void DS1302_GetTime() //转换时间(BCD码转换成十进制数)
{
uchar ReadValue;
ReadValue=DS1302_Read(0x81);
SEC=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
ReadValue=DS1302_Read(0x83);
MIN=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
ReadValue=DS1302_Read(0x85);
HOUR=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
ReadValue=DS1302_Read(0x87);
DAY=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
ReadValue=DS1302_Read(0x8b);
WEEK=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
ReadValue=DS1302_Read(0x89);
MONTH=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
ReadValue=DS1302_Read(0x8d);
YEAR=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
}
void Initial_DS1302(void) //时钟芯片初始化
{
uchar flag;
flag=DS1302_Read(0x81);//读取秒寄存器最高位,读出时钟状态
if(flag&0x80) //判断时钟是否关闭,如内部关闭就初始化
{
DS1302_Write(0x8e,0x00); //写入允许
DS1302_Write(0x8c,0x12); //以下写入初始化时间 日期:12/07/06.星期: 5 时间: 23:59:55
DS1302_Write(0x88,0x07);
DS1302_Write(0x86,0x06);
DS1302_Write(0x8a,0x05);
DS1302_Write(0x84,0x23);
DS1302_Write(0x82,0x59);
DS1302_Write(0x80,0x55);
DS1302_Write(0x8e,0x80); //禁止写入
}
}
void DS1302_ShowTime()
{
display8(2,0,0,number[2]); //2 选左半屏
display8(2,0,8,number[0]); //0
display8(2,0,16,number[YEAR/10]);
display8(2,0,24,number[YEAR%10]);
display16(2,0,32,nian); //年
display8(2,0,48,number[MONTH/10]);
display8(2,0,56,number[MONTH%10]);
display16(1,0,0,yue);//月
display8(1,0,16,number[DAY/10]);
display8(1,0,24,number[DAY%10]);
display16(1,0,32,ri);//日
display8(2,2,0,number[HOUR/10]); //小时
display8(2,2,8,number[HOUR%10]);
display8(2,2,16,maohao);//:
display8(2,2,24,number[MIN/10]); //分钟
display8(2,2,32,number[MIN%10]);
display8(2,2,40,maohao);//:
display8(2,2,48,number[SEC/10]); //秒
display8(2,2,56,number[SEC%10]);
display16(1,2,0,xing);//星
display16(1,2,16,qi);//期
display16(1,2,32,weekcode[WEEK%10]);
}
void main()
{
LCD_init(); //lcd初始化
clearscreen(3);
set_line(0);
Initial_DS1302();
while(1)
{
DS1302_GetTime();
DS1302_ShowTime();
} |