我可以获取将代码发送到LCD的简易代码吗?

时间:2019-12-31 03:28:09

标签: stm32

这是我的代码,我想简化这段代码。 如何缩短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

2 个答案:

答案 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)

  1. 请勿使用HAL _...和HAL_Delay。以这种方式设置引脚需要花费一些时间。您需要nsus作为延迟时间,此处至少要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


豫ICP备18024241号-1