单片机学习小组
直播中

宜家

8年用户 1122经验值
私信 关注

如何去解决HC32F460写端口不改变状态的问题

受到警告
提示: 作者被禁止或删除 内容自动屏蔽

回帖(1)

李咏琪

2022-2-24 09:50:23
由于某种原因,使用了华大的单片机,在写LCD的时候,遇到问题,LED数据线是接在A0~A7,使用PORT_SetPortData函数时发现只改变以前是0的Bit,如上一数据发的是01010101,下一数据发的是10101010,那么端口执行完这两个代码时,状态就是11111111,数据明显不对,检查PORT_SetPortData函数如下:

en_result_t PORT_SetPortData(en_port_t enPort, uint16_t u16Pin)
{
    uint16_t *PODRx;

    /* parameter check */
    DDL_ASSERT(IS_VALID_PORT(enPort));

    PODRx = (uint16_t *)((uint32_t)(&M4_PORT->PODRA) + 0x10u * enPort);
    *PODRx |= u16Pin;
    return Ok;
}

发现问题,端口的输出是*PODRx |= u16Pin;是|=写入的数据,这个按位或肯定就是不对的了,如果是整个16位一起写,直接把这个改成*PODRx = u16Pin;就可以了,但我用的是低8位,所以我新起了一个函数如下:

en_result_t PORT_SetPortData8(en_port_t enPort, uint16_t u16Pin)
{
    uint16_t *PODRx;

    /* parameter check */
    DDL_ASSERT(IS_VALID_PORT(enPort));

    PODRx = (uint16_t *)((uint32_t)(&M4_PORT->PODRA) + 0x10u * enPort);
    *PODRx&=0xff00;
    *PODRx |= u16Pin;
    return Ok;
}

先用 *PODRx&=0xff00;把低8位的状态改了,再用*PODRx |= u16Pin;改变低8位的数据,其他数据位不变,这样就实现了一次性写低8位不改变其他位状态的效果。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分