由于某种原因,使用了华大的单片机,在写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;
|