对于一个问题,我们需要比较两个端口的三个比特,然后使用另一个端口的三个比特作为输出。如果存储在第一个端口中的三个位等于第二个端口中的三个位,则输出的第一位设置为1.如果它大于p1.1则设置为高。如果小于p2.2则设置为高。我的问题是,有可能以这种方式解决这个问题以及使用门(和/或但这需要一点一点,这是一个痛苦)。有更简单的方法吗?
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;
答案 0 :(得分:1)
要比较端口中的三个比特,首先需要屏蔽其他比特,否则您将比较所有八个比特。然后,您只需要使用单个比较(无论是SUBB还是CJNE)来确定来自一个端口的位是否等于,小于或大于另一个端口。两个指令都减去它们的两个操作数,并根据结果设置进位标志(C)。如果它们相等,则SUBB在A中存储0,您可以使用JZ / JNZ对其进行测试。在CJNE的情况下,如果指令相等则指令不会跳转。在任何一种情况下,如果它们不相等,您可以使用JC / JNC测试进位标志,以确定它们是否小于或大于。如果A寄存器小于另一个操作数,则这些指令设置进位标志。
如果你使用SUBB,请不要忘记这条指令"借用借阅",使用进位标志作为输入。这意味着您需要在使用前清除进位标志(CLR C)。
答案 1 :(得分:0)
这种逐字逻辑是汇编程序编程不可或缺的一部分。
答案 2 :(得分:0)
这是一个从每个输入端口接受三个任意位的解决方案。
我假设以下内容:
如果P0 = P1
,则设置P2.0如果P0> P,则设置P2.1。 P1
设置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
end