找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我在用单片机P2口的某些引脚会报错?

[复制链接]
跳转到指定楼层
楼主
ID:735654 发表于 2020-9-13 12:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的特殊寄存器头文件里已经是了这样写的了(下面是STC标准头文件的IO并口定义片段)
sfr P0   = 0x80;
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sfr P1   = 0x90;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sfr P2   = 0xA0;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sfr P3   = 0xB0;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;
但是,在一个工程里,其中一个头文件这么写就不会报错
#define LCD_DATA P0
#define LCD_EN P27
#define LCD_RS P26
#define LCD_RW P25


LCD_w_com(uc com) /*LCD输入指令*/
{
LCD_EN=1;
dly(1);
LCD_RS=0;
LCD_RW=0;
LCD_DATA=com;
dly(2);
LCD_EN=0;
dly(1);
LCD_EN=1;
}


LCD_w_data(uc disdat) /*LCD输入数据*/
{
LCD_EN=1;
dly(1);
LCD_RS=1;
LCD_RW=0;
LCD_DATA=disdat;
dly(2);
LCD_EN=0;
dly(1);
LCD_EN=1;
}


LCD_init()  /*LED初始化*/
{
LCD_w_com(0x38);  /*00111000,功能设置*/
LCD_w_com(0x0c);  /*00001100,显示开关*/
LCD_w_com(0x06);  /*00000110,输入模式光标右移,*/
LCD_w_com(0x01);  /*擦除屏幕,最简单的命令*/
}


LCD_display(uc x,uc y,ui disdat[]) /*LCD1206显示程序*/
{
xui i,j;
j=szof(disdat);
if(j>16)
  {
  rtn 1;
  }
if(y==1&&y==2)  /*判断是1行还是2行*/
  {
    if(y==1)  /*如果是第一行*/
    {  
      LCD_w_com(0x80+x);  /*指令位*/
      fr(i=0;i<j;i++)
      {
      LCD_w_data(*disdat);
      disdat++;
      }
    }
    if(y==2)  /*如果是第二行*/
    {   
      LCD_w_com(0x80+0x40+x);  /*指令位*/
      fr(i=0;i<j;i++)
      {
      LCD_w_data(*disdat);
      disdat++;
      }
    }
  rtn 0;
  }
else
  {
  rtn 1;
  }
}
另一个头文件,这么写就会报错,而且怎么弄也不行:
  1. #define SDA P20
  2. #define SCL P21
  3. i2c_clk_en() /*时钟使能函数*/
  4. {
  5. dly(5);
  6. SCL=1;
  7. dly(5);
  8. SCL=0;
  9. dly(5);
  10. }


  11. i2c_ack() /*应答位输出*/
  12. {
  13. SDA=0;
  14. i2c_clk_en();
  15. }


  16. i2c_start()   /*启动传输函数*/
  17. {
  18. SCL=1;
  19. dly(1);
  20. SDA=0; /*输出下降沿*/
  21. dly(2);
  22. SCL=0;
  23. dly(2);
  24. }


  25. i2c_finish()  /*结束传输函数*/
  26. {
  27. SCL=0;
  28. dly(1);
  29. SDA=0;
  30. dly(1)
  31. SCL=1;
  32. dly(2)
  33. SDA=1;
  34. dly(2);
  35. }


  36. i2c_init(ui startadd,bt wt)  /*初始化函数,向从机声明器件地址、读写方式、和字节地址*/
  37. {
  38. xui i;
  39. xui *add_p = &startadd; /**/
  40. SDA=1;
  41. i2c_clk_en();
  42. SDA=0;
  43. i2c_clk_en();
  44. SDA=1;
  45. i2c_clk_en();
  46. SDA=0;
  47. i2c_clk_en();
  48. SDA=0;
  49. i2c_clk_en();
  50. i2c_clk_en();
  51. i2c_clk_en();
  52. if(wt==0)  /*传输读写标志位*/
  53.   {
  54.   SDA=0;
  55.   i2c_clk_en();
  56.   }
  57. else
  58.   {
  59.   SDA=1;
  60.   i2c_clk_en();
  61.   }
  62. i2c_ack();
  63. fr(i=0;i<8;i++)  /*传输字节地址帧*/
  64.   {
  65.   if(i>0)
  66.     {
  67.     startadd<<1;
  68.     }
  69.   if(startadd && 0x80)
  70.     {
  71.     SDA=1;
  72.     }
  73.     else
  74.     {
  75.     SDA=0;
  76.     }
  77.   i2c_clk_en();
  78.   }
  79. }


  80. i2c_write_core(uc *wdats)  /*存储写入内核函数*/
  81. {
  82. xui i;
  83. fr(i=0;i<8;i++)
  84.   {
  85.   if(i>0)
  86.     {
  87.     wdats[ i]<<1;
  88.     }
  89.   if(wdats[ i] && 0x80)
  90.     {
  91.     SDA=1;
  92.     }
  93.     else
  94.     {
  95.     SDA=0;
  96.     }
  97.   }
  98. i2c_ack();/*数据应答位*/
  99. }




  100. i2c_read_core(ui datsize)  /*I2C存储器读出内核函数*/
  101. {
  102. xui i;
  103. xui j;
  104. xuc rdat[];
  105. xui *pnt;
  106. pnt=&rdat[0];
  107. fr(j=0;j<datsize;j++) /*每循环一次发送一个字节*/
  108.   {
  109.   fr(i=0;i>8;i++) /*八个读位循环,一个字节*/
  110.     {
  111.     if(i>0)
  112.       {
  113.       rdat[j]<<1; /*头一位不左移,其余的都左移*/
  114.       }
  115.     i2c_clk_en();
  116.     if(SDA==1) /*如果总线没有被从机拉低*/
  117.       {
  118.       rdat[j]+1; /*则判断为1,否则为0,加到rdat[j]的最后一位上*/
  119.       }
  120.     }
  121.   i2c_ack();    /*发送一个应答位*/
  122.   }
  123. rtn pnt;
  124. }


  125. i2c_r_optr(ui startadd,ui dtsz) /*完整读操作函数*/
  126. {
  127. xui i;
  128. xuc rdat[];
  129. xui *pnt=rdat[0];
  130. i2c_start();
  131. i2c_init(startadd,1);
  132. fr(i=0;i<dtsz;i++)
  133.   {
  134.   rdat[ i]=i2c_read_core(dtsz);
  135.   }
  136. i2c_finishi();
  137. rtn pnt;  /*返回读出数据的指针*/
  138. }


  139. i2c_w_optr(ui startadd,uc *dats,ui dtsz) /*完整写操作函数*/
  140. {
  141. xui j;  /*定义循环变量*/
  142. i2c_start(); /*执行起始操作*/
  143. i2c_init(startadd,0); /*传递起始读写地址,进行初始化*/
  144. fr(j=0;j<dtsz;j++)
  145.   {
  146.   i2c_write_core(dats+j); /*传递参数,进行读出*/
  147.   }
  148. i2c_finishi();/*返回空值*/

  149. }
复制代码


百思不得其解,求帮助!



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

使用道具 举报

沙发
ID:342954 发表于 2020-9-13 16:43 | 只看该作者
是不是你加了STC头文件,和又写了SRF P2
回复

使用道具 举报

板凳
ID:792404 发表于 2020-9-13 19:00 | 只看该作者
I/O要先定义试试  
sbit P20 = P2^0;
sbit P21 = P2^1;
#define SDA P20
#define SCL P21
回复

使用道具 举报

地板
ID:735654 发表于 2020-9-13 21:27 | 只看该作者
YUANYUXING 发表于 2020-9-13 19:00
I/O要先定义试试  
sbit P20 = P2^0;
sbit P21 = P2^1;

我要是没定义还用问你吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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