数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 7539|回复: 23

[other] 分享一个自己写的STC单片机设置GPIO的宏

[复制链接]
发表于 2021-1-19 19:03:46 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
我自己用了很久了,分享出来希望可以帮助大家。
注意:port代表端口号,pin代表引脚编号,例如P12的端口号是1,引脚编号是2。例如要设置P12为推挽输出,则使用:GPIO_MODE_PP(1,2); 即可

  1. //设置单个GPIO的工作模式
  2. #define GPIO_MODE_BIIO(port,pin)  do{ P##port##M1 &= (unsigned char)(~(1<<pin)); P##port##M0 &= (unsigned char)(~(1<<pin)); }while(0) /*传统的双向IO*/
  3. #define GPIO_MODE_PP(port,pin)    do{ P##port##M1 &= (unsigned char)(~(1<<pin)); P##port##M0 |= (unsigned char)(1<<pin);    }while(0) /*推挽输出*/
  4. #define GPIO_MODE_HIZIN(port,pin) do{ P##port##M1 |= (unsigned char)(1<<pin);    P##port##M0 &= (unsigned char)(~(1<<pin)); }while(0) /*高阻输入*/
  5. #define GPIO_MODE_OD(port,pin)    do{ P##port##M1 |= (unsigned char)(1<<pin);    P##port##M0 |= (unsigned char)(1<<pin);    }while(0) /*开漏输出*/

  6. //设置一个端口下的所有GPIO为同种工作模式
  7. #define PORT_MODE_BIIO(port)      do{ P##port##M1 =0x00;  P##port##M0 =0x00; }while(0)  /*传统的双向IO*/
  8. #define PORT_MODE_PP(port)        do{ P##port##M1 =0x00;  P##port##M0 =0xFF; }while(0)  /*推挽输出*/
  9. #define PORT_MODE_HIZIN(port)     do{ P##port##M1 =0xFF;  P##port##M0 =0x00; }while(0)  /*高阻输入*/
  10. #define PORT_MODE_OD(port)        do{ P##port##M1 =0xFF;  P##port##M0 =0xFF; }while(0)  /*开漏输出*/
复制代码
建议大家可以多用宏封装对寄存器的操作,一方面是方便,一方面是有助于程序的抽象和理解。
这个事情本来是STC公司的软件开发部门的事,但是人家STC不做啊,:lol:

打赏

参与人数 4家元 +66 收起 理由
autopccopy + 1 STC官网早有库函数,含GPIO!
水表君 + 5 支持!
flishmen + 30 優秀文章
家睦 + 30

查看全部打赏

 楼主| 发表于 2021-1-20 11:43:09 | 显示全部楼层
freemancn 发表于 2021-1-19 23:20
#define SET_BIT(R, BIT)                        (R |= (1

我没记错的话,这个应该是新塘提供的BSP中的代码:giggle:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-20 11:44:44 | 显示全部楼层
桃源客 发表于 2021-1-19 22:23
好东西,下载来用下了.封成头文件可能好用点.

是的,可以直接粘贴到STC的寄存器头文件中去,例如 STC15.H中
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-10 23:32:48 | 显示全部楼层
上官梦舞 发表于 2021-1-21 10:33
P1M0 = 0XAA;
P1M1 = 0X00;
两行就能初始化8个口,用你这个不是得8行?

我代码提供了设置同一个port的所有IO为同一个指定状态的宏啊,请你再看清楚
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-10 23:36:18 | 显示全部楼层
水表君 发表于 2021-2-3 16:55
很不错!支持楼主,谢谢分享。
各有各的优点,传统的使用PxM0和PxM1固然是好,如果只在初始化操作这样写两 ...

我的代码是用于设置IO的工作模式,一般开发情况下,IO的工作模式是设置一次就不变的,后续只需改变IO输出状态或者读取IO输入状态。更何况这是工具!把它粘贴到你的头文件里就可以直接用了,等你使用的时候才会知道方便,而不是要你研究并复写这个工具。所以我认为你说的问题并不是问题。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 03:24 , Processed in 0.140400 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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