assembly 在为体育场实现记分牌时出现的问题,如何修复此代码

p3rjfoxz  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(91)

实现一个记分牌的体育场,这样它就显示了主场和客场的计数器。每支球队的计数器总是从0到9递增,最初两个计数器都是零(本地0 - 0客场),以增加每支球队的计数器的值一个按钮将用于每一个独立的。
连接中的引脚分配如下所示:

PIN I/O Description
RA0 input GOL_LOCAL, button to increase the home score
RA1 Input GOAL_VISITA, button to increase the visit marker
RB0 Output LOCAL_A, Digit A of the local marker binary code
RB1 Output LOCAL_B, Digit B of the local marker binary code
RB2 Output LOCAL_C, Digit C of the local marker binary code
RB3 Output LOCAL_D, Digit D of the local marker binary code
RB4 Output VISIT_A, Digit A of the binary code of the visit marker
RB5 Output VISIT_B, Digit B of the binary code of the visit marker
RB6 Output VISIT_C, Digit C of the binary code of the visit marker
RB7 Output VISIT_D, Digit D of the binary code of the visit marker

字符串
要使用二进制代码和7447解码器在显示器上显示数字,必须使用下表作为参考。

Decimal D C B A
   0    0 0 0 0
   1    0 0 0 1
   2    0 0 1 0
   3    0 0 1 1
   4    0 1 0 0
   5    0 1 0 1
   6    0 1 1 0
   7    0 1 1 1
   8    1 0 0 0
   9    1 0 0 1

向7段显示器发送数据的建议逻辑:

例如,如果您要显示标记“”2“-”VISIT 1“,则必须通过端口B发送以下”“和”“VISIT”的BCD组合
| 访视_D|访视_C|访视_B|访视_A|简体中文|中文(简体)|_B|公司简介|
| --|--|--|--|--|--|--|--|
| 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
为了实现这一点,您可以考虑分别使用2个计数器,一个用于主场进球计数,另一个用于客场进球计数。
局部计数器
| Bit7| Bit6| Bit5| Bit4| Bit3| Bit2| Bit1| Bit0|
| --|--|--|--|--|--|--|--|
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
访问_计数器
| Bit7| Bit6| Bit5| Bit4| Bit3| Bit2| Bit1| Bit0|
| --|--|--|--|--|--|--|--|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
为了获得显示“访视2 -访视1”所需的BCD组合,我们需要将Visit_Counter 4的位置向左移动,这将为Visit_Counter提供给予新的值。
访问_计数器
| Bit7| Bit6| Bit5| Bit4| Bit3| Bit2| Bit1| Bit0|
| --|--|--|--|--|--|--|--|
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
最后,我们可以在变量Local_counter和Visit_counter的值之间执行OR操作,获得必须通过端口B发送的所需结果。
| 访视_D|访视_C|访视_B|访视_A|简体中文|中文(简体)|_B|公司简介|
| --|--|--|--|--|--|--|--|
| 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
x1c 0d1x的数据
我只能做到这一步了。

LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0X0C
Counter
ENDC
        ORG 0
    bsf STATUS,RP0
    movlw 0x00
    movwf TRISB
    bsf TRISA,RA0
    bcf STATUS,RP0
    clrf Counter
    clrf PORTB

Loop
    btfsc PORTA,RA0
    goto $-.1
    btfss PORTA,RA0
    goto $-.1
    movf Counter,W
    call TABLE
    movwf PORTB
    incf Counter,F
    movlw .10
    subwf Counter,W
    btfsc STATUS,Z
    clrf Counter
    goto Loop

BOARD
addwf PCL,F
DT 1,2,3,4,5,6,7,8,9,0
    END


我在Proteus模拟器中尝试了这段代码,但它不能完全生成我需要的东西。我的代码中缺少了什么?

bpsygsoo

bpsygsoo1#

准备好了。我已经在你的代码中做了一些修正,使其符合要求。正如你将在代码中看到的,我使用了两个名为scoreOfLocalTeamscoreOfVisitorTeam的变量,而不是以前的单个Counter变量。这样,每个团队的得分都保存在自己的变量中。
虽然代码是自我解释的,但下面是它的工作原理:

  • 当按下连接到RA0RA1的任何一个按钮时,相应的球队将获得1分。
  • 在添加值之后,将其与10进行比较,如果是10,则将值重置为0。
  • 然后根据您问题中的表格将实际值输出到其对应的PORTB半字节。
  • 最后,一旦按钮按下已被服务,它然后等待按钮释放。
  • 一旦按钮被释放,它就会返回并等待新的按钮按下。
  • 注意我用注意标记的部分。
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0X0C
scoreOfLocalTeam
scoreOfVisitorTeam
ENDC
        ORG 0
    bsf     STATUS,RP0
    movlw   0x00
    movwf   TRISB
    ; You should make sure that both pins (RA<1:0>) are configured as inputs
    bsf     TRISA,RA0 ; BTN_LOCAL input button
    bsf     TRISA,RA1 ; BTN_VISIT input button
    bcf     STATUS,RP0
    clrf    scoreOfLocalTeam
    clrf    scoreOfVisitorTeam
    clrf    PORTB

Loop
    ; Check inputs: you should check the both inputs. But in your code,
    ; you check only for the LOCAL button
    btfss   PORTA,RA0
    goto    IncrementLocalScore ; Local button press detected, go and increment local count
    btfss   PORTA,RA1
    goto    IncrementVisitorScore ; Visit button press detected, go and increment visit count
    goto    Loop ; No button press detected, keep checking

IncrementLocalScore
    incf    scoreOfLocalTeam,F
    movlw   .10
    xorwf   scoreOfLocalTeam,W ; Does local count reach to 10?
    btfsc   STATUS,Z
    clrf    scoreOfLocalTeam ; Yes, reset the local count
    ; Update the local 7 segment digit
    movlw   0xF0 ; Clear the low nibble but don't touch the high nibble
    andwf   PORTB,F
    movf    scoreOfLocalTeam,W
    andlw   0xF ; Low nibble only (mask)
    iorwf   PORTB,F ; output the local count through PORTB
    btfss   PORTA,RA0 ; Wait for button release
    goto    $-1
    goto    Loop ; Keep checking the buttons

IncrementVisitorScore
    incf    scoreOfVisitorTeam,F
    movlw   .10
    xorwf   scoreOfVisitorTeam,W ; Does local count reach to 10?
    btfsc   STATUS,Z
    clrf    scoreOfVisitorTeam ; Yes, reset the local count
    ; Update the local 7 segment digit
    movlw   0xF ; Clear the high nibble but don't touch the low nibble
    andwf   PORTB,F
    ; Attention here!!!
    ; Since the visit display is controlled by the high nibble of PORTB,
    ; we need to swap the nibbles of the scoreOfVisitorTeam variable but without
    ; affecting its value. That's why the result of swap command will be
    ; saved in W register.
    swapf   scoreOfVisitorTeam,W ; IMPORTANT! Save the result to the W register
    andlw   0xF0 ; Hİgh nibble only (mask)
    iorwf   PORTB,F ; output the local count through PORTB
    btfss   PORTA,RA1 ; Wait for button release
    goto    $-1
    goto    Loop ; Keep checking the buttons

    END

字符串
PS:代码没有测试,因为它是微控制器特定的。所以我想听听你的反馈,它是否工作。

相关问题