登录|立即注册|使用QQ帐号登录
论坛 > 24小时必答区
发帖|
看4821|回17|收藏
楼主 ID:934353 只看他
2021-7-23 14:37
    很多MCU单片机IO口都需调用一个类似的子函数,但是如果都用不同的子函数代码又太长了,有什么好的方法解决这个问题,隐约记得可以用结构体或者宏参数,但是没有用过,不知道怎么用,有没有大佬指点一下,谢谢
沙发 ID:592807 只看他
2021-7-23 15:24
有啊,结构体内成员可以是函数,就是指针。
板凳 ID:934353 只看他
2021-7-23 15:41

引用:

黄youhui 发表于 2021-7-23 15:24
有啊,结构体内成员可以是函数,就是指针。

可是io口的地址不知道呢怎么办,比如说P1^1这样子,我该怎么用呢
地板 ID:123289 只看他
2021-7-23 17:19
就象做乘法一样,提取公因式。
将公共部门做成子程序,不同部分做成参数变量。
5# ID:934353 只看他
2021-7-23 17:21

引用:

yzwzfyz 发表于 2021-7-23 17:19
就象做乘法一样,提取公因式。
将公共部门做成子程序,不同部分做成参数变量。

我知道大概意思,但是不知如何操作,感谢回答
6# ID:950257 只看他
2021-7-23 18:33

引用:

开心就好hhhh 发表于 2021-7-23 15:41
可是io口的地址不知道呢怎么办,比如说P1^1这样子,我该怎么用呢

地址都在reg51.h这个文件里有声明
7# ID:934353 只看他
2021-7-27 10:13

引用:

gain 发表于 2021-7-23 18:33
地址都在reg51.h这个文件里有声明

这个头文件里有P1,P2等的地址,但是没有看到P1^1之类的具体地址,感谢回答
8# ID:451718 只看他
2021-7-27 10:18
看一下STM32的库函数例程就清楚了。
9# ID:752974 只看他
2021-7-27 15:33
51中的位操作已经做不能再简单了,不知楼主想如何操作。
10# ID:934353 只看他
2021-7-27 15:52

引用:

munuc_w 发表于 2021-7-27 15:33
51中的位操作已经做不能再简单了,不知楼主想如何操作。

比如说把这三个整合到一起,因为数码管的一些函数是一样的,只是不一样的io口驱动不一样的数码管而已
附件列表
0.png (2021-7-27 19:06 上传)

原图尺寸 5.75 KB, 下载次数: 60

0.png

11# ID:956553 只看他
2021-7-27 17:09
看st的库函数封装API或者NXP的封装
12# ID:190577 只看他
2021-7-28 07:23
typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
13# ID:752974 只看他
2021-7-28 08:50

引用:

开心就好hhhh 发表于 2021-7-27 15:52
比如说把这三个整合到一起,因为数码管的一些函数是一样的,只是不一样的io口驱动不一样的数码管而已

选用具有片选信号的数码管驱动器,如TA6932,DIO和CLK共用,数据流向由片选信号控制。
14# ID:934353 只看他
2021-7-28 11:01

引用:

munuc_w 发表于 2021-7-28 08:50
选用具有片选信号的数码管驱动器,如TA6932,DIO和CLK共用,数据流向由片选信号控制。

我就是用了三个数码管驱动芯片,所以才希望将代码写的更简洁一点
15# ID:752974 只看他
2021-7-28 12:43

引用:

开心就好hhhh 发表于 2021-7-28 11:01
我就是用了三个数码管驱动芯片,所以才希望将代码写的更简洁一点

我以前也遇到过你的情况,要写好多函数,内容一样,就是IO分配不同。后来整合到一个函数里,函数增加一个形参,由形参决定片选,用于区别不同的驱动芯片。
16# ID:934353 只看他
2021-7-28 13:06

引用:

munuc_w 发表于 2021-7-28 12:43
我以前也遇到过你的情况,要写好多函数,内容一样,就是IO分配不同。后来整合到一个函数里,函数增加一个 ...

是的是的,我就是想写一个这样的,但是没有写过,就不知道该怎么写,我想参照32的库函数来着,但是感觉又不一样,大佬能不能提点一下?谢谢
17# ID:752974 只看他
2021-7-28 15:00

引用:

开心就好hhhh 发表于 2021-7-28 13:06
是的是的,我就是想写一个这样的,但是没有写过,就不知道该怎么写,我想参照32的库函数来着,但是感觉又 ...

很简单的函数,在原函数里只是增加一个决定片选的形参,由这个参数决定片选信号即可,如:

xxx(xxx,xxx,xCS)
{
  if(xCS==1)
     cs1=0;
else if(xCS==2)
     cs2=0;
else if(xCS==3)
      cs3=0;
//下面就是原来的函数,写入地址,写入数据
  。。。。

}
注意退出函数前各个使用的CS信号要拉高。
18# ID:934353 只看他
2021-7-28 17:24

引用:

munuc_w 发表于 2021-7-28 15:00
很简单的函数,在原函数里只是增加一个决定片选的形参,由这个参数决定片选信号即可,如:

xxx(xxx, ...

好的,好的,有思路了,非常感谢

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版