找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MCU IO怎么样运用C语言结构体?

[复制链接]
跳转到指定楼层
楼主
    很多MCU单片机IO口都需调用一个类似的子函数,但是如果都用不同的子函数代码又太长了,有什么好的方法解决这个问题,隐约记得可以用结构体或者宏参数,但是没有用过,不知道怎么用,有没有大佬指点一下,谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 (5.75 KB, 下载次数: 41)

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黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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