对于一个问题,我们需要比较两个端口的三个位,然后使用另一个端口的三个位作为输出。如果存储在第一端口中的三位等于第二端口中的三位,则输出的第一位被设置为1。如果它大于1,则将p2.1设置为高。如果小于p2.2,则将其设置为高。我的问题是,可以用这种方式解决这个问题,也可以使用gates (和/或,但这将需要一点一点,这是一种痛苦)。有没有更简单的方法?
ORG 000H
MOV A, P1; x is p1 and y is p3
MOV R5, P3;
MOV P2, #0;
CJNE A,05H, CHECK; if it isn't equal we go to check routine
SETB P2.0; Equal output set high
SJMP HERE; End progam
CHECK:
MOV A, P1
SUBB A, P3 ; Subtract
JC HM;
SETB P2.1;
SJMP HERE;
HM: SETB P2.2;
SJMP HERE;
HERE: CLR A;
END; 发布于 2016-04-29 02:12:51
要只比较来自端口的3位,首先需要屏蔽其他位,否则将比较所有8位。然后,无论是使用SUBB还是CJNE,您只需进行一次比较,即可确定来自一个端口的位是否等于、小于或大于另一个端口。两个指令都减去它们的两个操作数,并根据结果设置进位标志(C)。如果它们相等,则SUBB在A中存储0,您可以使用JZ/JNZ测试这一点。在CJNE的情况下,如果它们相等,指令就不会跳转。在这两种情况下,当它们不相等时,您可以使用JC/JNC测试进位标志,以确定它们是小于还是大于。如果A寄存器小于其他操作数,则这些指令设置进位标志。
如果你使用SUBB,别忘了这条指令"Subtract with Borrow“使用进位标志作为输入。这意味着在使用进位标志(CLR C)之前,需要清除进位标志。
发布于 2016-04-28 19:59:28
这种直通逻辑对于汇编语言编程是不可或缺的。
发布于 2016-04-29 16:58:23
这里是从每个输入端口接受三个任意位的一种解决方案。
我假设以下情况:
如果P0 = P1,则设置P2.0
如果P0 > P1,则设置P2.1
设置P2.1否则
org 0000H
Init:
MOV P2DIR, 00H ; Make P2 an output
ReadAndMask:
MOV A, P0 ; read port P0
ANL A, #13H ; your P1-mask
MOV R0, A ; Save in R0
MOV A, P1 ; read port P1
ANL A, #0A1H ; your P1-mask
CJNE A, 00H, NotEq ; compare A with R0
Equal:
MOV P2, #01H ; Set P2.0 clear the rest
SJMP ReadAndMask ; Repeat forever
NotEq:
JC P0Greater ; Check carry to see if P0 > P1
P0Greater:
MOV P2, #02H ; Set P2.1 clear the rest
SJMP ReadAndMask ; Repeat forever
P0NotGreater:
MOV P2, #04H ; Set P2.2 clear the rest
SJMP ReadAndMask ; Repeat forever
endhttps://stackoverflow.com/questions/36913467
复制相似问题