微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机+ds1302+液晶12864不显示

单片机+ds1302+液晶12864不显示

时间:10-02 整理:3721RD 点击:
#include<at89x52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uchar code addr[6]={0x8d,0x89,0x8b,0x85,0x83,0x81};        //年,月,日,时,分,秒
uchar time[6];
uchar zhuanhua[12];
sbit rs=P1^2;  //数据/命令选择
sbit rw=P1^1;  //读写控制
sbit e=P1^0;  //片选信号
sbit rst=P3^0;        //ds1302
sbit sclk=P3^1;                                                                               
sbit io=P3^2;
#define lcd P2 //8 bit数据线
#define low  0
#define high  1
void delay(uint t)  
{
  uint i;
  while(t--)
  {
     for(i=0;i<125;i++);
  }
}
void checkbusy()
{
uchar busy;
rs=0;
rw=1;
lcd=0xff;
do
{
e = 1;
busy=lcd;
e=0;
}
while(busy&0x80);
}
//写命令函数
void wcom(uchar com)
{
  checkbusy();
  e=low;
  rs=low;   
  rw=low;   
  lcd=com;
  e=high;
  delay(10);
  e=low;   
}
//写数据函数
void wdata(int dat)
{
checkbusy();
e=low;
rs=high;
rw=low;
lcd=dat;
  e=high;
  delay(10);
e=low;
}
//写函数
void write12864(uchar com,uchar dat)
{
    checkbusy();
    wcom(com);
        delay(1);
        wdata(dat);
}

//初始化函数
void init()
{
lcd=0xff;
delay(100);
wcom(0x30);        //写基本指令集
delay(1);
wcom(0x30);
delay(1);
wcom(0x0c); //显示开
delay(1);
wcom(0x01);  //清屏指令
delay(20);
  wcom(0x06);  //游标右移
  delay(100);
}
//清屏函数
void lcdclear(void)
{
wcom(0x01);         //清屏指令
delay(100);
}
//显示汉字
dishanzi(uchar addr,uchar *hz)
{
int i;
checkbusy();
wcom(addr);
for(i=0;hz[i]!='\0';i++)
{
  wdata(hz[i]);
  checkbusy();
}
delay(5);
}               

void ds1302write(uchar addr,uchar data1)         //写地址数据函数
{
uchar i;
rst=0;
_nop_();
sclk=0;
rst=1;
for(i=0;i<8;i++)
{
if(addr&0x01==1)
io=1;
else
io=0;
sclk=1;
_nop_();
sclk=0;
_nop_();
addr>>=1;
}
for(i=0;i<8;i++)
{
if(data1&0x01==1)
io=1;
else
io=0;
sclk=1;
_nop_();
sclk=0;
_nop_();
data1>>=1;
}
rst=0;
}
//ds1302读函数
uchar ds1302read(uchar addr)
{
uchar i;
uchar dat=0;
rst=0;
sclk=0;
_nop_();
rst=1;
_nop_();
for(i=0;i<8;i++)
{
if(addr&0x01==1)
io=1;
else
io=0;               
sclk=1;
_nop_();
sclk=0;
_nop_();
addr>>=1;
}
for(i=0;i<8;i++)
{
dat>>=1;
if(io)
dat|=0x80;
else
dat|=0x00;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
rst=0;
_nop_();
io=1;
_nop_();
sclk=1;
_nop_();
return dat;
}
//获得时间
void gettime()          
{
int i;
for(i=0;i<6;i++)
{
time[i]=ds1302read(addr[i]);  //依次为年月日时分秒
}
}
//转化为10进制
void zh()
{
zhuanhua[0]=time[0]%16;
zhuanhua[1]=time[0]/16;
zhuanhua[2]=time[1]%16;
zhuanhua[3]=time[1]/16;
zhuanhua[4]=time[2]%16;
zhuanhua[5]=time[2]/16;
zhuanhua[6]=time[3]%16;
zhuanhua[7]=time[3]/16;
zhuanhua[8]=time[4]%16;
zhuanhua[9]=time[4]/16;
zhuanhua[10]=time[5]%16;
zhuanhua[11]=time[5]/16;
}
//写时间
void  ds1302ini()
{
ds1302write(0x8e,0x00);//去除写保护
ds1302write(0x8c,0x11);          // 写年
ds1302write(0x88,0x10);          //写月
ds1302write(0x8a,0x01);          //写日
ds1302write(0x84,0x10);          //写时
ds1302write(0x82,0x14);         //        写分
ds1302write(0x80,0x00);         //        写秒
ds1302write(0x8e,0x80);//写保护
}
                          
//液晶显示时间
void distime()
{
         wcom(0x93);
         wdata(zhuanhua[1]);
         wdata(zhuanhua[0]);
         wdata(':');
         wdata(zhuanhua[3]);
         wdata(zhuanhua[2]);                                                                                                                                                
         wdata(':');                         
         wdata(zhuanhua[5]);
         wdata(zhuanhua[4]);
         wcom(0x88);
         wdata(zhuanhua[7]);
         wdata(zhuanhua[6]);
         wdata(':');
         wdata(zhuanhua[9]);
         wdata(zhuanhua[8]);
         wdata(':');
         wdata(zhuanhua[11]);
         wdata(zhuanhua[10]);
}                    
void main(void)
{
   init();
   lcdclear();
   delay(10);
   ds1302ini();
    dishanzi(0x82,"电子时钟");
    dishanzi(0x90,"日期");
     wdata(':');
         gettime();
         zh();
          distime();
          while(1){};
}


                                                  

哎 这个程序看不透

这也可以,怪不得人家常说,电子工程师,一般都是艺术家...NICE,不错。

创新电路,专业生产PCB
单/双层板:50元/款 长宽在5*5cm以内,
单/双层板:100元/款 长宽在10*10cm以内,
四层板:500元/款 长宽在10*10cm以内,
六层板:1000元/款 长宽在10*10cm以内,
八层板:1600元/款 长宽在10*10CM以内,
打样数量:10PCS   全部飞针测试 欢迎询价或交流~
M:13534039985  Q:847142155   MSN:suki0606@live.CN
地址:深圳市龙岗区坪地街道中心社区复兴路18号瑞安工业园二栋7楼
联系人:黄S

void main(void)
{
   init();
   lcdclear();
   delay(10);
   ds1302ini();
    dishanzi(0x82,"电子时钟");
    dishanzi(0x90,"日期");
     wdata(':');
         gettime();
         zh();
          distime();
          while(1){};
}
建议你把while(1){这里写初始化完以后的程序};

有没有电路?

小编你这个问题解决没有!?  

我也遇到问题了
转换如果是没有字母就能正常显示
有字母就不正常了

有单个字母要加个空格,双个就不用加了

休息休息口选择滚滚滚

我自己做了一个也不显示,还在找原因

上一篇:路,该如何走?
下一篇:寻找一个帖子

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top