Есть много способов сделать это.Я часто делаю это по одному.
Один простой способ - создать собственный регистр, определив переменную.Если регистр имеет ширину 8 бит, определите байтовую переменную:
unsigned char disp_register;
Затем вы пишете в этот регистр, как если бы он существовал в оборудовании дисплея.Конечно, затем вы должны вывести этот регистр на выводы GPIO ESP32.Так как контакты все кончены, вы должны сделать это за булавкой.Определите ваши аппаратные выводы для удобства чтения:
/* OUTPUTS (numbers mean GPIO port) */
#define REGISTER_BIT7_ON_PIN 9
#define REGISTER_BIT6_ON_PIN 10
#define REGISTER_BIT5_ON_PIN 5
// continue with all the pins you need
Где-то в начале вашей программы, установите эти выводы как выходные и, возможно, установите их значение по умолчанию '0':
io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
io_conf.pin_bit_mask = ((1ULL<< REGISTER_BIT7_ON_PIN) | (1ULL<< REGISTER_BIT6_ON_PIN) | (1ULL<< REGISTER_BIT5_ON_PIN)); // of course, do like this all the pins
gpio_config(&io_conf);
gpio_set_level(REGISTER_BIT7_ON_PIN, 0); // do like this all the pins you need to set the boot-up value, pin-by-pin
Затем вам понадобится ваша функция, чтобы скопировать ваш регистр во внешний мир выводов GPIO:
/*
* wrote this simply for ease of understanding, feel free to do this in a loop
* or shifting bit by bit
*/
void copy_register_to_GPIO_pins(unsigned char disp_register)
{
gpio_set_level(REGISTER_BIT7_ON_PIN, (disp_register & 0x80) >> 7);
gpio_set_level(REGISTER_BIT6_ON_PIN, (disp_register & 0x40) >> 6);
gpio_set_level(REGISTER_BIT5_ON_PIN, (disp_register & 0x20) >> 5);
gpio_set_level(REGISTER_BIT4_ON_PIN, (disp_register & 0x10) >> 4);
gpio_set_level(REGISTER_BIT3_ON_PIN, (disp_register & 0x08) >> 3);
gpio_set_level(REGISTER_BIT2_ON_PIN, (disp_register & 0x04) >> 2);
gpio_set_level(REGISTER_BIT1_ON_PIN, (disp_register & 0x02) >> 1);
gpio_set_level(REGISTER_BIT0_ON_PIN, (disp_register & 0x01));
}
Затем, после того, как вы записали что-либо в свой регистр, вызовите свою функцию, чтобы вывести его:
disp_register = 0x2A; // example value you want to send to display
copy_register_to_GPIO_pins(disp_register);
// or, output byte WITHOUT using any register:
copy_register_to_GPIO_pins(0x2A);
Надеемся, что вы можете сделать обратное самостоятельно, чтение выводов выполняется другой функцией, где вы копируете каждое значение вывода GPIO и собираете его в байтовую переменную.Конечно, на этом этапе контакты должны быть установлены на входы.В принципе:
/*
* wrote this simply for ease of understanding
*/
unsigned char copy_GPIO_pins_to_register(void)
{
unsigned char retval = 0;
retval |= gpio_get_level(REGISTER_BIT7_ON_PIN);
retval = retval << 1;
retval |= gpio_get_level(REGISTER_BIT6_ON_PIN);
retval = retval << 1;
retval |= gpio_get_level(REGISTER_BIT5_ON_PIN);
retval = retval << 1;
retval |= gpio_get_level(REGISTER_BIT4_ON_PIN);
retval = retval << 1;
retval |= gpio_get_level(REGISTER_BIT3_ON_PIN);
retval = retval << 1;
retval |= gpio_get_level(REGISTER_BIT2_ON_PIN);
retval = retval << 1;
retval |= gpio_get_level(REGISTER_BIT1_ON_PIN);
retval = retval << 1;
retval |= gpio_get_level(REGISTER_BIT0_ON_PIN);
return retval;
}