ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
22 ноября
150063 Топик полностью
DL36 (05.03.2009 09:27, просмотров: 761) ответил M@ik на Из исходника узнал много нового для себя о препроцессоре Си=) Однако, так и не понял, зачем нужно было городить трехэтажный макрос BFA с переменным числом параметров, в котором действие определяется по значению первого параметра? Не лучше ли сделать 5
Хочется прозрачности тогда дописать так и можно использовать что удобнее. #define _setL(port,bit) BFA(BFA_WR, port, port##bit, 0) #define _setH(port,bit) BFA(BFA_WR, port, port##bit, 1) #define _set(port,bit,val) _set##val(LAT##port,bit) #define _high(port,bit,val) _setH(LAT##port,bit) #define _openDrainOn(port,bit,val) BFA(BFA_WR, ODC##port, OD##port##bit, 1) #define ON(x) _set(x) #define HIGH(x) _high(x) #define OPEND_DRAIN_ON(x) _openDrainOn(x) #define ANALOG_INPUT_ON(val) BFA(BFA_WR, AD1PCFG,PCFG##val, 0) #define _clrL(port,bit) BFA(BFA_WR, port, port##bit, 1) #define _clrH(port,bit) BFA(BFA_WR, port, port##bit, 0) #define _clr(port,bit,val) _clr##val(LAT##port,bit) #define _low(port,bit,val) _clrH(LAT##port,bit) #define _openDrainOff(port,bit,val) BFA(BFA_WR,ODC##port, OD##port##bit, 0) #define OFF(x) _clr(x) #define LOW(x) _low(x) #define OPEND_DRAIN_OFF(x) _openDrainOff(x) #define ANALOG_INPUT_OFF(val) BFA(BFA_WR, AD1PCFG,PCFG##val, 1) #define _bitL(port,bit) (!(BFA(BFA_RD, PORT##port, R##port##bit))) #define _bitH(port,bit) BFA(BFA_RD, PORT##port, R##port##bit) #define _bit(port,bit,val) _bit##val(port,bit) #define _latchL(port,bit) (!(BFA(BFA_RD, port, port##bit))) #define _latchH(port,bit) BFA(BFA_RD, port, port##bit) #define _latch(port,bit,val) _latch##val(LAT##port,bit) #define _dirI(port,bit,val) _latchH(TRIS##port,bit) #define _dirO(port,bit,val) _latchL(TRIS##port,bit) #define SIGNAL(x) _bit(x) #define LATCH(x) _latch(x) #define DIR_IS_IN(x) _dirI(x) #define DIR_IS_OUT(x) _dirO(x) #define _xor(port,bit,val) BFA(BFA_INV, LAT##port, LAT##port##bit) #define TOGGLE(x) _xor(x) #define _bitnum(port,bit,val)bit #define BITNUM(x) _bitnum(x) #define _setOut(port,bit) BFA(BFA_WR, port, port##bit, 0) #define _setIn(port,bit) BFA(BFA_WR, port, port##bit, 1) #define _mode(port,bit,val,mode) _set##mode(TRIS##port,bit) //mode = Out or In #define SET_DIR(x,mode) _mode(x,mode) Пример использования ANALOG_INPUT_OFF(8) ; OPEND_DRAIN_OFF(LED); OPEND_DRAIN_ON(LED); ON(LED); HIGH(LED); OFF(LED); LOW(LED); SIGNAL(LED); LATCH(LED); DIR_IS_IN(LED); DIR_IS_OUT(LED); TOGGLE(LED); Tmp = BITNUM(LED); Получаем все преимущества доступа, с удобством использования. При этом оригинальные макросы так же доступны.