导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[求助]我的1302为什么会写不进去呀,各位DX帮看下很简单[雷影]

 *第45010篇: [求助]我的1302为什么会写不进去呀,各位DX帮看下很简单的程序

  
楼 主:雷影 2006年12月11日19:21
 [求助]我的1302为什么会写不进去呀,各位DX帮看下很简单的程序
各位DX:小弟这两天买了个1302想玩下,可是用下面最简单的程序来先初始化然后再读出时间进行显示,结果是发现1302写不进初始值,但能正常读出时间。请大家帮忙找下程序中的问题。硬件是没有问题的,是用别人已经做成功的板子来写的。先谢谢各位了!
#include  <reg51.h>  
#define uchar unsigned char
#define uint unsigned int
#define ADB P0

sbit ELCD=P2^5;
sbit R_W=P2^6;
sbit RS=P2^7;
sbit clk=P3^3;
sbit da=P3^4;
sbit rst=P3^5;

uchar code discode[]={'0','1','2','3','4','5','6','7','8','9'};//LCD显示0~9的
ASSII码
uchar sec=0;uchar hsec=0;uchar lsec=0;
uchar min=0;
uchar hmin=0;
uchar lmin=0;
uchar hour=0;uchar hhour=0;uchar lhour=0;

initlcd();//LCD初始化
wrcm(uchar a);//LCD写命令字
wrda(uchar b);//LCD写数据
init1302();//1302初始化
void wr1302(uchar adr1302,uchar dat1302);//写1302
uchar re1302(uchar adr302);//读1302
retime();//读时间
dotime();//秒、分、时,时间处理
lcddisp();//LCD显示
Delay();//用延时来代替查询LCD的BF忙信号

main()
{
  initlcd();
  init1302();
  while(1)
{
  retime();
  dotime();
  lcddisp();
 
}
}
//*****************************
retime()
{
 sec=re1302(0x81);
 min=re1302(0x83);
 hour=re1302(0x85);
}
//*****************************
dotime()
{
 hsec=sec&0xf0;
 hsec=hsec>  >  4;
 lsec=sec&0x0f;//拆出秒的十位、个位

 hmin=min&0xf0;
 hmin=hmin>  >  4;
 lmin=min&0x0f;//拆出分的十位、个位

 hhour=hour&0xf0;
 hhour=hhour>  >  4;
 lhour=hour&0x0f;//拆出时的十位、个位
}
//*****************************
lcddisp()
{
 wrcm(0x84);
 wrda(discode[hhour]);
 wrda(discode[lhour]);//显示时
 wrda(0x3a);//显示时和分的分隔符:
 wrda(discode[hmin]);
 wrda(discode[lmin]);//显示分
 wrda(0x3a);//显示分和秒的分隔符:
 wrda(discode[hsec]);
 wrda(discode[lsec]);//显示秒
}
//*****************************
init1302()
{
 wr1302(0x8e,0x00);//打开写保护
 wr1302(0x80,0x80);//秒初始化,关振荡器,但读出时间时发现秒仍旧正常走时。
 wr1302(0x82,0x01);//分初始化
 wr1302(0x84,0x01);//时初始化,分和时读出后显示的是乱码
 
}//说明是初始化时写不进去,这是为什么呢?

//****************************
initlcd()
{
  wrcm(0x00);
  wrcm(0x38);
  wrcm(0x0c);
  wrcm(0x06);
  }
//****************************
wrcm(uchar a)
{
 ELCD=0;
 R_W=0;
 RS=0;
 ELCD=1;
 ADB=a;
 ELCD=0;
 Delay();
 }
//*****************************
wrda(uchar b)
{
 ELCD=0;
 R_W=0;
 RS=1;
 ELCD=1;
 ADB=b;
 ELCD=0;
 Delay();
 }
//******************************
void wr1302(uchar adr1302,uchar dat1302)
{
 char i,m;
 clk=0;
 rst=1;
 for(i=0;i  <8;i++)
 {
  m=adr1302&0x01;
  if(m)
  da=1;
  else da=0;
  clk=0;
  //Delay();
  clk=1;
  adr1302=adr1302>  >  1;
 }
 for(i=0;i  <8;i++)
 {
  m=dat1302&0x01;
  if(m)
  da=1;
  else da=0;
  clk=0;
  //Delay();
  clk=1;
  adr1302=adr1302>  >  1;
 }
 rst=0;
}
//****************************
uchar re1302(uchar adr1302)
{
 uchar i,m;
 clk=0;
 rst=1;
 for(i=0;i  <8;i++)
 {
  if((adr1302>  >  i)&0x01)
  da=1;
  else da=0;
  clk=0;
 // Delay();
  clk=1;
  
 }
  m=0;
  for(i=0;i  <8;i++)
  {//da=1;
   m=m>  >  1;
   clk=1;
   //Delay();
   clk=0;
   if(da)
   m=m|0x80;
   else m=m&0x7f;
  }
  rst=0;
  return(m);
}
//****************************
Delay()
{
 uchar j;
 for(j=0;j  <248;j++);
}
//***************************
 

  
2楼:雷影 2006年12月13日22:07
 [讨论]
就没有人能发现问题的所在吗?人气不怎么旺呀
  
3楼:glgsy 2006年12月13日23:37
 wr1302()函数有错
wr1302()函数有错
for(i=0;i    <8;i++)
 {
  m=dat1302&0x01;
  if(m)
  da=1;
  else da=0;
  clk=0;
  //Delay();
  clk=1;
  adr1302=adr1302>    >    1; //这句错了吧

 }
 rst=0;
}


>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:MSP430系列要多少钱啊

[下一篇主题]:[求助]ps2键盘capslock、numlock