1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
由于某种原因,使用了华大的单片机,在写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位不改变其他位状态的效果。 |
|
|
|
只有小组成员才能发言,加入小组>>
3316 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9060 浏览 16 评论
4088 浏览 18 评论
1180浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 03:51 , Processed in 1.582506 second(s), Total 82, Slave 62 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号