你知道真正的“读引脚”和“读锁存器”指令的区别吗

你知道真正的“读引脚”和“读锁存器”指令的区别吗

20a7b969b719f13cf41bd52e43cdd0ad.png///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///

0a71b9e5c8d955e5c2b67bdff155261e.png

某些指令说明

-“读引脚”和“读锁存器”指令的区别

.关于并行I/O口的“读引脚”和“读锁存器”指令的区别

e3542d4cf652743e3292c3683c79d8c0.png

例如,当P1口的P1.0引脚外接一个发光二极管LED的阳极,LED的阴极接地。

若想查看一下单片机刚才向P1.x脚输出的信息是“0”还是“1”,如果直接读引脚,结果显然错误。

770e21a20cbf400feb9163b6c5f35259.png

-“读引脚”和“读锁存器”指令的区别

正确做法是读D锁存器的Q端状态,那里储存的才是前一时刻送给P1.0的真实值。就是说,凡遇“读取P1口前一状态以便修改后再送出”的情形,都应当“读锁存器”的Q端信息,而不是读取引脚的信息。

当P1口外接输入设备时,要想P1口引脚上反映真实的输入信号,必须要设法先让该引脚内部的场效应管截止才行,否则当场效应管导通时,P1口引脚上将永远为低电平,无法正确反映外设的输入信号。让场效应管截止,就是用指令给P1口的相应位送一个“1”电平,这就是为什么读引脚之前,一定要先送出“1”的原因。

-“读引脚”和“读锁存器”指令的区别

指令“MOV C,P1.0”读的是P1.0脚,同样,指令“MOV A,P1”也是读引脚指令,读引脚指令之前一定要有向P1.0写“1”的指令。而指令“CPL P1.0”则是“读锁存器”,也即“读-修改-写”指令,它会先读P1.0的锁存器的Q端状态,接着取反,然后再送到P1.0引脚上。而指令“ANL P1,A”也是“读锁存器”命令。类似的“读-修改-写”指令举例如下:

INC P1

XRL P3,A

ORL P2,A

ANL P1,A

CPL P3.0

-操作数的字节地址和位地址的区分问题

关于操作数的字节地址和位地址的区分问题

如何区别指令中出现的字节变量和位变量?

例如指令“MOV C,40H”和指令“MOV A,40H”两条指令中源操作数“40H”都是以直接地址形式给出的,“40H”是字节地址还是位地址?对于助记符相同指令,观察操作数就可看出。显然前条指令中的“40H”肯定是位地址,因为目的操作数C是位变量。后条指令的“40H”是字节地址,因为目的操作数A是字节变量。

-累加器A与Acc的书写问题

.关于累加器A与Acc的书写问题

累加器可写成A,或Acc,区别是什么?

Acc汇编后的机器码必有一个字节的操作数是累加器的字节地址E0H,A汇编后则隐含在指令操作码中。例如:“INC A”的机器码,查指令表是04H。如写成“INC Acc”后,则成了“INC direct”的格式,再查指令表,对应的机器码为“05H E0H”。

-累加器A与Acc的书写问题

.关于累加器A与Acc的书写问题

在对累加器A的直接寻址和累加器A的某一位寻址要用Acc,不能写成A。例如:

指令“POP Acc”不能写成“POP A”;

指令“SETB Acc.0”,不能写成“SETB A.0”。

-书写两位16进制数据前要加“0"

.书写两位16进制数据前要加“0”

经常遇到必须在某些数据或地址的前面多填一个“前导”0,否则汇编就通不过?这是汇编语言的严格性和规范性的体现。由于部分十六进制数是用字母来表示的,而程序内的标号也常用字母表示,为将标号和数据区分开,几乎所有的汇编语言都规定:凡是以字母开头(对十六进制数而言,就是A~F开头)的数字量,应当在前面添加一个数字“0”。至于地址量,它也是数据量的一种,前面也应该添加“0”。

例如:

MOV A,#0F0H;“F0”以字母开头的数据量

MOV A,0F0H;“F0”以字母开头的地址量

如不加“前导”0,就会把字母开头的数据量当作标号来处理,从而出错以及不能通过汇编。指令系统汇总

·指令条数多,不宜死记硬背,应在程序的编写中,多加练习,在实践中不断掌握和巩固常用的指令。

猜你喜欢

转载自blog.csdn.net/danpianji777/article/details/124799423