首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较3位并发送1位输出

比较3位并发送1位输出
EN

Stack Overflow用户
提问于 2016-04-28 19:36:02
回答 3查看 291关注 0票数 2

对于一个问题,我们需要比较两个端口的三个位,然后使用另一个端口的三个位作为输出。如果存储在第一端口中的三位等于第二端口中的三位,则输出的第一位被设置为1。如果它大于1,则将p2.1设置为高。如果小于p2.2,则将其设置为高。我的问题是,可以用这种方式解决这个问题,也可以使用gates (和/或,但这将需要一点一点,这是一种痛苦)。有没有更简单的方法?

代码语言:javascript
复制
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; 
EN

回答 3

Stack Overflow用户

发布于 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)之前,需要清除进位标志。

票数 1
EN

Stack Overflow用户

发布于 2016-04-28 19:59:28

  1. 将输出寄存器设置为1(假设它将相等)。称为R。
  2. 比较两个端口。
  3. 分支如果等于7-完成。
  4. 分支如果进位到6-更大的
  5. 移位R左1位
  6. 移位R左1位
  7. 将R存储在P2

这种直通逻辑对于汇编语言编程是不可或缺的。

票数 0
EN

Stack Overflow用户

发布于 2016-04-29 16:58:23

这里是从每个输入端口接受三个任意位的一种解决方案。

我假设以下情况:

如果P0 = P1,则设置P2.0

如果P0 > P1,则设置P2.1

设置P2.1否则

代码语言:javascript
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36913467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档