单片机首先将欲修改的寄存器的内容读回ALU,对相应位进行修改,然后再整个写回原来的寄存器地址,完成该功能的指令就叫做“读-改-写”指令。
在对并行口P0~P3操作时,这类指令从端口的锁存器读出数据而不是引脚处。
而MOV A,P0等非“读-改-写”指令,则是从端口的引脚处读数据。
单片机从端口读入数据的通道有两个,一个是从锁存器引入,一个是从输出引脚处引入,分别叫做“读锁存器”和“读引脚”。
单片机在进行端口输出时,经常要参考其上一次的输出状态,例如,需要将连接到端口的LED闪烁。编程序时往往需要从输出引脚读前一次的输出状态,将其求反后输出。但如果上次是输出“1”使LED点亮,这时候虽然端口上输出逻辑是“1”,但是由于LED的二极管作用将输出高电平拉至“0”电平(0.7V左右),通过引脚读进来就是“0”而非“1”了。这样,将“0”求反后输出还是“1”,就起不到使灯闪烁的目的了。但是,如果这时读的不是端口而是锁存器的输出端Q,则实现闪烁的功能就正常。上述例子很好地说明了为什么单片机在设置读端口功能后还要设置读锁存器这一功能。
读引脚由传送指令MOV实现;
读锁存器用到的是所谓的“读-改-写”指令,如ANL P0,A等。