Макрос препроцессора C - PullRequest
0 голосов
/ 12 октября 2019

Проблема:

Я пишу общую библиотеку C для LCD в проекте микроконтроллера. Можно добавить до 8 ЖК-дисплеев с различными размерами (например, 128 * 96 или 64 * 48) по разным адресам (например, LCD3 и LCD7). но только один из них активно кодируется одновременно. поэтому я подумал, что для этого нужно сделать механизм.

в коде есть определение для CLCD_ROWS и CLCD_COLS, которые соответствуют размеру активного экрана.

#define CLCD_ROWS   // Active LCD rows
#define CLCD_COLS   // Active LCD columns

и есть определения дляразличные ЖК-дисплеи. например, если у нас подключены LCD3 и LCD7, мы определяем их размеры с помощью:

#define CLCD_ROWS3  96
#define CLCD_COLS3  64

#define CLCD_ROWS7  128
#define CLCD_COLS7  32

Вопрос:

Я написал [неправильный] макросчтобы переопределить значения CLCD_ROWS и CLCD_COLS:

#define cLcd_setActiveI2CcLcd(X)    \
CLCD_ROWS = CLCD_ROWS##X            \
CLCD_COLS = CLCD_COLS##X

, и в моем основном коде я вызываю макрос:

cLcd_setActiveI2CcLcd(7);

, который дает мне ошибку «отсутствует;».

это легко реализовать с помощью переменных. но так как эти значения жестко запрограммированы, я подумал, что они «предварительно обрабатываются», поскольку нуждаются в каждом бите ОЗУ в младшем микроконтроллере.

  1. Мой подход к предварительной обработке этих значений верен?
  2. Как правильно написать макрос для этой цели?

Я использую компилятор C99.

1 Ответ

0 голосов
/ 12 октября 2019

Во-первых, ваш метод использования макроса типа функции неправильный. Даже если вы исправите имеющуюся ошибку, макрос будет делать CLCD_ROWS не равным CLCD_ROWS7, а CLCD_ROWSX (то есть, как работают макросы, он объединяет то, что вы даете, а не его значение). Вместо этого, если вы хотите использовать макросы для сокращения использования оперативной памяти, вы можете изменить свой код на:

1-е решение

#define ROW_COLS 7 // change this if you use different display

#if ROW_COLS == 7

#define CLCD_ROWS  128
#define CLCD_COLS  32

#elif ROW_COLS == 3

#define CLCD_ROWS  96
#define CLCD_COLS  64

#endif

2-е решение Есливы хотите динамически изменять размер вашего дисплея во время выполнения, вы можете сделать это следующим образом:

static int display_cnt;

#define CLCD_ROWS ((display_cnt == 3) ? 96 : 128)
#define CLCD_COLS ((display_cnt == 3) ? 64 : 32)

Таким образом, когда вы изменяете значение переменной display_cnt, макрос автоматически изменит свое значение.

...