找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机C语言函数的参数设置为端口?

[复制链接]
跳转到指定楼层
楼主
ID:356967 发表于 2022-7-7 09:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机C语言的函数参数想要设置为单片机的端口,输入P0,P1,P2这些来运行,该怎么弄?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:230742 发表于 2022-7-7 12:06 | 只看该作者
好像不能直接用端口做函数的参数。可以用按键的办法把端口的值读进来,赋值给一个变量,
大概是这样的:
ab=P0;
在用ab做参数传递。
回复

使用道具 举报

板凳
ID:161164 发表于 2022-7-7 13:24 | 只看该作者
不能直接传参
只能间接操作

  1. #define GPIOP0  0x80
  2. #define GPIOP1  0x90
  3. #define GPIOP2  0xA0
  4. #define GPIOP3  0xB0

  5. void SetGPIO(char GPIO,char Pin)
  6. {
  7.     switch(GPIO)
  8.     {
  9.     case GPIOP0:
  10.         P0 |= (0x01 << Pin);
  11.         break;
  12.     case GPIOP1:
  13.         P1 |= (0x01 << Pin);
  14.         break;
  15.     case GPIOP2:
  16.         P2 |= (0x01 << Pin);
  17.         break;
  18.     case GPIOP3:
  19.         P3 |= (0x01 << Pin);
  20.         break;
  21.     }
  22. }
  23. void ResetGPIO(char GPIO,char Pin)
  24. {
  25.     switch(GPIO)
  26.     {
  27.     case GPIOP0:
  28.         P0 &= ~(0x01 << Pin);
  29.         break;
  30.     case GPIOP1:
  31.         P1 &= ~(0x01 << Pin);
  32.         break;
  33.     case GPIOP2:
  34.         P2 &= ~(0x01 << Pin);
  35.         break;
  36.     case GPIOP3:
  37.         P3 &= ~(0x01 << Pin);
  38.         break;
  39.     }
  40. }
  41. bit ReadGPIO(char GPIO,char Pin)
  42. {
  43.     bit IDR = 0;
  44.     switch(GPIO)
  45.     {
  46.     case GPIOP0:
  47.                                 if(P0 & (0x01 << Pin))IDR = 1;
  48.         break;
  49.     case GPIOP1:
  50.                                 if(P1 & (0x01 << Pin))IDR = 1;
  51.         break;
  52.     case GPIOP2:
  53.                                 if(P2 & (0x01 << Pin))IDR = 1;
  54.         break;
  55.     case GPIOP3:
  56.                                 if(P3 & (0x01 << Pin))IDR = 1;
  57.         break;
  58.     }
  59.     return IDR;
  60. }
复制代码


回复

使用道具 举报

地板
ID:213173 发表于 2022-7-7 16:13 | 只看该作者
//51单片机,P3接按键,P1接LED,实际电路证明可以用端口直接传参

#include <reg51.h>

void display(unsigned char i)
{
        P1=i;
}

void main()                                                       
{
        while(1)
        {
                display(P3);
        }
}
回复

使用道具 举报

5#
ID:161164 发表于 2022-7-7 16:40 | 只看该作者
wulin 发表于 2022-7-7 16:13
//51单片机,P3接按键,P1接LED,实际电路证明可以用端口直接传参

#include

可能我误会了楼主的意思
和另一个帖子的问题弄混了
另一个帖子问的是同一个函数(如IIC读写)
透过端口传参来达到不同引脚共用函数的方法
回复

使用道具 举报

6#
ID:883242 发表于 2022-7-7 17:51 | 只看该作者
wulin 发表于 2022-7-7 16:13
//51单片机,P3接按键,P1接LED,实际电路证明可以用端口直接传参

#include

不对,他是要传P0、P1、P2…… 给函数,然后函数对这几个端口中的一个进行操作。
你写的display(P3); 传进去的是P3的值,而不是P3这个端口。
回复

使用道具 举报

7#
ID:883242 发表于 2022-7-7 18:04 | 只看该作者
想了想,只能定义几个伪端口,然后把伪端口传进去,对真实端口操作。

  1. #include <reg51.h>
  2. //pseudoports
  3. #define PP0 0x80
  4. #define PP1 0x90
  5. #define PP2 0xa0
  6. #define PP3 0xb0
  7. void display(unsigned char i){
  8.         switch (i){
  9.                 case PP0:
  10.                         P0=0x55;
  11.                   break;
  12.                 case PP1:
  13.                         P1=0x55;
  14.                   break;
  15.                 case PP2:
  16.                         P2=0x55;
  17.                   break;
  18.                 case PP3:
  19.                         P3=0x55;
  20.                   break;
  21.                 }
  22. }

  23. void main(void){
  24.         for(;;){
  25.                 display(PP3);
  26.         }
  27. }
复制代码
回复

使用道具 举报

8#
ID:401564 发表于 2022-7-7 20:14 | 只看该作者
新手入门往往是想当然的要一种所谓的功能,然后就提问了,有时挤破脑子都不知道你要干嘛
但更多的时候,你所要的功能却是另外一个很简单的知识点而已
比如,你有个并口数据是连接P1的
你是不是想这样:
函数(P1);
那我这样不就行了:
a=P1;
函数(a);
难不成你想要这样声明函数:
函数(sfr a);
回复

使用道具 举报

9#
ID:86450 发表于 2022-7-7 22:26 | 只看该作者
我感觉你要写出一大推的宏定义。就能实现了
回复

使用道具 举报

10#
ID:771630 发表于 2022-7-8 07:01 | 只看该作者
51的定义是靠sfr实现的,如果想要传递端口,可以把端口的指针传递,然后直接对地址进行写值
回复

使用道具 举报

11#
ID:213173 发表于 2022-7-8 07:39 | 只看该作者
Y_G_G 发表于 2022-7-7 20:14
新手入门往往是想当然的要一种所谓的功能,然后就提问了,有时挤破脑子都不知道你要干嘛
但更多的时候,你所 ...

你分析得对,从楼主上篇帖子《为什么单片机C语言按键扫描反应慢?》看,可能没有解决问题而发了这个语焉不详的帖子,误导别人想多了。都砌到9楼了,楼主还没有吭一声。感觉好像是有人出了个脑筋急转弯,众人瞎猜。如果再遇上个懂王杠精就更无趣了。
回复

使用道具 举报

12#
ID:883242 发表于 2022-7-8 07:55 | 只看该作者
XLinliY.Zhang 发表于 2022-7-8 07:01
51的定义是靠sfr实现的,如果想要传递端口,可以把端口的指针传递,然后直接对地址进行写值

你去看看51指令集,你的想法根本就不可能,没有指令可以实现。SFR位于RAM空间高128字节,只能直接寻址,能改变地址的是间接寻址,但是无法访问SFR,只能访问RAM。

比如给P0赋值,只能写成MOV 0x80,A,注意这个0x80是写死在flash里面的,无法被更改。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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