Captar tecla

xila_00
21 de Noviembre del 2003
Me gustaria que alguien me ayudase con el tema de captar una tecla. Normalmente se utiliza
Mov ah,1
int 21h

Me gustaria saber si existe otro modo, para que al pulsar la tecla no aparezca en pantalla,es decir, que tome el valor de la tecla pulsada pero que no lo visualice en pantalla.

Muchisimas gracias!!!

Cat
21 de Noviembre del 2003
hola amigo es facil
getch() te capta las teclas sin mostrarla ej:
op=getch();//ahi guardas la tecla que capto para despues si quieres póder verla enseñando la variable

Cat
21 de Noviembre del 2003
hola amigo es facil
getch() te capta las teclas sin mostrarla ej:
op=getch();//ahi guardas la tecla que capto para despues si quieres póder verla enseñando la variable,esa variable te puede ayudar para q puedas mover las flechas direccionales o cuando quieres salir de un programa y dice precione cualquier teccla para salir haces un getch() y validas para q salga

Yoel Ocmin
21 de Noviembre del 2003
Puedes usa los servicios '7' y '8' tambien de la Int 21h
Ambas se parecen y te permiten capturar la tecla sin eco (No se muestra en Pantalla) , yo lo uso cuando pongo menus, y no quiero que aparesca la tecla que pulso, sino que directamente entre a la Opcion.
en ambos casos, te devuelve en AL, el codigo Ascii
de la tecla que pulsas
Su sintaxis es igual que para el servicio '1'
Mov ah,7; u 8
int 21h


Otra es usarel servicio 0 de la Int 16h
aqui , te devuelve:
AH=Scan Code del Teclado
AL=Codigo Ascii

Su sintaxis :
MOv ah,0
Int 16H

felipe
21 de Noviembre del 2003
te envio un programa completo que te permite apreciar que tecla presionaste en la pantalla, espero lo analisis y te sea de utilidad.


.MODEL SMALL


.DATA

ORDEN DB 'POR FAVOR PULSA UNA TECLA... $ '
DESPL DB 'PULSASTE LA TECLA: ',"$"
REG DB ?
REG1 DB ?

.CODE

;PROGRAMA PRINCIPAL

TECLEA PROC NEAR
MOV AX,@DATA ; INICIALIZACION DEL SEGMENTO
MOV DS,AX ; MOVIMIENTO DE REGISTRO
CALL LIMPIA ; LIMPIAR PANTALLA
CALL POSIC
MOV DX,OFFSET ORDEN
MOV AH,09H
INT 21H
CALL LEE
CALL POSIC1
MOV DX, OFFSET DESPL
MOV AH,09H
INT 21H
CALL ESCRIBE
MOV AH,4CH
INT 21H
TECLEA ENDP

LEE PROC NEAR
MOV AH,10H
INT 16H

CMP AH,3BH
JE UNO
JMP FALSO1
UNO: JMP CAMB1

FALSO1:
CMP AH,3CH
JE DOS
JMP FALSO2
DOS: JMP CAMB2


FALSO2:
CMP AH,3DH
JE TRES
JMP FALSO3
TRES: JMP CAMB3


FALSO3:
CMP AH,3EH
JE CUATRO
JMP FALSO4
CUATRO: JMP CAMB4


FALSO4:
CMP AH,3FH
JE CINCO
JMP FALSO5
CINCO: JMP CAMB5

FALSO5:
CMP AH,40H
JE SEIS
JMP FALSO6
SEIS: JMP CAMB6


FALSO6:
CMP AH,41H
JE SIETE
JMP FALSO7
SIETE: JMP CAMB7


FALSO7:
CMP AH,42H
JE OCHO
JMP FALSO8
OCHO: JMP CAMB8


FALSO8:
CMP AH,43H
JE NUEVE
JMP FALSO9
NUEVE: JMP CAMB9


FALSO9:
CMP AH,44H
JE DIEZ
JMP FALS10
DIEZ: JMP CAMBA


FALS10:
CMP AH,45H
JE ONCE
JMP FALS11
ONCE: JMP CAMBB


FALS11:
CMP AH,85H
JE DOCE
JMP FALS12
DOCE: JMP CAMBC


FALS12:
CMP AH,86H
JE TRECE
JMP FALS13
TRECE: JMP CAMBD


FALS13:
CMP AH,01H
JE CATORCE
JMP FALS14
CATORCE: JMP ESCAPE


FALS14:
CMP AH,0EH
JE QUNCE
JMP FALS15
QUNCE: JMP BACKS


FALS15:
CMP AH,0FH
JE DIESEIS
JMP FALS16
DIESEIS: JMP TAB


FALS16:
CMP AH,1CH
JE DIESIET
JMP FALS17
DIESIET: JMP ENT


FALS17:
CMP AH,2FH
JE DIESOCH
JMP FALS18
DIESOCH: JMP SLASH


FALS18:
CMP AH,47H
JE DIESNUE
JMP FALS19
DIESNUE: JMP INICIO


FALS19:
CMP AH,4FH
JE VEINTE
JMP FALS20
VEINTE: JMP FIN


FALS20:
CMP AH,49H
JE VEINTUN
JMP FALS21
VEINTUN: JMP PAGEUP


FALS21:
CMP AH,51H
JE VEINDOS
JMP FALS22
VEINDOS: JMP PAGEDN


FALS22:
CMP AH,50H
JE VEINTRE
JMP FALS23
VEINTRE: JMP DOWNA


FALS23:
CMP AH,4BH
JE VEINCUA
JMP FALS24
VEINCUA: JMP LEFTA


FALS24:
CMP AH,4DH
JE VEINCIN
JMP FALS25
VEINCIN: JMP RIGHTA


FALS25:
CMP AH,48H
JE VEINSEI
JMP FALS26
VEINSEI: JMP UPA


FALS26:
CMP AH,52H
JE VEINSIE
JMP FALS27
VEINSIE: JMP INS1


FALS27:
CMP AH,53H
JE VEINOCH
JMP FALS28
VEINOCH: JMP DEL

FALS28:
CMP AH,1DH
JE VEINOCH
JMP FALS29
VEINNUE: JMP CTRL




FALS29:
JMP SINCAM

CAMB1: MOV AL,31H
JMP CAMBF

CAMB2: MOV AL,32H
JMP CAMBF

CAMB3: MOV AL,33H
JMP CAMBF

CAMB4: MOV AL,34H
JMP CAMBF

CAMB5: MOV AL,35H
JMP CAMBF

CAMB6: MOV AL,36H
JMP CAMBF

CAMB7: MOV AL,37H
JMP CAMBF

CAMB8: MOV AL,38H
JMP CAMBF

CAMB9: MOV AL,39H
JMP CAMBF

CAMBA: MOV AL,41H
JMP CAMBF

CAMBB: MOV AL,42H
JMP CAMBF

CAMBC: MOV AL,43H
JMP CAMBF

CAMBD: MOV AL,44H
JMP CAMBF

ESCAPE: MOV AL,53H
JMP CAMBES

BACKS: MOV AL,41H
JMP CAMBBA

TAB: MOV AL,54H
JMP CAMBTA

ENT: MOV AL,4EH
JMP CAMBEN

SLASH: MOV AL,4CH
JMP CAMBSL

INICIO: MOV AL,4EH
JMP CAMBINC

FIN: MOV AL,49H
JMP CAMBFI

PAGEUP: MOV AL,55H
JMP CAMBPU

PAGEDN: MOV AL,44H
JMP CAMBPD

DOWNA: MOV AL,41H
JMP CAMBDA

LEFTA: MOV AL,41H
JMP CAMBLA

RIGHTA: MOV AL,41H
JMP CAMBRA

UPA: MOV AL,41H
JMP CAMBUA

INS1: MOV AL,4EH
JMP CAMBINS

DEL: MOV AL,45H
JMP CAMBDEL

CTRL: MOV AL,54H
JMP CAMBCTRL




CAMBES: MOV REG1,45H
MOV REG,AL
JMP FINP

CAMBBA: MOV REG1,41H
MOV REG,AL
JMP FINP

CAMBTA: MOV REG1,54H
MOV REG,AL
JMP FINP

CAMBEN: MOV REG1,45H
MOV REG,AL
JMP FINP

CAMBSL: MOV REG1,53H
MOV REG,AL
JMP FINP

CAMBINC: MOV REG1,49H
MOV REG,AL
JMP FINP

CAMBFI: MOV REG1,46H
MOV REG,AL
JMP FINP

CAMBPU: MOV REG1,50H
MOV REG,AL
JMP FINP

CAMBPD: MOV REG1,50H
MOV REG,AL
JMP FINP

CAMBDA: MOV REG1,44H
MOV REG,AL
JMP FINP

CAMBLA: MOV REG1,4CH
MOV REG,AL
JMP FINP

CAMBRA: MOV REG1,52H
MOV REG,AL
JMP FINP

CAMBUA: MOV REG1,55H
MOV REG,AL
JMP FINP

CAMBINS: MOV REG1,49H
MOV REG,AL
JMP FINP

CAMBDEL: MOV REG1,44H
MOV REG,AL
JMP FINP

CAMBCTRL: MOV REG1,43H
MOV REG,AL
JMP FINP


SINCAM: MOV REG1,20H
MOV REG,AL
JMP FINP


CAMBF PROC NEAR
MOV REG1,46H
MOV REG,AL
JMP FINP
CAMBF ENDP

FINP: RET
LEE ENDP

ESCRIBE PROC NEAR
MOV AH,0AH
MOV AL,REG1
MOV CX,1
INT 10H
CALL POSIC2
MOV AH,0AH
MOV AL,REG
MOV CX,1
INT 10H
RET
ESCRIBE ENDP


LIMPIA PROC NEAR
MOV AX,0600H
MOV BX,1A00H
MOV CX,0000
MOV DX,184FH
INT 10H
RET
LIMPIA ENDP

POSIC PROC NEAR
MOV AH,02H
MOV BH,00H
MOV DX,0606H
INT 10H
RET
POSIC ENDP

POSIC1 PROC NEAR
MOV AH,02H
MOV BH,00H
MOV DX,0907H
INT 10H
RET
POSIC1 ENDP

POSIC2 PROC NEAR
MOV AH,02H
MOV BH,00H
MOV DX,091CH
INT 10H
RET
POSIC2 ENDP

.STACK

END TECLEA

olshanski
21 de Noviembre del 2003
Pues hay algún servicio que no implica eco en pantalla. En la 21h no me acuerdo, pero en la 10h (la de la bios, seguro que sí). Documéntate si eso, que no tengo nada por aquí.
También puedes cazar la tecla haciendo una subrutina y cargándola en el vector de interrupciones, pero con eso obtendrías el código de rastreo del teclado y tendrías que crear una tabla para sacar su código ASCII, que supongo que es lo que necesitas.
Esto último es mucho follón y no vale la pena a menos que lo quieras para algo interactivo a tiempo real, tipo videojuego.
Si lo necesitas para cosas del tipo: "introduzca una letra" o algo así.
La int 21h es maja porque te lo dan todo mascado, pero creo que no conviene acostumbrarse mucho. Personalmente, prefiero utilizar los servicios de la bios en vez de los del DOS.
Hala, que vaya bien; y suerta
Olshanski