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);
Получаем все преимущества доступа, с удобством использования. При этом оригинальные макросы так же доступны.