打印

12864+1302显示问题各位大侠帮忙

[复制链接]
3837|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
code-03|  楼主 | 2010-11-9 10:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RS, ST, ui, TE, tc
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^0; //液晶12864的接口
sbit rw=P3^1;
sbit en=P3^2;

sbit clk=P2^4; //1302时钟线
sbit date=P2^5; //1302数据线
sbit rst=P2^6;//1302复位线

uint shi,fen,miao,nian,yue,ri,xingqi;
uchar shijian[8];//用来储存读回来的时间
void delay_ms(uint x) //液晶延时子程序 (ms)

{
  uint i,j;
  for(j=0;j<x;j++)
   for(i=0;i<110;i++);
}
void delay_us(uint n) //延时(us),当n=1,为20us,当=2,为30us

{
   uint i;
   for(i=0;i<n;i++);
}


void write_cmd(uint cmd) //液晶的写指令

{
  rs=0;
  rw=0;
  en=0;
  P0=cmd;
  delay_ms(5);
  en=1;
  delay_ms(5);
  en=0;

}

void write_dat(uint dat)  //液晶的写数据

{
  rs=1;
  rw=0;
  en=0;
  P0=dat;
  delay_ms(5);
  en=1;
  delay_ms(5);
  en=0;

}

void pos(uchar x,uchar y)  //确定液晶写指令的位置

{
  uchar pos;
  if(x==0)
  {x=0x80;}
  else if(x==1)
  {x=0x90;}
  else if(x==2)
  {x=0x88;}
  else if(x==3)
  {x=0x98;}
  pos=x+y;
  write_cmd(pos);
}

void init_lcd()     //初始化液晶

{
  
  write_cmd(0x06);
  write_cmd(0x0c);   //开显示,关光标
  write_cmd(0x30);    //基本指令操作
  write_cmd(0x01);   //清屏

}
  
void print(uchar *str)   //显示字符串
{
while(*str!='\0')
{
  write_dat(*str);
  str++;
}
}




void write_1302(uint dat)    //往1302中写入一个字节
{
  uint i;
  rst=1;
  clk=0;
  for(i=0;i>8;i++)

  {
   date=dat&0x01;
   delay_us(2);
   clk=1;
   delay_us(2);
   clk=0;
   dat>>=1;
   }
  rst=0;
  }

void w_1302(uint cmd,uint dat) //往1302中写控制字、数据
{
  rst=0;
  clk=0;
  rst=1;
  delay_us(2);
  write_1302(cmd);
  write_1302(dat);
  clk=1;
  rst=0;
  
}

uchar read_1302()  //从1302中读一个字节
{
  uint i=0,dat=0;
  delay_us(2);
  for(i=0;i<8;i++)

  {
   dat>>=1;
   if(date==1)
   dat|=0x80;
   clk=1;
   delay_us(2);
   clk=0;
   delay_us(2);  
  }
   return dat;

}
uchar r_1302(uint cmd) //从1302中根据控制字读数据

  {
   uchar dat;
     rst=0;                 //拉低RST
    clk=0;                //确保写数居前SCLK被拉低
    rst=1;                 //启动数据传输
    write_1302(cmd);       //写入命令字
    dat=read_1302();       //读出数据
    clk=1;              //将时钟电平置于已知状态
    rst=0;               //禁止数据传递
    return dat;          //将读出的数据返回
  }

init_1302()
{
  uchar flag;
     flag=r_1302(0x81);
  if(flag&0x80)
  {               //判断时钟芯片是否关闭 如果内部关的话就初始化,没有关的话就继续走
     
   w_1302(0x8E,0x00);                    //根据写状态寄存器命令字,写入不保护指令
      w_1302(0x80,((55/10)<<4|(55%10)));    //根据写秒寄存器命令字,写入秒的初始值
   w_1302(0x82,((59/10)<<4|(59%10)));    //根据写分寄存器命令字,写入分的初始值
   w_1302(0x84,((23/10)<<4|(23%10)));    //根据写小时寄存器命令字,写入小时的初始值
   w_1302(0x86,((18/10)<<4|(18%10)));    //根据写日寄存器命令字,写入日的初始值
   w_1302(0x88,((6/10)<<4|(6%10)));      //根据写月寄存器命令字,写入月的初始值
   w_1302(0x8c,((9/10)<<4|(9%10)));      //根据写年寄存器命令字,写入年的初始值
   w_1302(0x90,0xa5);                    //打开充电功能 选择2K电阻充电方式
   w_1302(0x8E,0x80);    //根据写状态寄存器命令字,写入保护指令

    }   
   
  }
   

void display_1302(uint shi,uint fen,uint miao) //把数据分离,存到数组shijian里

{
  uchar shishi,shige,fenshi,fenge,miaoshi,miaoge;
  shishi=shi/10;
  shige=shi%10;
  fenshi=fen/10;
  fenge=fen%10;
  miaoshi=miao/10;
  miaoge=miao%10;
  shijian[0]=shishi;
  shijian[1]=shige;
  shijian[2]=':';
  shijian[3]=fenshi;
  shijian[4]=fenge;
  shijian[5]=':';
  shijian[6]=miaoshi;
  shijian[7]=miaoge;
  
  }
void get_1302()  //从1302里读取值并转换

{
  uint hour,minute,second;
  hour=r_1302(0x85);
  shi=((hour&0x70)>>4)*10 + (hour&0x0F);
  minute=r_1302(0x83);
  fen=((minute&0x70)>>4)*10 + (minute&0x0F);
  second=r_1302(0x81);
  miao=((second&0x70)>>4)*10 + (second&0x0F);
  display_1302(shi,fen,miao);

  }

void show()  //显示子函数

{
   
  get_1302();
  pos(2,4);
  print(shijian);
  delay_ms(500);  
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
}

void main()

{   
  
  init_lcd();
  init_1302();
  while(1)
       {  
   
   show();

   }
  }   


各位大侠帮忙看看哪里出了问题,12864上显示不正确,小弟菜鸟正在学习中、谢各位了、、、、

相关帖子

沙发
code-03|  楼主 | 2010-11-9 15:48 | 只看该作者
耽误各位大侠的时间帮小弟看看上边的程序哪出错了、我看了快一天了、还没看出来、感谢了、、

使用特权

评论回复
板凳
yuanquan12345| | 2010-11-9 21:51 | 只看该作者
帮您顶,1302网上的程序很多,下一个对照手册看看,应该没问题,
不过这里的高手很多,他们会帮您的。

使用特权

评论回复
地板
code-03|  楼主 | 2010-11-10 08:41 | 只看该作者
感谢楼上的朋友,我在网上也找了点资料,感觉时序都对着的,12864的时序也对着的,找了大半天也不知道哪里的问题、还请各位大侠帮忙、、、

使用特权

评论回复
5
yuanquan12345| | 2010-11-10 09:52 | 只看该作者
发给你个程序参考参考。

无字库12864模拟万年历.zip

6.46 KB

使用特权

评论回复
6
code-03|  楼主 | 2010-11-10 14:20 | 只看该作者
和你的方法一样啊、读回来BCD码,再转换成十进制,分离,存到数组里边,再送12864显示啊,18b20的我已经显示正常了,再加上1302,1302的是时间就显示不正常了温度还显示正常的,后来我单独试了试1302,还是显示不正常,单独的1302就是一楼的程序、、不知道哪里出了问题、、、

使用特权

评论回复
7
yuanquan12345| | 2010-11-10 14:50 | 只看该作者
1302不会坏了吧?见过郭天祥做实验的视频上就坏过。
能把您的18B20的程序发一份吗?
我想显示小数,可是写出来,个位和十位不显示,光显示小数。
还没找到原因。
请帮忙。

使用特权

评论回复
8
code-03|  楼主 | 2010-11-10 15:17 | 只看该作者
1302坏了??不会吧、我用别的1302的程序就能显示出来,就是一楼的程序不知道问题出在哪了、18b20的程序?没问题。给你一份, 18B20.rar (1.58 KB)

使用特权

评论回复
9
code-03|  楼主 | 2010-11-10 15:18 | 只看该作者
小数点后能显示四位、

使用特权

评论回复
10
yuanquan12345| | 2010-11-10 16:03 | 只看该作者
我只是显示一位小数,在数据转换函数里没用if语句。
不知道是不是它的原因。
谢谢您。

使用特权

评论回复
11
yuanquan12345| | 2010-11-10 16:04 | 只看该作者
我只是显示一位小数,在数据转换函数里没用if语句。
不知道是不是它的原因。
谢谢您。

使用特权

评论回复
12
code-03|  楼主 | 2010-11-10 16:07 | 只看该作者
你对照我给你的程序看看、把小数点后几位分离出来,就能显示出来了、

使用特权

评论回复
13
yuanquan12345| | 2010-11-10 17:11 | 只看该作者
好的,谢谢。

使用特权

评论回复
14
yuanquan12345| | 2010-11-11 10:59 | 只看该作者
没用void gettemp()                //读取寄存器中存的温度
内的if,else语句,这个判断是不是显示+,-号。
现在我的还不正常。

使用特权

评论回复
15
code-03|  楼主 | 2010-11-11 16:27 | 只看该作者
没用if,else,语句也应该没问题的啊、、

使用特权

评论回复
16
yuanquan12345| | 2010-11-11 16:35 | 只看该作者
用了if(t)
        {
          wendu[0]=':';
          wendu[1]='-';
            temp_value=b<<4;
          temp_value+=(a&0xf0)>>4;  
          temp_value=~temp_value+1;
          temp1_value=~a&0x0f;
        }
        else
        {  
        temp_value=b<<4;
        temp_value+=(a&0xf0)>>4;
                temp1_value=a&0x0f;
            wendu[0]=':';
            wendu[1]=temp_value/100+'0';  //百位
       if(wendu[1]=='1')
       {
            wendu[1]='1';
       }
       else
       {
           wendu[1]=' ';
       }
           
        }
现在显示正常了,没明白上面的语句是什么意思。

使用特权

评论回复
17
yuanquan12345| | 2010-11-11 16:37 | 只看该作者
还有个问题在刚送电的瞬间显示80多度。
不知道是什么原因。

使用特权

评论回复
18
code-03|  楼主 | 2010-11-11 17:07 | 只看该作者
是85°吧、、应该是残留的数、

使用特权

评论回复
19
code-03|  楼主 | 2010-11-11 17:09 | 只看该作者
黄天不负我这菜鸟,终于让我把问题给解决了,哈哈,结贴了、、、感谢yuanquan12345的支持、

使用特权

评论回复
20
yuanquan12345| | 2010-11-11 17:30 | 只看该作者
不客气。

使用特权

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

本版积分规则

0

主题

169

帖子

1

粉丝