有很多方法可以做到这一点。我经常一针一线地完成。
一个简单的方法是通过定义变量来创建自己的“寄存器”。如果寄存器宽度是8位,则定义字节变量:
unsigned char disp_register;
接下来你需要像在显示硬件中一样写入该寄存器。当然,下一步你必须将该寄存器输出到ESP32的GPIO引脚。由于引脚分散在各处,因此必须逐个引脚进行操作。为了便于阅读,定义硬件引脚:
/* OUTPUTS (numbers mean GPIO port) */
// 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引脚的外部世界:
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;
copy_register_to_GPIO_pins(disp_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;
}