比较3位并发送1位输出

时间:2016-04-28 11:36:02

标签: assembly 8051

对于一个问题,我们需要比较两个端口的三个比特,然后使用另一个端口的三个比特作为输出。如果存储在第一个端口中的三个位等于第二个端口中的三个位,则输出的第一位设置为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; 

3 个答案:

答案 0 :(得分:1)

要比较端口中的三个比特,首先需要屏蔽其他比特,否则您将比较所有八个比特。然后,您只需要使用单个比较(无论是SUBB还是CJNE)来确定来自一个端口的位是否等于,小于或大于另一个端口。两个指令都减去它们的两个操作数,并根据结果设置进位标志(C)。如果它们相等,则SUBB在A中存储0,您可以使用JZ / JNZ对其进行测试。在CJNE的情况下,如果指令相等则指令不会跳转。在任何一种情况下,如果它们不相等,您可以使用JC / JNC测试进位标志,以确定它们是否小于或大于。如果A寄存器小于另一个操作数,则这些指令设置进位标志。

如果你使用SUBB,请不要忘记这条指令"借用借阅",使用进位标志作为输入。这意味着您需要在使用前清除进位标志(CLR C)。

答案 1 :(得分:0)

  1. 将输出寄存器设置为1(假设它将相等)。叫这个R。
  2. 比较两个端口。
  3. 分支,如果等于7 - 完成。
  4. 分支如果携带6 - 更大
  5. Shift R离开1位
  6. Shift R离开1位
  7. 在P2中存储R
  8. 这种逐字逻辑是汇编程序编程不可或缺的一部分。

答案 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