打印
[51单片机]

关于DS1302 液晶显示的问题

[复制链接]
1161|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
液晶显示了很多“?” 这是怎么回事啊、。
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit clk=P1^0;
sbit io=P1^1;
sbit rst=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
//uint i;


uchar code table[]={0x10,0x04,0x05,0x07,
                    0x10,0x10,0x10,0x00};

uchar curtime[7]={0x0,0x0,0x0,0x0,0x0,
                   0x0,0x0};
uchar shi[7]={0x0,0x0,0x0,0x0,0x0,0x0,0x0};
uchar ge[7]={0x0,0x0,0x0,0x0,0x0,0x0,0x0};

void delay(uchar x)
{
        uchar t;
        while(x--)
        for(t=0;t<110;t++);
}
void writeb(uchar data1302)
{
         uchar i;
         ACC=data1302;
         for(i=8;i>0;i--)
         {
                 io=ACC0;
                 clk=1;
                 clk=0;
                 ACC=ACC>>1;
         }
}
uchar readb(void)
{
uchar i;
         for(i=8;i>0;i--)
         {
                 ACC=ACC>>1;
                 ACC7=io;
                 clk=1;
                 clk=0;
                 
         }
return(ACC);
}
void init1302()
{
        rst=0;clk=0;rst=1;
}
void w1302(uchar addr1302,uchar data1302)
{
        init1302();
        writeb(addr1302);
        writeb(data1302);
        clk=1;rst=0;
}
uchar r1302(uchar addr1302)
{
        uchar data1302;
        init1302();
        writeb(addr1302);
        data1302=readb();
        clk=1;rst=0;
        return (data1302);
}
void burstw1302t()
{
        uchar i;
        w1302(0x8e,0x00);
        init1302();
        writeb(0xbe);
        for(i=8;i>0;i--)
        {
                writeb(table[i]);
        }
        clk=0;rst=0;
        w1302(0x8e,0x80);
}
void gettime1302()
{         uchar i;
        uchar addr=0x81;
        for(i=0;i<7;i++)
        {
                curtime[i]=r1302(addr);
                addr+=2;
                shi[i]=curtime[i]/16;
                ge[i]=curtime[i]%16;
        }
}
void write_commond(uchar commond)
{
        rs=0;
       
        P0=commond;
        delay(5);
        e=1;
        delay(5);
        e=0;
}
void write_date(uchar Date)
{
rs=1;
rw=0;
e=0;
P0=Date;
delay(5);
e=1;
delay(5);
e=0;
}
void init()
{
        e=0;
        rw=0;
        write_commond(0x38);//16*2
        write_commond(0x0c);//开显示,光标
        write_commond(0x06);
        write_commond(0x01);
}

void disp()
{         uchar i,j;
        write_commond(0x80);//第一行
        for(i=0;i<4;i++)
        {
                write_date(shi[i]+'0');
                write_date(ge[i]+'0');
        }
                write_commond(0x80+0x40);//第二行
                for(j=4;j<8;j++)
        {
            write_date(shi[j]+'0');
                write_date(ge[j]+'0');
        }
                 delay(10);
}
void main()
{
         init();  //液晶复位初始化
         burstw1302t();
         while(1)
         {
                 gettime1302();
                 disp();
         }
}

相关帖子

沙发
wangch_sh| | 2014-5-27 13:50 | 只看该作者
时序对吗?

使用特权

评论回复
板凳
ningling_21| | 2014-5-27 16:24 | 只看该作者
预定显示什么,实际显示什么?

使用特权

评论回复
地板
bluesky1400|  楼主 | 2014-5-28 21:59 | 只看该作者
问大家个MAX1241的问题 是个串行AD转换器 和液晶也有关系。我的个位和十分位是这么写的。液晶根本不可能出现K 啊
void disp()
  {
  temp1=adc();
  voltage=temp1*0.6105;
  ge=voltage/1000;
  shifen=(voltage%1000)/100;
我的个位和十分位这样写,根本不可能出现数字K啊。。
怎么液晶读到的和实际电压差别这么大啊??
完整程序:
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
  sbit clk=P1^3           ;
  sbit cs=P1^2           ;
  sbit dout=P1^1           ;
  //sbit shdn=P1^0           ;
  uint bdata temp;
  sbit temp0=temp^0           ;
  sbit rs=P2^0           ;
  sbit rw=P2^1           ;
  sbit e =P2^2           ;
          
  uint ge=0,shifen=0;
  uint temp1;
uint voltage;
  
  void delay(uint m)
  {
  uint n;
  while(m--)
  for(n=125;n>0;n--);
  }
  
  uint adc()
  {        uint i;
          temp=0; cs=1;
          clk=1;
          clk=0;cs=0;
          while(!dout);
                          for(i=0;i<12;i++)
                          {
                          temp=temp<<1;
                          clk=0;clk=1;
                          temp0=dout;
                          }
          
          cs=1;
          return(temp);
  }
  void write_commond(uchar Commond)
{
        rs=0;
                  
        P0=Commond;
        delay(5);
        e=1;
        delay(1);
        e=0;
}
void write_date(uchar Date)
{
        rs=1;
        rw=0;
        e=0;
        P0=Date;
        delay(5);
        e=1;
        delay(1);
        e=0;
}
void init()
{
        e=0;
        rw=0;
        write_commond(0x38);//16*2
        write_commond(0x0c);//开显示,光标
        write_commond(0x06);
        write_commond(0x01);
}
  void disp()
  {
  temp1=adc();
  voltage=temp1*0.6105;
  ge=voltage/1000;
  shifen=(voltage%1000)/100;
  write_commond(0x80);
  write_date('V');
   write_date('o');
    write_date('l');
         write_date('t');
          write_date('a');
           write_date('g');
            write_date('e');
                write_date('=');
                 write_commond(0xc0);
                  write_date(ge+'0');
                  write_date(0x2e);
                  write_date(shifen+'0');
                  write_date('V');
  delay(1);
  }
  void main()
  {delay(50);         
  init();
  
          while(1)
          {          
          temp1=0;
                  
                   disp();delay(5);
          }                  
   }

1302.png (31.87 KB )

1302.png

使用特权

评论回复
5
bluesky1400|  楼主 | 2014-5-28 22:07 | 只看该作者
各位,拜托啊。。别看开头的问题了。。看看后面这个图

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝