PIC18F单片机中PORT寄存器与LAT寄存器的核心区别是什么
PIC18F系列单片机PORT与LAT寄存器核心差异
很多开发者初次查阅PIC18F官方文档时会混淆二者,本质是二者的写操作逻辑完全一致,但读操作的数据源完全不同,核心差异如下:
- 功能定位差异
PORT是引脚电平映射寄存器:对它执行写操作时,会将数值写入端口输出锁存器;但对它执行读操作时,返回的是芯片物理引脚上的实际电平,和你之前写入锁存器的数值没有必然关联。LAT是输出锁存器专用寄存器(Latch的缩写):对它执行读写操作都是直接操作端口的输出锁存器,读操作返回的永远是你上次写入锁存器的数值,完全不受外部引脚实际电平的影响。
- 最容易暴露差异的场景:读-改-写(RMW)操作
如果你要对单个IO位做翻转、置位、清零这类操作,用PORT寄存器大概率会出问题:比如你之前给RB0写了高电平,但外接的LED负载把引脚电平拉到了高低电平的判定阈值附近,这时候读PORT拿到的RB0值可能是0,后续的翻转操作就会完全不符合预期。
换成LAT寄存器做位操作就不会有这个问题,因为读操作永远从输出锁存器取值,不会受外部电路干扰。 - 日常使用规范
- 需要读取外部输入电平的场景(比如读按键、传感器电平),用
PORT寄存器 - 所有需要给IO口输出电平的场景,不管是直接给端口赋值还是做位操作,统一用
LAT寄存器,彻底规避读改写带来的未知错误。
- 需要读取外部输入电平的场景(比如读按键、传感器电平),用
输出场景的错误与正确写法示例:
// 错误写法:输出用PORT,位操作大概率出问题 PORTB = 0x01; PORTBbits.RB1 = 1; // 这里会先读整个PORTB的引脚电平再修改写回,其他引脚如果被外部电路拉偏,会把原本正确的输出位改错 // 正确写法:输出用LAT LATB = 0x01; LATBbits.LATB1 = 1; // 读写都操作锁存器,不受外部引脚电平影响,操作完全可控
内容的提问来源于stack exchange,提问作者Celle qui parle aux chiens
相关产品推荐
相关产品推荐

