如何使用 C 宏定义 PIC 单片机引脚名称?
Posted
技术标签:
【中文标题】如何使用 C 宏定义 PIC 单片机引脚名称?【英文标题】:How can I use C macros to define PIC microcontroller pin names? 【发布时间】:2018-10-15 15:41:18 【问题描述】:PIC 微控制器有 3 个基本寄存器来设置 GPIO(通用 I/O)引脚状态。这些都是: TRIS(Tri-status,方向寄存器。将引脚设置为输入或输出) PORT(输入缓冲区) LAT(Latch,输出缓冲器)。
端口可以是 A、B、C... 等。 所以端口 A 的 TRIS 寄存器是 TRISA。
最后是密码。例如,TRISA1。
TRISA1 定义为:
// TRISA<TRISA1>
extern volatile __bit TRISA1 __at(0x461); // @ (0x8C * 8 + 1)
#define TRISA1_bit BANKMASK(TRISA), 1
我想定义一个宏来轻松地将引脚命名为:
#define _DATA_OUTPUT A2
所以我可以编写如下代码:
LAT_DATA_OUTPUT = 1;
PORT_DATA_OUTPUT = 0;
并由预处理器将其转换为:
LATA2 = 1;
PORTA2 = 0;
所以我以后可以扩展到其他引脚寄存器,例如 ANSEL、WPU 等,而无需重写宏或添加特殊情况。
这可能吗?或者我能做的最接近的事情是什么?
【问题讨论】:
看看我的回答here。 这些不是已经在 xc.h 中定义了吗? 【参考方案1】:你可以通过创建这样的宏来做到这一点:
#define _DATA_OUTPUT A2
#define LAT_DATA(X) LAT##X
#define LAT_DATA_OUTPUT LAT_DATA(_DATA_OUTPUT)
#define PORT_DATA(X) PORT##X
#define PORT_DATA_OUTPUT PORT_DATA(_DATA_OUTPUT)
你可以用它作为例子。
【讨论】:
【参考方案2】:您已经可以这样做了。您没有注意到您的 PIC 模型或您的 IDE 版本或您使用的工具链,但假设您使用的是带有 XC 编译器的 MPLAB X,这个功能已经存在。确保您包含<xc.h>
,它应该从项目配置中读取您拥有的芯片,并且已经为您制作了宏。
然后您可以设置整个寄存器(以 TRISA 为例):
TRISA = 0x0000; //All A pins outputs
或在该寄存器中设置单个引脚:
TRISAbits.TRISA0 = 0;
TRISAbits.TRISA8 = 0;
您也可以定义自己的宏:
#define TRISA0 TRISAbits.TRISA0
#define SET_TRISA0_IN TRISAbits.TRISA0 = 1
【讨论】:
是的,我通常这样做,但问题是我必须定义每个端口和每个引脚。例如,我必须定义 DATA_TRIS PORTA0、DATA_PORT PORTA0、DATA_LAT LATA0。我想要的是只定义 A0 并将宏扩展为我拍它的任何东西。如果我写define _XX=A0,我希望LAT_XX扩展到LATA0,PORT_XX扩展到PORTA0,WPU_XX扩展到WPUA0等等。以上是关于如何使用 C 宏定义 PIC 单片机引脚名称?的主要内容,如果未能解决你的问题,请参考以下文章