分享一个超级好用的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引脚(
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引脚(
免责声明:
本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;
上一篇: 开天斧三TYPE C无法连接