这是我的代码,我想简化这段代码。 如何缩短8位数据传输代码?
void LCD_Cmd(uint8_t cmd) {
/* Command mode */
GPIOC->BRR =((uint16_t)0x8000U); // RS LOW
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, (cmd & 0x01));
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, (cmd & 0x02));
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, (cmd & 0x04));
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, (cmd & 0x08));
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, (cmd & 0x10));
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, (cmd & 0x20));
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, (cmd & 0x40));
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, (cmd & 0x80));
GPIOC->BSRR =((uint16_t)0x4000U); // E SET
HAL_Delay(1);
GPIOC->BRR = ((uint16_t)0x4000U); // E RESET
答案 0 :(得分:1)
您可以跳过整个HAL_GPIO_WritePin,直接将其写入输出寄存器,因为大多数gpio都在同一端口上,但是您仍然需要调整cmd位的顺序以适合您的接线,因此如果可能的话最好重新连接LCD以反映您的配置。
if (cmd & 1)
GPIOA->ODR |= 0x80;
else
GPIOA->ODR &= 0x7F);
GPIOB->ODR |= (adjusted_cmd & 0xfb);
GPIOB->ODR &= ~(adjusted_cmd & 0xfb);
答案 1 :(得分:0)
ns
或us
作为延迟时间,此处至少要2ms。 在这种情况下,以最快的方式设置GPIOA
GPIOB
中的位
void foo3(unsigned cmd)
{
if(cmd &1) GPIOA -> BSRR = 1;
else GPIOA -> BSRR = 1 << 16;
unsigned tmp = (cmd >> 1);
tmp &= ~0b11111100;
tmp |= cmd & 0b11111100;
tmp &= ~(1 << 2);
GPIOB -> BSRR = tmp;
tmp = ~tmp;
tmp &= ~(1 << 2);
GPIOB -> BRR = tmp;
}
//and this code compiles to 16 assembly instructions
// without any branches
tst r0, #1
mov r3, #67108864
movne r2, #1
moveq r2, #65536
str r2, [r3, #8]
lsr r3, r0, #1
bic r3, r3, #252
and r0, r0, #252
orr r0, r0, r3
mvn r3, r0
ldr r2, .L5
bic r3, r3, #4
bic r0, r0, #4
str r0, [r2, #8]
str r3, [r2, #4]
bx lr