这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 为什么指针无法读取返回值

共8条 1/1 1 跳转至

为什么指针无法读取返回值

助工
2013-12-17 00:48:24     打赏
#include<reg52.h>
#include "1602.h"

#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define  delay()  _nop_();_nop_();_nop_();_nop_();_nop_()
  sbit scl=P2^6;
  sbit sda=P2^7;

uchar  l[]={0x63,3,4,5,6,7,8,9};
uint k[8];
void start()
{  
  sda=1;
  scl=1;
  delay();
  sda=0;
  delay();
  scl=0;
}
void stop()
{  
sda=0;
scl=1;
delay();
sda=1;
delay();
  
}
void ack()

scl=1;
sda=1;
while(sda);
scl=0;
delay();
}

void PC_ack()
{

scl=1;
sda=1;
sda=0;
delay();
scl=0;
delay();
}

void write_byte(uchar d)
{ uchar i;
for(i=0;i<8;i++)
   { 
            sda=(bit)((d<<i)&0x80);
          scl=1; 
          scl=0;  
   }
}
void write_one(uchar e,uchar f)

   start();
   write_byte(0xa0);
   ack();
   write_byte(e);
   ack();
   write_byte(f);
   ack();
   stop();
}

uint read_byte()
{ uchar i;
  uint b;
  for(i=0;i<8;i++)
   {  
              b<<=1;        
                scl=0;
                b|=(sda)?0x01:0x00; 
        scl=1;
   }
    return b;
}
uchar read_one(uchar m)
{
  uchar b;
  start();
  write_byte(0xa0);
  ack();
  write_byte(m);
  ack();
  start();
  write_byte(0xa1);
  ack();
  b=read_byte();
  delay();  
   stop();
   return b;
}

void write_page(uchar e,uchar *q)
{
   start();
   write_byte(0xa0);
   ack();
   write_byte(e);
   ack();
   while(*q)
   {
            write_byte(*(q++));
     ack();
   }
   stop();
}
uint read_page(uchar h,uchar m)

  uint *v;
  uchar i;
  start();
  write_byte(0xa0);
  ack();
  write_byte(h);
  ack();
  start();
  write_byte(0xa1);
  ack();
        for(i=0;i<m;i++)
        {
          k=read_byte();
          PC_ack();
          
    }
  stop();
  v=&k[0];
  return *v;
}


void main()

   uint **w;
   uchar i;
   write_page(0x00,l);
   LCD_init();
   while(1)
   {  
   
            for(i=0;i<8;i++)
          {
          w=read_page(0x00,8);
           zl(0x80+i*2);
           sj((**w>>4)%10+0x30);
           sj((**w&0x0f)%10+0x30);
          }
     
   }

}

为什么在主函数中的
     w=read_page(0x00,8);
  会出现   illegal pointer conversion 的语句?哪位大神能告诉我,谢谢



专家
2013-12-17 08:41:29     打赏
2楼
0x去掉

院士
2013-12-17 09:04:42     打赏
3楼
好长啊

高工
2013-12-17 09:35:36     打赏
4楼

楼主这是模拟的I2C通信吧,

uint read_page(uchar h,uchar m)

  uint *v;
  uchar i;
  start();
  write_byte(0xa0);
  ack();
  write_byte(h);
  ack();
  start();
  write_byte(0xa1);
  ack();
        for(i=0;i<m;i++)
        {
          k=read_byte();  ......此处也有问题吧,K【i】?
          PC_ack();
          
    }
  stop();
  v=&k[0];.................返回数组的首地址,最终的目的
  return *v;
}

返回的是一个值,去给指向指针的指针赋值肯定行不通,

其实没必要这么复杂,指针传递是“传址”的,可以在外部声明一个指针数组,在内部用其来接收返回值,在外部会同步更新的,说多了也不好说,建议楼主看看C指针方面的资料。


院士
2013-12-17 10:33:10     打赏
5楼

高工
2013-12-17 20:32:14     打赏
6楼

指针跑偏了哟

注意*V和**W是不一样的


助工
2013-12-18 23:24:18     打赏
7楼

我今天这样写没有语病,但还是乱码


uint   *k[8];

uint read_page(uchar h,uchar m)

  
  uchar i;
  start();
  write_byte(0xa0);
  ack();
  write_byte(h);
  ack();
  start();
  write_byte(0xa1);
  ack();
  for(i=0;i<m;i++)
{
 *k[i]=read_byte();
 PC_ack();
 
    }
  stop();
 
  return k[0];
}

void main()
 { 
//   uint *w;
   uchar i;
   write_page(0x00,l);
   LCD_init();  
   while(1)
   {  
  read_page(0x00,8);
    for(i=0;i<8;i++)
 {
 
  zl(0x80+i*2);
  sj((*k[i]>>4)%10+0x30);
  sj((*k[i]&0x0f)%10+0x30);
  
 }
     
   }
 }

你能帮帮忙,把你想的写出来吗,谢谢



高工
2013-12-19 22:34:40     打赏
8楼
不明白楼主为什么要用指针,I2C读页数据保存在数组k[i]里不就好啦,你定义*k[i],然后 *k[i]=read_byte(); 这是什么意思呢?难道你I2C读出的不是数据,全是另一些数据的地址????总之感觉你指针用的多此一举

共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]