PIC 微控制器具有 3 个基本寄存器,用于设置 GPIO(通用 I/O(引脚状态。这些是: TRIS(三态,方向寄存器。将引脚设置为输入或输出( 端口(输入缓冲区( 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 等,而无需重写宏或添加特殊情况。
这可能吗?或者我能做的最接近模仿的事情是什么?
您可以通过创建这样的宏来做到这一点:
#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)
您可以将其用作示例。
你已经可以这样做了。 您还没有注意到您的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