3

PIC 微控制器有 3 个基本寄存器来设置 GPIO(通用 I/O)引脚状态。它们是: TRIS(Tri-status,方向寄存器。将引脚设置为输入或输出) PORT(输入缓冲器) LAT(锁存器,输出缓冲器)。

端口可以​​是 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 等,而无需重写宏或添加特殊情况。

这可能吗?或者我能做的最接近的事情是什么?

4

2 回答 2

2

您可以通过创建这样的宏来做到这一点:

#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)

你可以用它作为例子。

于 2019-05-26T00:10:30.887 回答
1

你已经可以这样做了。您没有注意到您的 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
于 2018-10-15T16:01:00.297 回答