找回密码
 立即注册
×

00:00:00

您有一张0.1元限时体验卡,马上领取获得VIP尊享特权。

分享一个超级好用的GPIO驱动接口

2024-5-17 12:42 来自 baiyu 发布 @ 综合讨论

本帖最后由 baiyu 于 2024-5-17 14:01 编辑


STC系列单片机的IO口由PX、PXM1、PXM0、PXPU、PXNCS、PXSR、PXDR、PXIE等八组IO寄存器共同控制,新的STC单片机还增加了PXPD寄存器。

如此多的寄存器,如何才能高效率且高性能地驾驭它们呢?

我建立了一种通用的IO驱动模型。通过这种模型,用户只需为目标IO引脚绑定一个别名,就可以通过这个别名和用户的控制意图,间接地操作相关的IO寄存器,再也无需直接与IO寄存器打交道了。

假设我们需要使用STC单片的P3.2引脚驱动LCD1602字符液晶的RS引脚,那么我们可以通过下面的宏定义,将P3.2引脚绑定到别名LCD_RS上:
#define LCD_RS    IO(P3, 2)     //将P3.2引脚绑定到别名LCD_RS上
                                             //第一个参数可以是P0、P1、P2……
                                             //第二个参数可以是0、1、2、3、4、5、6、7、Low(低四位)、High(高四位),或者All(全八位)
这样绑定之后,LCD_RS就成了P3.2引脚的别名,我们就可以通过LCD_RS这个别名,按照我们的意图,间接地操作与P3.2引脚相关的所有寄存器。

1、设置工作模式
STC单片机的IO引脚具有四种工作模式:弱上拉准双向口模式(PullUp模式)、推挽输出口模式(PushPull模式)、高阻输入口模式(HighZ模式),以及开漏双向口模式(OpenDrain模式)
ToPullUp(LCD_RS);               //将LCD_RS引脚(即P3.2引脚)设置为弱上拉双向口模式(PullUp模式)
ToPushPull(LCD_RS);            //将LCD_RS引脚(即P3.2引脚)设置为推挽输出口模式(PushPull模式)
ToHighZ(LCD_RS);                //将LCD_RS引脚(即P3.2引脚)设置为高阻输入口模式(HighZ模式)
ToOpenDrain(LCD_RS);         //将LCD_RS引脚(即P3.2引脚)设置为开漏双向口模式(OpenDrain模式)


2、设置驱动模式(需要事先Enable(XFR);)
STC单片机的IO引脚具有四种驱动模式:电平慢速翻转模式(Slow模式)、电平快速翻转模式(Fast模式)、电流弱驱动模式(Weak模式),以及电流强驱动能力模式(Strong模式)
ToSlow(LCD_RS);             //将LCD_RS引脚(即P3.2引脚)设置为电平慢速翻转模式(Slow模式)
ToFast(LCD_RS);              //将LCD_RS引脚(即P3.2引脚)设置为电平快速翻转模式(Fast模式)
ToWeak(LCD_RS);            //将LCD_RS引脚(即P3.2引脚)设置为电流弱驱动模式(Weak模式)
ToStrong(LCD_RS);           //将LCD_RS引脚(即P3.2引脚)设置为电流强驱动模式(Strong模式)
ToSlowWeak(LCD_RS);      //将LCD_RS引脚(即P3.2引脚)设置为慢速弱驱动模式(SlowWeak模式)
ToSlowStrong(LCD_RS       //将LCD_RS引脚(即P3.2引脚)设置为慢速强驱动转模式(SlowStrong模式)
ToFastWeak(LCD_RS);       //将LCD_RS引脚(即P3.2引脚)设置为快速弱驱动模式(FastWeak模式)
ToFastStrong(LCD_RS);     //将LCD_RS引脚(即P3.2引脚)设置为快速强驱动模式(FastStrong模式)

3、启禁附加功能(需要事先Enable(XFR);)
STC单片机的IO引脚有四种可以启禁的附加功能:内部4.1K上拉电阻(PUR)、数字信号输入(DIGIT)、施密特抑噪输入(SMT),部分单片机还有额外的内部10K下拉电阻(PDR)
EnablePUR(LCD_RS);        //启用LCD_RS引脚(即P3.2引脚)的内部4.1K上拉电阻
EnablePDR(LCD_RS);        //启用LCD_RS引脚(即P3.2引脚)的内部10K下拉电阻
EnableSMT(LCD_RS);        //启用LCD_RS引脚(即P3.2引脚)的施密特抑噪输入功能
EnableDIGIT(LCD_RS);      //启用LCD_RS引脚(

免责声明:

本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;

热门标签 更多

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-15 18:32 , Processed in 0.080070 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部