找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1915|回复: 3
打印 上一主题 下一主题
收起左侧

C51单片机写的I2C驱动头文件中,引脚经过宏定义为什么会报错?

[复制链接]
跳转到指定楼层
楼主
ID:735654 发表于 2020-8-18 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用C51写一个单片机的门禁机操作系统,其中一个I2C驱动文件我的宏定义试了以下很多种写法,但还是报错
貌似这四种都会报错
#define SDA P20 /*定义SDA线为P2^0端口*/
#define SDA P2^0
sb SDA=P2^0; /*sb是sbit的宏定义简写*/
sb SDA=P2^0;
/*下面是头文件的程序,错误代码是C141语法错误,*/
#define SCL P21  /*定义SCL线为P2^1端口*/
#define SDA P20  /*定义SDA线为P2^0端口*/
i2c_clk_en() /*时钟使能函数*/
{
dly(5);
SCL=1;
dly(5);
SCL=0;
dly(5);
}
i2c_ack() /*应答位输出*/
{
SDA=0;
i2c_clk_en();
}
i2c_start()   /*启动传输函数*/
{
SCL=1;
dly(1);
SDA=0; /*输出下降沿*/
dly(2);
SCL=0;
dly(2);
}
i2c_finish()  /*结束传输函数*/
{
SCL=0;
dly(1);
SDA=0;
dly(1)
SCL=1;
dly(2)
SDA=1;
dly(2);
}
i2c_init(ui startadd,bt wt)  /*初始化函数,向从机声明器件地址、读写方式、和字节地址*/
{
xui i;
xui *add_p = &startadd;
SDA=1;
i2c_clk_en();
SDA=0;
i2c_clk_en();
SDA=1;
i2c_clk_en();
SDA=0;
i2c_clk_en();
SDA=0;
i2c_clk_en();
i2c_clk_en();
i2c_clk_en();
if(wt==0)  /*传输读写标志位*/
  {
  SDA=0;
  i2c_clk_en();
  }
else
  {
  SDA=1;
  i2c_clk_en();
  }
i2c_ack();
fr(i=0;i<8;i++)  /*传输字节地址帧*/
  {
  if(i>0)
    {
    startadd<<1;
    }
  if(startadd && 0x80)
    {
    SDA=1;
    }
    else
    {
    SDA=0;
    }
  i2c_clk_en();
  }
}
i2c_write_core(uc *wdats)  /*存储写入内核函数*/
{
xui i;
fr(i=0;i<8;i++)
  {
  if(i>0)
    {
    wdats[ i]<<1;
    }
  if(wdats[ i] && 0x80)
    {
    SDA=1;
    }
    else
    {
    SDA=0;
    }
  }
i2c_ack();/*数据应答位*/
}

i2c_read_core(ui datsize)  /*I2C存储器读出内核函数*/
{
xui i;
xui j;
xuc rdat[];
xui *pnt;
pnt=&rdat[0];
fr(j=0;j<datsize;j++) /*每循环一次发送一个字节*/
  {
  fr(i=0;i>8;i++) /*八个读位循环,一个字节*/
    {
    if(i>0)
      {
      rdat[j]<<1; /*头一位不左移,其余的都左移*/
      }
    i2c_clk_en();
    if(SDA==1) /*如果总线没有被从机拉低*/
      {
      rdat[j]+1; /*则判断为1,否则为0,加到rdat[j]的最后一位上*/
      }
    }
  i2c_ack();    /*发送一个应答位*/
  }
rtn pnt;
}
i2c_r_optr(ui startadd,ui dtsz) /*完整读操作函数*/
{
xui i;
xuc rdat[];
xui *pnt;
i2c_start();
i2c_init(startadd,1);
fr(i=0;i<dtsz;i++)
  {
  rdat[ i]=i2c_read_core(dtsz);
  }
i2c_finishi();
rtn pnt;  /*返回读出数据的指针*/
}
i2c_w_optr(ui startadd,uc *dats,ui dtsz) /*完整写操作函数*/
{
xui j;
i2c_start();
i2c_init(startadd,0);
fr(j=0;j<dtsz;j++)
  {
  i2c_write_core(dats+j);
  }
i2c_finishi();
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:287575 发表于 2020-8-18 23:30 | 只看该作者
#define sb sbit
#define P21 P2^1

sb SDA=P21;

编译了一下,没错误呀
回复

使用道具 举报

板凳
ID:235200 发表于 2020-8-19 00:13 | 只看该作者
#define SDA P20 /*定义SDA线为P2^0端口*/
#define SDA P2^0
sb SDA=P2^0; /*sb是sbit的宏定义简写*/
sb SDA=P2^0;
/*下面是头文件的程序,错误代码是C141语法错误,*/
#define SCL P21  /*定义SCL线为P2^1端口*/
#define SDA P20  /*定义SDA线为P2^0端口*/
这些定义的对错取决于所选用的单片机头文件,如REG51.h,未看到该头文件无法判断
回复

使用道具 举报

地板
ID:735654 发表于 2020-8-21 17:58 | 只看该作者
zhangxiaozi 发表于 2020-8-18 23:30
#define sb sbit
#define P21 P2^1

我怎么就不行啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表