历史上的今天
今天是:2025年12月12日(星期五)
2022年12月12日 | MCS-51单片机指令系统(4)
2022-12-12 来源:zhihu
某些指令说明
-“读引脚”和“读锁存器”指令的区别
关于并行I/O口的“读引脚”和“读锁存器”指令的区别

例如,当P1口的P1.0引脚外接一个发光二极管LED的阳极,LED的阴极接地。
若想查看一下单片机刚才向P1.x脚输出的信息是“0”还是“1”,如果直接读引脚,结果显然错误。

-“读引脚”和“读锁存器”指令的区别
正确做法是读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,就会把字母开头的数据量当作标号来处理,从而出错以及不能通过汇编。指令系统汇总
指令条数多,不宜死记硬背,应在程序的编写中,多加练习,在实践中不断掌握和巩固常用的指令。
下表为按功能排列的全部的指令助记符及功能简要说明,以及指令长度、执行时间和指令代码(机器代码)。读者应该熟练地查阅下表,正确理解指令的功能及特性,正确地使用指令。







上一篇:MCS-51单片机汇编伪指令
下一篇:MCS-51单片机指令系统(3)
史海拾趣
|
[img]https://bbs.eeworld.com.cn/[/img] 大家好! 最近在调一片AD遇到点麻烦 请大家多多指教指教 大概是这样子的 前端的模拟信号(单端信号)进AD7721 然后串行送FPGA (其实串并行均可),在FPGA内部做串转并,大概是200K的时钟,但是FPGA控制 ...… 查看全部问答> |
|
printf 和 RETAILMSG 打印出来的消息不一致? wince6.0 下win32 api 写的代码。 char inFilename[128]; memset(inFilename, 0x00, sizeof(inFilename)); wcscpy(inFilename,_T(\"\\\\Temp\\\\test_420_1599_1198.jpg\")); DNW串口打印消息: RETAILMSG(1,(TEXT(\"[RETAILMSG] inFilename : ...… 查看全部问答> |
|
我们的程序需要时钟保持着对SATA硬盘的检测,当硬盘被拔掉或者插上时,都应该要有提示信息。那么在Linux下面,我需要去读取、检测哪儿才能获取该信息呢?如果有人对USB的热插拔也比较了解的,欢迎过来帮我扫盲!(我大致看了驱动层,整个SATA的中断 ...… 查看全部问答> |
|
在ADS的“ARM Link”中设置 “-info totals -info unused -entry 0x40000000 -mangled -map -symbols -scatter D:\\work-wincetest\\uC-GUI\\ucosforphilips\\scatter.scf -info veneers -info sizes -xref -callgraph” 生成了EXET_E ...… 查看全部问答> |
|
LPC2131,AD9833,AD5231三款芯片,技术文档上面说它们的封装形式分别为LQFP64,uSOIC10,uSOIC16,但将这些直接填到元件footprint一栏并生成网表后,装载网表时却全部报错,说没有这种封装形式! 请问如何解决?… 查看全部问答> |
|
matlab装的是7.1的,quartus和dsp是7.2的,基本上都可以用用ip核时出错,比如用fir核,当设置完参数后,有个generate项,等产生完后,simulink栏里就会蹦出个对话框,说系统正在生成中,这当生成完后,IP核确实是生成出来了,报了个错,说生成test ...… 查看全部问答> |




