打印

DS1302+12864显示不出来

[复制链接]
1485|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenyu988|  楼主 | 2012-7-10 20:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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();
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

1108

帖子

14

粉丝