谢谢建议,##的用法很是奇特,我试了一下,将数据操作函数如此封装:
sbit DS18B20_1_DQ_PORT = P7^2;
sbit DS18B20_2_DQ_PORT = P7^3;
#define DS18B20_Master_Control(pin_index) (DS18B20_##pin_index##_PORT = 1)
#define DS18B20_Master_Release(pin_index) (DS18B20_##pin_index##_PORT = 0)
#define DS18B20_ReadIO(pin_index) (DS18B20_##pin_index##_PORT)
然后在API函数中调用:
static volatile u8 ds18b20_index;
DS18B20_Master_Control(ds18b20_index);
在这之中ds18b20_index用于选中要操作的管脚,但编译会报错:error C202: 'DS18B20_ds18b20_index_PORT': undefined identifier,这个错误也能理解,即ds18b20_index并不会和DS18B20_ _PORT组成已声明的合法变量。而如果在API函数中,以指定的索引号来进行操作,如:
DS18B20_Master_Control(0);
虽然可行,但程序烧写后就不能切换到对其它传感器对应管脚的操作了。我即总结,宏定义毕竟是在程序编译时进行处理的,在程序运行中是不能进行动态赋值的。不知我所采用的方式和说法是否正确,请大家指正。 |