xc8 : 请详细说明 (((unsigned)&(REGISTER_NAME))*8) + BIT_NUM
xc8 : please detailed the (((unsigned)&(REGISTER_NAME))*8) + BIT_NUM
我想为设置引脚方向定义宏,level.their参数必须是端口名称和引脚number.i不想使用 TRIS 寄存器或 LAT 寄存器名称,只有端口名称(PORTA 例如)。我使用指针和位掩码执行此操作,例如:
设置引脚目录:
#define SET_PIN_DIR_IN(port,pin) *(&port+0x80)|=1<<pin
设置引脚电平:
#define SET_PIN_HIGH(port,pin) port|=1<<pin
读取引脚状态:
#define READ_PIN_LEVEL(port,pin) (((*(&port+0x100)>>pin)&0x01)==0x01)
但我知道上面的代码不是最佳的。
Q1:can 我用“(((unsigned)&(REGISTER_NAME))*8) + BIT_NUM”写我的宏最理想?
Q2:for所有PIC单片机,I\O寄存器的顺序一样吗?
如果您使用的是 xc8,则您可能使用的是 8 位 PIC
处理器 :)。一个更正常的方法是先设置
方向通过设置管脚的三态属性
例如:
TRISA1 = 0; // tri-state OFF so this pin is an output
TRISA2 = 1; // tri-state ON so this pin is an input
您通过 R 值读取输入引脚值,因此:
pin2_state = RA2;
要使用 LATCH 设置输出,因此要将 A1 设置为 1,请使用
LATA1 = 1;
对于端口 AN,您有时还必须禁用模拟输入
使用 ANSEL 寄存器(即引脚无法正常工作
和 DIGITAL(如果它们被指定为模拟输入)。
查看您设备的数据 sheet 和 ANSEL 寄存器默认值。
我想为设置引脚方向定义宏,level.their参数必须是端口名称和引脚number.i不想使用 TRIS 寄存器或 LAT 寄存器名称,只有端口名称(PORTA 例如)。我使用指针和位掩码执行此操作,例如:
设置引脚目录:
#define SET_PIN_DIR_IN(port,pin) *(&port+0x80)|=1<<pin
设置引脚电平:
#define SET_PIN_HIGH(port,pin) port|=1<<pin
读取引脚状态:
#define READ_PIN_LEVEL(port,pin) (((*(&port+0x100)>>pin)&0x01)==0x01)
但我知道上面的代码不是最佳的。 Q1:can 我用“(((unsigned)&(REGISTER_NAME))*8) + BIT_NUM”写我的宏最理想? Q2:for所有PIC单片机,I\O寄存器的顺序一样吗?
如果您使用的是 xc8,则您可能使用的是 8 位 PIC 处理器 :)。一个更正常的方法是先设置 方向通过设置管脚的三态属性 例如:
TRISA1 = 0; // tri-state OFF so this pin is an output
TRISA2 = 1; // tri-state ON so this pin is an input
您通过 R 值读取输入引脚值,因此:
pin2_state = RA2;
要使用 LATCH 设置输出,因此要将 A1 设置为 1,请使用
LATA1 = 1;
对于端口 AN,您有时还必须禁用模拟输入 使用 ANSEL 寄存器(即引脚无法正常工作 和 DIGITAL(如果它们被指定为模拟输入)。 查看您设备的数据 sheet 和 ANSEL 寄存器默认值。