2302_78267793 2023-12-07 10:09 采纳率: 40%
浏览 4
已结题

汇编怎么还可以隔两位数动态显示横杠呢

题目如图所示,怎么利用汇编语言显示横杆以及隔两位数呢,动态显示可以共阴极数码管,我只会显示凑在一起的,这个分开中间🈶️横杠怎么弄,在线指点

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-07 12:09
    关注

    【以下回答由 GPT 生成】

    我可以为您提供一个思路来实现这个功能。

    首先,您需要了解ARM汇编中的定时器和数码管的显示。然后,您可以按照以下步骤进行操作。

    1. 定义一个计数变量,用于记录当前的秒数。
    2. 初始化定时器0为方式1,设置计数初值为12e4,以便在12MHz的频率下产生1秒的延迟。
    3. 开启定时器0的中断,并启用全局中断。
    4. 创建一个中断处理程序,在中断处理程序中进行数字和横杠的显示。
    5. 在中断处理程序中,使用数字转换函数将计数值转换为字符串,并在所需位置显示数字和横杠。
    6. 每次中断时,增加计数变量的值。
    7. 在主循环中什么都不需要做,因为所有的显示操作都在中断处理程序中完成。

    下面是一个示例代码(汇编语言):

    ORG 0100H
    
    ; 定义变量
    COUNT EQU 30H  ; 计数变量
    
    MAIN:
      ; 初始化串口和DAC
      CLRES                      ; 关闭串口中断使用查询方式控制收发
      ACALL INIT_UART
      MOV R0, #0FEH              ; 数字到模拟转换器(DAC)地址
    
      ; 初始化定时器0
      MOV TMOD, #01H             ; 设置定时器0为方式1
      MOV TL0, #78H              ; 设置定时器0的低字节初值
      MOV TH0, #0ECH             ; 设置定时器0的高字节初值
      SETB TR0                   ; 启动定时器0
      SETB ET0                   ; 允许定时器0中断
      SETB EA                    ; 允许全局中断
    
    BLOOP1:  
      SJMP BLOOP1
    
    ; 定时器0中断处理程序
    INTERRUPT_TIMER0:
      PUSH ACC
      PUSH DPL
      PUSH DPH
    
      ; 增加计数变量的值
      INC COUNT
    
      ; 显示数字和横杠
      MOV A, COUNT
      ACALL DISPLAY_NUMBER
    
      POP DPH
      POP DPL
      POP ACC
      RETI
    
    ; 数字和横杠的显示函数
    DISPLAY_NUMBER:
      PUSH ACC
      PUSH DPL
      PUSH DPH
    
      ; 转换数字为字符串
      MOV DPH, #0
      MOV DPL, #COUNT
      MOV B, #3  ; 位数
      CALL BCD_TO_STRING
    
      ; 在显示区域设置数字和横杠位置
      MOV A, ' '  ; 空格
      ACALL SET_DISPLAY_POSITION
      INC DPL     ; 下一个数字的位置
      JMP DISPLAY_NUMBER_LOOP
    
    DISPLAY_NUMBER_LOOP:
      MOV A, @DPL
      INC DPL
      CJNE A, '#', DISPLAY_NUMBER_LOOP  ; '#'表示字符串结束
    
      ; 显示横杠
      MOV A, '-'
      ACALL SET_DISPLAY_POSITION
    
      POP DPH
      POP DPL
      POP ACC
      RET
    
    ; 设置显示位置
    SET_DISPLAY_POSITION:
      MOVX @R0, A     ; 数字量D/A转换器
      RET
    
    ; 初始化UART
    INIT_UART:
      ; 初始化串口
      ; 设置波特率为96008位数据无校验位1位停止位
      MOV SCON, #50H
    
      ; 设置定时器1为方式2为串口通信提供波特率发生器
      MOV TMOD, #20H
    
      ; 设置定时器1的初始值
      MOV TH1, #-6          ; -12MHz / 32 / (-6)  9600
    
      ; 启动定时器1
      SETB TR1
    
      ; 等待波特率发生器稳定
    WAIT_UART_STABLE:
      JNB TF1, WAIT_UART_STABLE
      CLR TF1
    
      ; 设置中断优先级
      SETB IP.1
    
      ; 打开串口中断
      SETB ES
    
      RET
    
    ; BC转字符串
    ; 输入DPH - 高位BCDDPL - 低位BCDB - 字符串长度A - 字符内容
    BCD_TO_STRING:
      MOV C, #4     ; 4个BCD位
    CONVERT_LOOP:
      MOV A, DPH
      ACALL BCD_TO_ASCII
      MOV @R0, A
      ADD A, #'0'
      INC DPL
      ACALL SET_DISPLAY_POSITION  ; 显示数字
      MOV A, '-'
      ACALL SET_DISPLAY_POSITION  ; 显示横杠
      INC DPL
      INC DP
      JB DP.4, SKIP
      MOV A, ' '
      ACALL SET_DISPLAY_POSITION  ; 显示空格
    SKIP:
    
      DJNZ C, CONVERT_LOOP
    
      RET
    
    ; BCD转ASCII码
    ; 输入A - BCD数据
    BCD_TO_ASCII:
      PUSH ACC
      ADD A, #3AH  ; BCD -> ASCII
      DA A
      POP ACC
      RET
    
    END
    

    此代码示例假设您的数码管显示函数、BCD转字符串函数等都已经实现,您只需要根据您的具体显示方式进行相应的修改。

    请注意:上述代码仅为示例,需要根据您的实际硬件情况进行适当的修改和调试。此外,这仅仅是给出了一个实现思路,如果您面对其他问题,可以在下面的回答中提出,我会尽力帮助您。希望对您有所帮助!



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 12月7日