【问题标题】:Change the color with the user option使用用户选项更改颜色
【发布时间】:2020-06-27 15:20:46
【问题描述】:

我正在使用程序集 emu8086 在我的项目中工作,并且我做了很多事情: 现在我正在努力放置用户选择的选项。我想使用用户选项将 LED 颜色从(0-7)更改,我已经做了很多事情我只是不明白我将如何更改颜色,如果用户选择 1 两个正方形( leds) 需要更改为蓝色,对于所有颜色,我需要验证用户选项。

这是我的代码:

title    ac-cores-mov-cursor.asm - desenha poligno colorido em modo texto
         org  100h           ; directiva para definição do enderço da 1ª instrução
; definição de constantes     

inicio:  jmp  princ          ; etiqueta e instrução de 'salto' para procedimento
  


;____________________Menu_cores___________________________
menucores    db   '1 black',0ah,0Dh
         db   '2 blue',0ah,0Dh
         db   '3 green',0ah,0Dh
         db   '4 cyan ',0ah,0Dh
         db   '5 red',0ah,0Dh
         db   '6 magenta',0ah,0Dh
         db   '7 brown',0ah,0Dh
         db   '8 light gray',0ah,0Dh  
         db "Please select a choice(1-8):",13,10,   '$'    
                                                   
                                                   
                                                   
                                                   
menu    db  '1 Todos os leds ligados',0ah,0Dh        ;leva ao menu cores para escolher a cor 
        db  '2 Combinaçao(0,2,4,6)',0ah,0Dh          ;leva ao menu cores para escolher a cor dos leds 0 2 4 6 
        db  '3 Combinaçao(1,3,5,7)',0ah,0Dh          ;leva ao menu cores para escolher a cor dos leds 1 3 5 7
        db "Please select a choice(1-8):",13,10,   '$'  
         
         
;____________________Menu_principal___________________________         
menuprincipal db   '1 Todos os leds desligados',0ah,0Dh   ; retorna os leds todos com a cor preta
              db   '2 Cor dos leds ',0ah,0Dh               ; leva para o menu cores
              db "Please select a choice(1-2):",13,10,   '$'      ;opçao escolhida
                                
                                
         
; definição de variáveis            
         
esqlin   db   15            ; linha do vértice superior esquerdo
esqcol   db   10              ; coluna do vértice superior esquerdo  


largura  db   2             ; largura do fundo
altura   db   2              ; altura do fundo   

texlin   db   17             ; linha do texto
texcol   db   12              ; coluna do texto 
colincio db   2
 
enter    db   0Ah,0Dh,'$'
fundo    db   'Cor fundo (0-9,A-F) ', '$'
texto    db   'Cor texto (0-9,A-F) ', '$'
corfund  db   0              ; 0-15 (decimal), 0-F (hexadecimal)
cortext  db   4             ; 0-15 (decimal), 0-F (hexadecimal)
frase1    db   'LED1', '$'  
corft    db   0Fh    

 



;___________________________START___________________________
verificacao:



princ    proc near           ; início do procedimento principal
         lea  dx, menucores      ; escrever string
         mov  ah, 09h 
         int  21h         
                  
                  
; define cor do texto e cor do fundo do ecrã         
         mov  corft, 24h  
         mov  bh, corft

         

                
         mov  ch, esqlin     ; vértice superior esquerdo - linha
         mov  cl, esqcol     ; vértice superior esquerdo - coluna
         mov  dh, esqlin         
         add  dh, altura     ; vértice inferior direito - linha 
         dec  dh
         mov  dl, esqcol     
         add  dl, largura    ; vértice inferior direito - coluna
         dec  dl 
         mov  ah, 06h         
         int  10h
                    
             

                

                     
                     
; instruções para terminar o programa
         mov  ax, 4c00h
         int  21h

princ    endp           ; fim do procedimento principal

; define cor do texto e cor do fundo do ecrã         
         mov  bh, 218        ; 218(16*13+10) = DAh: D - cor fundo, A - cor texto
         mov  al, 01h        ; nº linhas scroll
         mov  ch, 0          ; vértice superior esquerdo - linha
         mov  cl, 0          ; vértice superior esquerdo - coluna
         mov  dh, 0          ; vértice inferior direito - linha
         mov  dl, 46         ; vértice inferior direito - coluna
         mov  ah, 06h        ; scroll uma linha (al)=1
         int  10h

         mov  al, corfund
         mov  bh, 16         ; 16 = 2^4
         mov  ah, 0
         mul  bh             ; 16*corfund
         add  al, cortext    ; = corfund*16 + cortext

【问题讨论】:

  • 这取决于您如何进行输出。通常在 DOS 时代,每个字符有两个字节。一个用于 ASCII,一个用于颜色。示例:您将 ASCII 放入 AL,将颜色放入 BL,然后调用 INT10h。见en.wikipedia.org/wiki/INT_10H。如果您需要更精确,请提供相关代码 - 以便我们了解您的输出效果。
  • 这是我的代码:we.tl/t-PRvhRsq3Sr 正在做一个绿色方块,我的目标是在同一行中做 7 个这样的方块(LED),只增加列,因为我正在考虑执行 7* 我的变量以在列中使用不同的数字,但这是一个庞大的代码,所以我想找到一种更好的方法来在同一行中执行这 7 个 LED。
  • "terminar o programa":我不懂西班牙语,但下面的两行告诉我这一定是“退出程序”的意思。这可能是您面临的实际问题:我认为您的试用代码没有被执行。首先看你跳入程序(就在开始处,第3行)通过dos输出菜单,然后你实际设置颜色但然后退出。我认为剩下的永远不会被执行,我认为它甚至不会以错误的颜色打印文本 led1 - 它根本不会打印它。要么将你的代码移动到 proc 中,要么在 proc 之后跳转并调用它进行输出并将 exit 放入 main

标签: assembly x86-16 emu8086


【解决方案1】:

我需要验证用户选项。

要求用户按下一个键并验证它是否有效。

Again:
    mov ah, 00h    ; BIOS.GetKeyboardKey
    int 16h        ; -> AX
    cmp al, "0"
    jb  Again
    cmp al, "7"
    ja  Again

这里用户从 0 到 7 进行了有效选择。现在将此选择转换为背景颜色。记住输入仍然是一个字符!转换完成后,将其放入要用于输出到屏幕的属性字节的高半字节。

    sub al, "0"    ; Convert from character to value (*)
    mov cl, 4
    shl al, cl     ; Shift into high nibble (background color)
    add al, 15     ; Add in low nibble (foreground color)
    mov bh, al

您的屏幕截图使用红色文本颜色,但如果用户选择红色背景颜色,这会使文本消失。这就是为什么我建议您使用 BrightWhite (15) 作为前景色。
(*) 在这种特殊情况下可以省略(因为后面的左移)

我想使用用户选项将 LED 颜色从 (0-7) 更改,

通常的方法是使用BH 寄存器中设置的属性简单地重新绘制整个彩色图块。

首先使用 BIOS.ScrollWindowUp AL=0 清除磁贴!

    FirstButtonCol    db 10
    FirstButtonRow    db 15
    FirstButtonWidth  db 10
    FirstButtonHeight db 3
    frase1            db 'LED1', '$'

    ...

    mov  ch, FirstButtonRow
    mov  cl, FirstButtonCol
    mov  dh, ch
    add  dh, FirstButtonHeight
    dec  dh
    mov  dl, cl
    add  dl, FirstButtonWidth
    dec  dl 
    mov  ax, 0600h     ; BIOS.ScrollWindowUp AL=0
    int  10h

然后将光标放在按钮上并写下标签“LED1”

    lea  si, [frase1]
    mov  cx, 1         ; ReplicationCount
    mov  bh, 0         ; DisplayPage
    mov  dl, FirstButtonCol
    mov  dh, FirstButtonRow
    add  dx, 0102h
NextChar:
    mov  ah, 02h       ; BIOS.SetCursor
    int  10h
    mov  al, [si]
    mov  ah, 0Ah       ; BIOS.WriteCharacter
    int  10h
    inc  dl            ; Next column
    inc  si            ; Next char
    cmp  byte [si], "$"
    jne  NextChar

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2018-08-14
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多